검색
홈으로 마이페이지 주문조회 장바구니
로그인
회원정보 게시판
회사소개 이메일
도서(BOOK)
키트(KIT)
특판 상품
졸업작품&전자기초
응용모듈
전자부품
모터
기구
엔클로져
고객센터 게시판
자유게시판
MCU 통합 게시판
강좌-RaspberryPi
강좌-드론(쿼드콥터)
강좌-아두이노(기초)
강좌-아두이노(응용)
신제품/신기술 소개
DIY 공작 게시판
윤교수의 연구실 칼럼
 ☎ : 02-776-4868

 F: 02-779-6757

☞ 평일 : 09~18시
☞ 주말 : 10~13시


국민822401-04-027758
☞ 예금주 : Ohm사
국민822401-04-027761
☞ 예금주 : R&C사
 
 
1 (주)알트소프트 사이트
 
2 LabVIEW 강좌 사이트
 
3 윤교수의 마이크로프로세서 월드
 
4 전자 엔지니어
 

 

 
강좌-아두이노(응용)
 
2015. 02. 17 (10:27)
제목[아두이노 응용] 6. 2.4" TFT LCD Shield (with Touch)
작성자     파일첨부 : TFTLCD.zip 조회 : 4791

6. 2.4” TFT LCD Shield (with Touch)

 

이번 강좌에서는 2.4인치 TFT LCD Shield의 사용법에 대해서 알아 보도록 한다. 앞에서와 마찬가지로 제공되는 라이브러리를 사용하여 간단한 예제를 실행해 보도록 한다. 이 쉴드는 터치 패드가 부착된 형태로 이번 강좌에서는 TFT LCD와 터치를 동시에 다룰 수 있는 예제를 이용해 보도록 한다.

 

사실, 이 쉴드 보드와 제공된 라이브러리와 예제는 많은 에러를 가지고 있어서, 본인이 몇 군데 수정을 한 후에 사용할 수 있었다. 첨부 파일의 라이브러리와 예제는 수정된 내용이 적용된 것으로 사용하는데 문제 없을 것으로 본다.

 

TFT LCD에 대한 사양은 아래와 같다.

 

 


 

쉴드의 외형은 위와 같으며, 아두이노와 연결되는 핀맵은 아래와 같다.

 

A0

LCD_RD

A1

LCD_WR / TS_YP

A2

LCD_RS / TS_XM

A3

LCD_CS

A4

LCD_RST

D8

LCD_D0

D9

LCD_D1

D2

LCD_D2

D3

LCD_D3

D4

LCD_D4

D5

LCD_D5

D6

LCD_D6 / TS_XP

D7

LCD_D7 / TS_YM

D8

SD_SS

D9

SD_DI

D10

SD_DO

D11

SD_SCK

 

TS_XP, TS_XM, TS_YP, TS_YM은 터치 스크린 핀으로 LCD 제어 포트와 같이 사용하고 있다.

 

 

#include "TFTLCD.h"

#include "TouchScreen.h"

 

//Duemilanove/Diecimila/UNO/etc ('168 and '328 chips) microcontoller:

 

#define YP A1  // must be an analog pin, use "An" notation!

#define XM A2  // must be an analog pin, use "An" notation!

#define YM 7   // can be a digital pin

#define XP 6   // can be a digital pin

 

#define TS_MINX 150

#define TS_MINY 120

#define TS_MAXX 920

#define TS_MAXY 940

 

// For better pressure precision, we need to know the resistance

// between X+ and X- Use any multimeter to read it

// For the one we're using, its 300 ohms across the X plate

TouchScreen ts = TouchScreen(XP, YP, XM, YM, 300);

 

#define LCD_CS A3

#define LCD_CD A2

#define LCD_WR A1

#define LCD_RD A0

// optional

#define LCD_RESET A4

 

// Color definitions

#define      BLACK           0x0000

#define      BLUE            0x001F

#define      RED             0xF800

#define      GREEN           0x07E0

#define        CYAN            0x07FF

#define       MAGENTA         0xF81F

#define       YELLOW          0xFFE0

#define       WHITE           0xFFFF

 

TFTLCD tft(LCD_CS, LCD_CD, LCD_WR, LCD_RD, LCD_RESET);

 

#define BOXSIZE 40

#define PENRADIUS 3

int oldcolor, currentcolor;

 

void setup(void) {

  Serial.begin(9600);

  Serial.println("Paint!");

 

  tft.reset();

 

  /*

  uint16_t identifier = tft.readRegister(0x0);

  if (identifier == 0x9325) {

    Serial.println("Found ILI9325");

  } else if (identifier == 0x9328) {

    Serial.println("Found ILI9328");

  } else {

    Serial.print("Unknown driver chip ");

    Serial.println(identifier, HEX);

    while (1);

  }

*/

 

  tft.initDisplay();

  tft.fillScreen(BLACK);

 

  tft.fillRect(0, 0, BOXSIZE, BOXSIZE, RED);

  tft.fillRect(BOXSIZE, 0, BOXSIZE, BOXSIZE, YELLOW);

  tft.fillRect(BOXSIZE*2, 0, BOXSIZE, BOXSIZE, GREEN);

  tft.fillRect(BOXSIZE*3, 0, BOXSIZE, BOXSIZE, CYAN);

  tft.fillRect(BOXSIZE*4, 0, BOXSIZE, BOXSIZE, BLUE);

  tft.fillRect(BOXSIZE*5, 0, BOXSIZE, BOXSIZE, MAGENTA);

 

 tft.drawRect(0, 0, BOXSIZE, BOXSIZE, WHITE);

 currentcolor = RED;

 

  pinMode(13, OUTPUT);

}

 

#define MINPRESSURE 10

#define MAXPRESSURE 1000

 

void loop()

{

  digitalWrite(13, HIGH);

  Point p = ts.getPoint();

  digitalWrite(13, LOW);

 

  pinMode(XM, OUTPUT);

  pinMode(YP, OUTPUT);

 

  // we have some minimum pressure we consider 'valid'

  // pressure of 0 means no pressing!

 

  if (p.z > MINPRESSURE && p.z < MAXPRESSURE) {

  

    // turn from 0->1023 to tft.width

    p.x = tft.height() - map(p.x, TS_MINX, TS_MAXX, 0, tft.height());

    p.y = tft.width() - map(p.y, TS_MINY, TS_MAXY, 0, tft.width());

   

    Serial.print(p.x, DEC);

    Serial.print("\t");

    Serial.println(p.y, DEC);

 

    if (p.x < BOXSIZE) {

       oldcolor = currentcolor;

 

       if (p.y < BOXSIZE) {

         currentcolor = RED;

         tft.drawRect(0, 0, BOXSIZE, BOXSIZE, WHITE);

       }

       else if (p.y < BOXSIZE*2) {

         currentcolor = YELLOW;

         tft.drawRect(BOXSIZE, 0, BOXSIZE, BOXSIZE, WHITE);

       }

       else if (p.y < BOXSIZE*3) {

         currentcolor = GREEN;

         tft.drawRect(BOXSIZE*2, 0, BOXSIZE, BOXSIZE, WHITE);

       }

       else if (p.y < BOXSIZE*4) {

         currentcolor = CYAN;

         tft.drawRect(BOXSIZE*3, 0, BOXSIZE, BOXSIZE, WHITE);

       }

       else if (p.y < BOXSIZE*5) {

         currentcolor = BLUE;

         tft.drawRect(BOXSIZE*4, 0, BOXSIZE, BOXSIZE, WHITE);

       }

       else if (p.y < BOXSIZE*6) {

         currentcolor = MAGENTA;

         tft.drawRect(BOXSIZE*5, 0, BOXSIZE, BOXSIZE, WHITE);

       }

      

       if (oldcolor != currentcolor) {

          if (oldcolor == RED) tft.fillRect(0, 0, BOXSIZE, BOXSIZE, RED);

          if (oldcolor == YELLOW) tft.fillRect(BOXSIZE, 0, BOXSIZE, BOXSIZE, YELLOW);

          if (oldcolor == GREEN) tft.fillRect(BOXSIZE*2, 0, BOXSIZE, BOXSIZE, GREEN);

          if (oldcolor == CYAN) tft.fillRect(BOXSIZE*3, 0, BOXSIZE, BOXSIZE, CYAN);

          if (oldcolor == BLUE) tft.fillRect(BOXSIZE*4, 0, BOXSIZE, BOXSIZE, BLUE);

          if (oldcolor == MAGENTA) tft.fillRect(BOXSIZE*5, 0, BOXSIZE, BOXSIZE, MAGENTA);

       }

    }

    if (((p.x-PENRADIUS) > BOXSIZE) && ((p.x+PENRADIUS) < tft.height())) {

      tft.fillRect(p.y, p.x, PENRADIUS, PENRADIUS, currentcolor);

    }

  }

}

 

위 예제는, 터치 스크린과 TFT LCD의 동시 사용을 위한 예제로서, 사용자가 지정한 칼라로 임의의 위치에 점을 찍는(여기서는 3x3의 사각박스) 동작을 한다.

 

#include "TFTLCD.h"

#include "TouchScreen.h"

 

첨부 파일의 라이브러리에 제공되는 헤더 파일로, TFT LCD 관련 함수와 터치스크린 관련 함수에 대해서 정의 되어 있다.

 

           TouchScreen ts = TouchScreen(XP, YP, XM, YM, 300);

 

터치스크린에 대한 변수를 지정하고, 초기값을 정의한다.

XP, YP, XM, YM은 터치 스크린 단자와 연결된 포트를 지정하고, 300의 값은 터치스크린 X 면에 대한 저항 값을 의미한다.

 

           TFTLCD tft(LCD_CS, LCD_CD, LCD_WR, LCD_RD, LCD_RESET);

 

TFT LCD의 변수를 지정하고, 해당 포트를 정의한다.

 

           tft.reset();

 

TFT LCD의 초기화 위해 물리적인 리셋을 한다.

 

 

uint16_t identifier = tft.readRegister(0x0);

  if (identifier == 0x9325) {

    Serial.println("Found ILI9325");

  } else if (identifier == 0x9328) {

    Serial.println("Found ILI9328");

  } else {

    Serial.print("Unknown driver chip ");

    Serial.println(identifier, HEX);

    while (1);

  }

 

예제에서는 주석 처리가 되어 있는 위 부분은 TFT LCD의 드라이버 IC의 레지스터를 읽어서 사용 가능한 드라이버를 가려내는 부분으로 이상하게 여기서 사용된 쉴드 보드의 LCD에서는 0xC0C0만 엑세스가 된다. 동일한 제품 몇 개를 해 봐도 같은 값이 읽혀서 프로그램이 더 이상 진행이 되지 않아, 위 부분은 주석 처리를 해서 실행이 되지 않도록 하였다. 이 쉴드 보드를 다룬 다른 사이트의 예제에서도 이 부분이 언급되어 있어서, 이 쉴드 보드의 문제로 생각하고 넘어가기로 한다.  < 참고 사이트  http://misc.ws/2013/11/08/touch-screen-shield-for-arduino-uno/>

 

           tft.initDisplay();

       tft.fillScreen(BLACK);

 

TFT LCD 드라이버를 초기화할 레지스터의 값을 정의한 후에, 전체 화면을 검은색으로 채운다.

 

           tft.fillRect(0, 0, BOXSIZE, BOXSIZE, RED);

       tft.fillRect(BOXSIZE, 0, BOXSIZE, BOXSIZE, YELLOW);

       tft.fillRect(BOXSIZE*2, 0, BOXSIZE, BOXSIZE, GREEN);

       tft.fillRect(BOXSIZE*3, 0, BOXSIZE, BOXSIZE, CYAN);

       tft.fillRect(BOXSIZE*4, 0, BOXSIZE, BOXSIZE, BLUE);

       tft.fillRect(BOXSIZE*5, 0, BOXSIZE, BOXSIZE, MAGENTA);

 

사용자가 지정할 칼라 박스를 출력하는 부분으로,

           tft.fillRect(0, 0, BOXSIZE, BOXSIZE, RED);

 

초기 위치 (0, 0)x,y 모두 BOXSIZE 만큼 적색으로 채워 진 사각형을 그린다.

 

           Point p = ts.getPoint();

 

터치 스크린의 입력 좌표를 읽어 오는 함수로 Point 클래스는 x, y, z의 값을 지정한다. 여기서, z 값은 터치를 하는 압력값이다.

 

p.x = tft.height() - map(p.x, TS_MINX, TS_MAXX, 0, tft.height());

        p.y = tft.width() - map(p.y, TS_MINY, TS_MAXY, 0, tft.width());

 

입력된 터치 값을 x 좌표(320) y 좌표(240)의 값으로 스케일링 한 후에 사용을 한다.

 

tft.fillRect(p.y, p.x, PENRADIUS, PENRADIUS, currentcolor);

 

입력된 좌표에 3x3의 사각 박스를 그린다.

 

위의 값을 보면 xy의 값이 바뀐 것을 알 수 있다. LCD의 좌표와 터치 스크린의 좌표가 반대로 되어 있어서 위와 같이 바꿔서 출력을 하게 되었다.

 

자세한 동작은 아래의 동영상을 참고하기 바란다.

 

제공되는 라이브러리와 예제가 몇 가지가 있지만, 제대로 동작이 되는 것이 없어서 이 예제는 수정을 좀 해서 사용하였다. 다른 예제는 기회가 되면 수정 후에 올려 놓을 수 있도록 하겠다.

 

 

비밀번호 확인 닫기
lee
2016-03-22 18:50:28
name password
  Content name date hits
[아두이노 응용] 6. 2.4" TFT LCD Shield (with Touch) (1) 
2015/02/17 4791
상호명 : R&C사 사업자등록번호 : 106-02-43112 통신판매업신고번호 : 용산 03564
대표 : 곽민수 사업장소재지 : 서울시 용산구 갈월동 17-1번지 세기빌딩 101호
전화 : ☎ : 02-776-4868 ,F: 02-779-6757 개인정보담당자 : 곽민수
[회사소개] [이용안내] [이용약관] [개인정보취급방침]
Copyright ⓒ 도서출판 OHM사와 학습기기 R&C사 All Rights Reserved.