중급 예제

약간은 익숙하시거나 익숙해지셨나요? 그렇다면 조금더 깊이 다뤄볼까요?

터치 스크린(Touch Screen)

2014-10-14 09:59:05

개요


터치스크린은 손가락이나 스타일러스를 이용하여 모니터를 터치하는 포인팅 디바이스로 감압식과 정전식, 적외선식으로 크게 나뉩니다.
조작이 쉽고 단순하기 때문에 요즘 나오는 스마트 제품에는 대부분 터치스크린이 사용됩니다.




요즘 출시되는 스마트폰이나 키오스크, 태블릿pc는 감압식보다 발전된 정전식을 사용하거나 두 종료를 같이 사용하고 있습니다. 



이번 튜토리얼에서는 닌텐도 터치스크린을 사용하여 간단하게 구역을 나누어 구역별로 특정값을 출력하는 예제를 만들어 실행해보겠습니다. 

닌텐도DS 터치스크린은 감압식을 사용하며 스크린사이의 돌기를 손가락이나 펜으로 누르게 되면 눌려진 좌표를 전송하게 됩니다.

감압식이라 보니 표면적이 큰 손가락보단 끝이 뾰족한 펜으로 누르는것이 좀 더 정밀한 좌표값을 구하는데 용이합니다.



 

동영상

 

 

 

부품 목록

NO 부품명 수량
1 오렌지 보드 1
2 브레드 보드 1
3 Nintendo DS_touch_connector 1
4 Nintendo DS touch Screen 1
5 점퍼 케이블 4

 

부품명 오렌지 보드 브레드 보드 Nintendo DS_touch_connector Nintendo DS touch Screen 점퍼케이블
부품

 

 

 

하드웨어 making

 

 

 

 

전자 회로도




연결할때 커넥터의 검정부분을 앞으로 잡아당기면 열린다. 그 다음에 터치스크린을 연결하고 닫아주면 됩니다.


출처 : http://www.hobbytronics.co.uk/


패널을 사용할때는 다음과 같이 뒤집어서 선을 꼬아서 사용한다. 케이블이 빠지거나 끊어지지 않게 주의합니다.


출처 : http://bildr.org/

 

 

 

 

소프트웨어 coding

#define xLow  17
#define xHigh 15
#define yLow  16
#define yHigh 14

int x,y;
 
void setup() {
	//시리얼 통신 초기화
	Serial.begin(9600);
}
 
void loop() {
	x = readX(); // x좌표를 읽어들인다.
	y = readY(); // y좌표를 읽어들인다.
	
	//지정한 범위 안에 들어오는 좌표값만들 유효값으로 사용한다.
	if (x > 70 && x < 950 && y > 140 && y < 850) { 
		//1번구역
		if (x < 425 && y < 425) {
			Serial.println(" Click 1111111111111");
			
		//2번구역
		} else if (x < 850 && y < 425) {
			Serial.println(" Click 2222222222222");
			
		//3번구역
		} else if (x < 425 && y < 850) {
			Serial.println(" Click 3333333333333");
			
		//4번구역
		} else if(x < 850 && y < 850) {
			Serial.println(" Click 4444444444444");
		}
	}
	delay(10);
}

//x좌표를 읽는 함수
int readX() {
	pinMode(xLow,OUTPUT);
	pinMode(xHigh,OUTPUT);
	digitalWrite(xLow,LOW);
	digitalWrite(xHigh,HIGH);
	
	digitalWrite(yLow,LOW);
	digitalWrite(yHigh,LOW);
	
	pinMode(yLow,INPUT);
	pinMode(yHigh,INPUT);
	delay(10);
	
	//xLow has analog port -14 !!
	int x=analogRead(yLow -14);
	return x;
}

//y좌표를 읽는 함수
int readY() {
	pinMode(yLow,OUTPUT);
	pinMode(yHigh,OUTPUT);
	digitalWrite(yLow,LOW);
	digitalWrite(yHigh,HIGH);
	
	digitalWrite(xLow,LOW);
	digitalWrite(xHigh,LOW);
	
	pinMode(xLow,INPUT);
	pinMode(xHigh,INPUT);
	delay(10);
	
	//xLow has analog port -14 !!
	int y=analogRead(xLow - 14);
	return y;
}

 

 


스케치에서는 readX()와 readY()함수를 사용하여 DS touchScreen에 입력한 좌표값을 구하고 터치스크린을 4등분하여 각 구역마다 특정값을 시리얼 모니터에 출력할 수 있게 한다.
아두이노는 loop()를 통해 계속적으로 x좌표와 y좌표의 값을 읽어 들이기 때문에 스크린을 터치하지 않더라도 좌표값을 읽어오게 된다. 하지만 이때 읽어오는 값은 터치스크린을 통해 구할 수 없는 좌표 범위 이상의 값이기 때문에 터치스크린의 각 꼭지점 좌표값을 구하여 그 좌표 안의 들어오는 값만을 유효값으로 하여 값을 읽는다.

 

kocoafabeditor

항상 진취적이고, 새로운 것을 추구하는 코코아팹 에디터입니다!

터치스크린, 아두이노, 오렌지보드

cybernetic 2017-07-04 13:08:32

실례지만 저 터치스크린의 커넥터는 터치스크린마다 규격이 다 동일한 것인가요?
커다란 터치스크린이 필요한데 기존의 아두이노에는 작은 터치스크린밖에 없어서 고민중입니다.

http://www.devicemart.co.kr/1273487#
라즈베리파이용 이 제품을 혹시 위에서 소개해주신 커넥터와 연결해서 아두이노로 사용이 가능한지 질문드리고 싶습니다.

꼭 제가 언급한 제품이 아니더라도 아두이노와 연결해서 사용할 수 있는 커다란 사이즈의 터치스크린이 있다면 알려주시면 정말 감사드리겠습니다. :)

kocoafab 2019-02-08 14:37:00

아두이노 우노에서는 안되지만 메가나 듀에 용으로 나온 쉴드형태 7인치 터치스크린이 있습니다.

https://www.buydisplay.com/default/7-inch-arduino-touch-screen-shield-ssd1963-library-for-mega-due

국내에선 파는곳을 찾아보기 힘드네요... 우선 확인만 해보시면 좋을 것 같습니다.