요술고양이의 Digital Life

 
 터치스크린에는 여러 방식이 있습니다. 그 중 보통 값싸고 자주 쓰이는 터치스크린 방식은 저항막 방식입니다.
대부분 4선을 많이 쓰기 때문에 보통 4선 저항막 터치 스크린이라고 많이 불립니다.
 
 일반적으로 컨트롤 IC(TSC2003이나 ADS7846 또는 ADS7843)를 사용하면 간편하게 쓸 수 있지만.. 우리는 간단하게 ADC와 TR을 이용해보도록 하겠습니다. 회로는 지니의 LCD 갖구놀기의 dk_sentec(네이버 아이디)님께서 제공해주신 회로도를 바탕으로 원래는 C1815 자리에 N-채널 FET가 있었지만.. 저는 간편하게 흔히 구할 수 있는 범용 NPN, PNP TR로 구성해 보았습니다.
 
 그 대신 dk_sentec님께서 제공해주신 정보로는 FET대신 일반 TR사용시 ADC 입력값이 약 0.5V정도 작아진다고 하였습니다. 그로 인해  감도가 떨어질 수 있으니 유의 하시길 바랍니다.
 
 
 먼저 회로도 보시고 저항막 터치 스크린에 대해 간단히 설명드리겠습니다.



 위 그림은 제가 구성한 위에는 회로도 입니다. OrCAD Student 버젼으로 LCD도 비스무리 하게 그려봤습니다.
그리고 아래의 저항막 스크린에 대한 자료 및 그림은 마이크로소프트웨어 2006년 3월호에 연재 된 기사를 참고로 쓰고 그렸음을 먼저 밝힙니다. 

 4선 저항막 터치 스크린은 아래 첫 번째 그림과 같이 X(+), Y(+) 또는 XP, YP 그리고 X(-), Y(-) 또는 XM, YM 으로 4선의 핀으로 구성되어 있습니다. X 축과 Y축은 떨어져 있는 상태이며.. 만약 특정 영역에 압력을 가하게 될 경우 X축 저항과 Y축 저항은 맞닿게 되어.. 두 번째 그림과 같이.. 등가 회로가 형성됩니다.



이렇게 형성되기 위해서는 + 쪽에는 VCC를 - 쪽에는 GND를 연결해주며.. 중간에 눌린 위치로 전압이 흘러 들어 오면.. 이것을 ADC로 캐치하게 됩니다. 

# X 값과 Y 값을 가져오기 위해선 아래와 같은 절차를 다릅니다.

 그전에 맨위의 회로도를 보시면 X(+)에 해당하는 것을 X2 핀에 연결하고.. X(-)에 해당하는 것을 X1에 연결하였는데.. LCD에는 어느 핀이 X+ 인지 X-인지 나와있지 않아서 임의로 연결했습니다. 그러나 저항이기 때문에 방향성이 없기 때문에.. 큰 상관은 없으며.. 테스트 시 별다른 특이사항 없이 잘 동작함을 확인하였습니다.

혹시 잘 못 되었다면.. 단순히 연결을 바꾸어 주시면 됩니다.

 그럼  먼저 X 좌표 ADC 값을 얻기 위해서..

(1) X(+)(현재 X2 핀)에 VCC 전압을 인가합니다. 위의 회로도의 경우는 왼쪽의 X2에 VCC가 들어갈 수 있도록 맨 왼쪽의 PIN0을 LOW로 만들어 줍니다.

(2) X(-)(현재 X1 핀)의 경우에는 GND로 만들어 주기 위해 PIN2를 HIGH로 해줍니다. 그 다음엔 Y(+)(현재 Y2 핀, ADC Channel 1)에서 ADC를 읽습니다. 단, Y(-)(현재 Y1 핀)에는 아무것도 연결 하지 않습니다. 그렇기 때문에 PIN3은 LOW를 유지합니다.

 요렇게 하면 X 좌표 ADC 값을 얻게 되는 것이고.. Y좌표는 단순히 그 반대로 해주시면 됩니다.

그럼 간단히 소스로 설명을 드리자면..
PORTB의 하위 4비트를 X+, Y+, X-, Y- 로 설정하였고..
ADC는 PORTA의 0번 핀과 1번 핀을 각각 Channel 0과 Channel 1로 보았습니다.

먼저 포트B를 출력하여 X좌표를 얻을 수 있도록 합니다.

 # CCS-C 컴파일러

  portb = 0b00000110;      // xp = 0, yp = 1, xm = 1, ym = 0;
  set_adc_channel(1);    // X 좌표 값 ADC 채널 설정
  delay_ms(1);              // 채널 변환 시 간혹 값이 튀는 것을 위한 딜레이
  x = read_adc();           // 해당 ADC 채널에서 값을 읽어온다.

  portb = 0b00001001;      // xp = 1, yp = 0, xm = 0, ym = 1;
  set_adc_channel(0);    // Y 좌표 값 ADC 채널 설정
  delay_ms(1);              // 채널 변환 시 간혹 값이 튀는 것을 위한 딜레이
  y = read_adc();           // 해당 ADC 채널에서 값을 읽어온다.



1

1