2014년 2월 7일 금요일

레노버 X200 Windows 8, Windows 8.1 64비트 설치시 화면깨짐문제

윈도우즈 8이 한참 프로모션일때가 있었죠
그때 동생의 구형노트북(도시바)를 수리해 주면서 Windows 8을 업그레이드 해주었는데, 생각보다 괜찮더라구요.

그래서 얼마뒤에 당시에 제가 쓰던 메인노트북인 레노버 X200을 Windows 8로 업그레이드하였습니다.

그전까지는 XP 32비트를 쓰고 있었고 큰 불편은 없는 상태였습니다.

32비트 OS에서는 메모리 문제가 아쉬웠기 때문에 1G+2G=3G였던 메모리를 1G를 4G로 바꿔서 2G+4G=6G로 바꾸었습니다.

그러고 나서 Windows 8 x64를 설치했습니다.
설치과정은 정상이었지만 아래의 사진처럼 화면이 깨지는 현상이 있었습니다.


화면이 깨지는 현상이 생기는 시점은 특별한게 없고 그냥 쓰다가 저렇게 됩니다.
깨진 부위로 마우스를 가져가면 또다시 살아나기도 합니다.
마치 지우개 같은 느낌이죠.

TPHOLIC 싸이트에서도 비슷한 문제를 겪는분들이 계셨어요.
그분은 아래와 같이 된다고 하시는군요.

그 페이지는 아래와 같습니다.
http://tpholic.com/xe/9228828

이렇게 화면이 깨지는 문제로 한달정도 한국 마이크로소프트와 한참 실갱이를 했습니다.
결국 환불을 해주겠다는 말까지 받았으나 XP로 돌아갈 생각이 없었기 때문에 32비트 버젼 Windows 8을 설치했습니다.
32비트 버젼에서는 문제가 없더군요. 대신 메모리는 XP 32비트와 마찬가지로 3G 밖에 쓸수 없습니다.
64비트 버젼에서 이 문제가 해결될 수 있도록 힘쓰겠다는 답변만 받았습니다.

우분투 64비트를 설치해보기도 했는데 우분투는 괜찮더군요.

그랬는데 한참이 지나서 Windows 8.1이 나왔더군요.
그래서 이제는 문제가 해결되어있을 것으로 기대하고 Windows 8.1 64비트를 설치했습니다.
그러나 문제는 여전했습니다.

이 문제에 대해서 웹서핑을 하던도중에 X200 기종이 메모리 문제가 있다는것을 알아냈습니다.
X200이 공식적으로 지원하는 메모리는 2G+2G=4G 까지입니다.
그러나 X200에 적용된 칩셋은 슬롯당 각각 4G 메모리를 인식하여 총 8G의 메모리를 장착할 수 있습니다.
그런데 총 4G가 넘는 메모리를 구성할때 서로 다른 2개의 슬롯의 메모리 용량 구성이 다르면 위와 같은 화면깨짐현상이 있다는 것입니다.

그에 의하면 처음에 제가 구성했던 2G+4G=6G는 문제가 있는것이죠
그래서 2G를 빼고 4G 1슬롯만으로 Windows 8.1 64비트를 설치해봤더니 정상적이었습니다.
그 상태만으로도 Windows 8.1 32비트보다 1G 더 많은 4G 메모리를 운영할 수 있었는데 상당히 도움이 많이 되었습니다.

그러다 오늘 4G메모리를 추가로 구입하여 총 8G 메모리를 장착했는데, 문제없이 잘 작동합니다.

결국 2개의 메모리 슬롯의 메모리 용량 구성이 다르면 문제가 생기는 거였습니다.

제 X200의 메모리 구성은 KINGMAX사의 DDR3-8600 1066Mhz 4G 메모리 + Silicon Power사의 DDR3-8600 1066Mhz 4G 메모리입니다.

메모리 제조사가 다른것은 영향을 주지 않는 모양입니다.

X200은 지금으로 본다면 상당히 열악한정도의 성능이지만 그래도 8G가 되니 그런대로 쓸만합니다.

X200에 64비트 OS를 설치하면서 메모리 문제로 고생하시는 분들게 도움이 되었으면 좋겠습니다.

2014년 1월 31일 금요일

아두이노 제어를 위한 라스타 RC 개조-연결 및 프로그래밍

거의 1년쯤전에 동생이 핸드폰으로 제어되는 무선조정 자동차를 만들어 보고 싶다고 해서 라스타사의 RC 자동차를 개조하여 보내주었습니다.

그랬더니 한번도 손도 안대고 있다가 할줄 모르겠다고 2014년 설날저녁에 가지고 왔어요.

저도 거의 1년만에 만지다 보니 본래 제 의도를 잘 모르겠더라구요.
할 수 없이 제가 쓴 블로그를 다시 보고 간신히 조립을 했습니다.

한 두시간정도 아두이노 개발도구를 깔고 드라이버잡고..
아두이노 UNO R3는 상당히 오래된 장치라서 아두이노 개발키트에서 드라이버 잡는것이 아주 어려웠습니다.

XP에서 아두이노 UNO R3 드라이버를 깔려면 드라이버 안에 있는 압축폴더를 풀어서 그 안에있는 INF 파일을 사용하셔야 해요..

한 두시간정도 드라이버가 안깔려서 고생을 좀 했습니다.

자세한 사진을 올리려고 했는데 동생이 그냥 가져가 버려서 중간에 찍은 사진밖에 없네요..
나중에 사진을 더 추가하겠습니다.

이것은 모터드라이버 제어선 연결입니다.


이것은 아두이노쪽의 연결이고요
왼쪽이 블루투스 RX-TX 연결 2개선이고요
오른쪽인 모터제어선 6개 입니다.


 아두이노 쪽 연결의 다른 사진입니다.


블루투스 모듈의 연결입니다.
RX-TX선 연결이고요.


블루투스 연결 앞쪽이예요. 전원을 연결했어요


모터드라이버와 모터를 연결한 사진이예요.



안드로이드 제어프로그램은 "BluCar"라는 어플을 사용했습니다.

https://play.google.com/store/apps/details?id=com.uzzors2k.blu_car&hl=ko


아두이노 프로그램 소스는 아래와 같아요.

여유가 있으면 주행 동영상을 올려볼께요.


#include <SoftwareSerial.h>

int bluetoothTx = 2;
int bluetoothRx = 3;

// Left = 0x04;
// Right = 0x08;
// Forward = 0x10;
// Backward = 0x20;
int Cmd = 0;

int DRV_EN = 13;
int DRV_FW = 12;
int DRV_BW = 11;

int WHL_EN = 8;
int WHL_LT = 10;
int WHL_RT = 9;

SoftwareSerial bluetooth(bluetoothTx, bluetoothRx);

void setup() {
  // Setup the function of arduino pins
  pinMode(DRV_EN, OUTPUT);
  pinMode(DRV_FW, OUTPUT);
  pinMode(DRV_BW, OUTPUT);
  pinMode(WHL_EN, OUTPUT);
  pinMode(WHL_LT, OUTPUT);
  pinMode(WHL_RT, OUTPUT);

  // Setup the serial port of arduino
  Serial.begin(9600);

 // Setup Bluetooth serial connecti/on to arduino
  bluetooth.begin(1200);
}

void loop() {
  if(bluetooth.available())
  {
    Cmd = bluetooth.read();
    switch(Cmd & (0x04 | 0x08))
    {
      case 0x00:
        digitalWrite(WHL_EN, LOW);
        digitalWrite(WHL_LT, LOW);
        digitalWrite(WHL_RT, LOW);
        break;
      case 0x04: // Left
        digitalWrite(WHL_EN, HIGH);
        digitalWrite(WHL_LT, HIGH);
        digitalWrite(WHL_RT, LOW);
        break;
      case 0x08: // Right
        digitalWrite(WHL_EN, HIGH);
        digitalWrite(WHL_LT, LOW);
        digitalWrite(WHL_RT, HIGH);
        break;
    }
    switch(Cmd & (0x10 | 0x20))
    {
      case 0x00:
        digitalWrite(DRV_EN, LOW);
        digitalWrite(DRV_FW, LOW);
        digitalWrite(DRV_BW, LOW);
        break;
      case 0x10: // Forward
        digitalWrite(DRV_EN, HIGH);
        digitalWrite(DRV_FW, HIGH);
        digitalWrite(DRV_BW, LOW);
        break;
      case 0x20: // Backward
        digitalWrite(DRV_EN, HIGH);
        digitalWrite(DRV_FW, LOW);
        digitalWrite(DRV_BW, HIGH);
        break;
    }
  }
}