이제 실제 GPS 데이터를 TFT LCD에 출력해볼 것이다. 이 과정을 충분히 이해한다면 응용한다면 TFT LCD에 데이터를 출력하는 일은 어렵지 않을 것이다.

 

1. 라이브러리 활용

GPS 모듈을 통해 수신한 데이터를 TFT LCD에 출력하기 위해서는 앞선 예제를 모두 활용해야 한다.

TFT LCD touch를 확인한 글에서 사용한 예제와 직전 GPS 통신을 확인한 글에서 사용한 예제를 활용한다. 목표는 LCD 화면에 GPS 모듈에서 보내는 값, 그리고 ESP32의 동작 상태를 확인할 문자를 회전시키며 출력하는 것이다.


일부 추가로 작성한 코드 외에 동작에 영향을 주는 부분은 없다. 모두 기존 예제를 활용한 관계로 예제에 대한 설명은 덧붙이지 않는다. 예제 코드가 길어진 관계로 코드를 별도로 첨부한다.

esp32_gps_with_tftlcd.ino
0.01MB

 

이중 loop()의 코드를 살펴보면 동작은 크게 세 부분으로 이루어진다.

 

1. gps module에서 시리얼 통신으로 데이터 읽어오기

2. 읽어온 값 중에서 chars 값을 LCD에 출력하기

3. ESP32 동작 상태를 확인한 문자 출력하기

 

이 중에서 일부 코드만 살펴보자. 먼저 읽어온 값 중에서 chars 값을 LCD에 출력하도록 일부 내용을 변경한 함수다.

static void print_int(unsigned long val, unsigned long invalid, int len)
{
  char sz[32];
  if (val == invalid)
    strcpy(sz, "*******");
  else
    sprintf(sz, "%ld", val);
  sz[len] = 0;
  for (int i=strlen(sz); i<len; ++i)
    sz[i] = ' ';
  if (len > 0) 
    sz[len-1] = ' ';

  if(showInfo==1) // 이 부분에서 CHARS 값을 출력한다. TFT 라이브러리에서 제공하는 함수를 사용한다.
  {
    //myGLCD.setTextColor(TFT_BLACK,TFT_WHITE);
      myGLCD.drawCentreString("*CHARS:", 20, 20, 2);
      myGLCD.drawCentreString(sz, 100, 20, 2);
      showInfo=0;
  }
  Serial.print(sz);
  smartdelay(0);
}

 

그다음은 ESP32 동작 상태를 확인하는 문자를 출력하는 함수다.

static void progress(void)
{
  if(prog==0) myGLCD.drawCentreString("-",10,0,2);  
  else if(prog==1) myGLCD.drawCentreString("\\",10,0,2);
  else if(prog==2) myGLCD.drawCentreString("|",10,0,2);
  else if(prog==3) myGLCD.drawCentreString("/",10,0,2);
}

 

이제 코드를 동작시켜볼 차례다. 다운로드한 예제를 컴파일해서 올리면 다음과 같은 화면이 나타난다.

https://youtu.be/cF7VpY5_ziE

 

 

이제 TFT LCD의 touch 동작을 확인할 차례이다.

1. touch 라이브러리 설치

먼저 Adafruit touchscreen 라이브러리 설치가 필요하다. 아두이노의 라이브러리 매너저를 통해 라이브러리 설치를 진행한다.

툴 > 라이브러리 관리를 선택한다.
adafruit touchscreen을 검색한다.
설치가 완료되면 위와 같이 상태가 변한다.

2. touch 예제

라이브러리 설치가 완료된 후 touch를 확인하기 위해 예제를 연다.

예제에서 Adafruit TouchScreen > touchscreendemo를 선택한다.

다음과 같이 touch 좌표를 입력 받기 위한 pin 정보를 수정한 후 코드를 write 한다.

*pin 정보는 다음 글에 기재한 pin map을 참고한다.

2021.05.11 - [BerryMixLab/Arduino Tutorial] - Arduino Tutorial - 3. TFT LCD 모듈 연결

 

Arduino Tutorial - 3. TFT LCD 모듈 연결

 이제 TFT LCD를 ESP32에 연결해 보자. 본 tutorial에서는 ILI9341 TFT LCD를 사용했으며 이 TFT LCD 하나를 ESP32에 연결해서 얻는 이점은 다음과 같다. ● 데이터 출력 ● Touch interface ● SD card interfac..

berrymixstreet.tistory.com

 

YP, XM, YM, XP의 pin 정보를 위와 같이 수정한다.

화면 이곳저곳을 터치하면 값이 변하고 정상적으로 터치가 인식되는 것을 알 수 있다.

X좌표 값이 마음에 들지 않는다.

하지만 변환된 좌표 값이 정상적이지는 않아 보인다. 제대로 Touch를 설정하고 제대로 동작을 확인하기 위해서는 몇 가지 라이브러리가 더 필요하다.

 

3. 추가 라이브러리 설치

아두이노 라이브러리매니저에서 다음 라이브러리를 모두 설치한다.

● Adafruit gfx

● Adafruit tftlcd

a. Adafruit gfx 라이브러리 설치

adafruit gfx를 검색한다.
의존성 문제를 물으니 갑자기 무섭다. 그러니 고민 없이 함께 설치한다.
설치가 완료되면 위와 같은 화면이 나타난다.

b. Adafruit tftlcd 라이브러리 설치

adafruit tftlcd 를 검색한다.

 

설치가 완료되면 위와 같은 화면이 나타난다.

4. 예제 응용

이제 예제를 활용해 touch에 따라 TFT LCD에 정보를 표시해볼 차례이다. pin 정보를 수정하고 업로드를 시도하자. 하지만 예상과는 달리 예제를 컴파일 하면 의미를 해석하고 싶지 않은 오류들을 출력한다.

누군가는 인내와 끈기를 가지고 해결할 것이다. 하지만 여기서는 다른 방법을 택한다.

동작하지도 않는 예제를 왜 제공하는지 따져 물을 수 있지만 현재로서 그것은 능력 밖의 일이다. 그래서 다른 방법을 통해 예제의 코드를 수행해 보았다. 방법은 다음과 같다.

ESP32 utftdemo 예제에
Adafruit tftlcd의 tftpaint 예제를
적당히 붙여 넣기 하는 것.

 

말은 쉽다. 하지만 시도에는 시행 착오가 따른다. 그래서 성공한 예제를 첨부한다.

TFT_LCD_touch.ino
0.01MB

코드에 별도의 주석은 없으며 예제 실행을 위해 직접 수정한 부분 중 중요하게 생각하는 내용만 일부 별도로 기재한다.

a. setup()

analogReadResolution(10); // ADC 해상도 범위를 10bit로 설정해야 touch 영역이 정상적으로 인식됨. 
// Setup the LCD 
myGLCD.init(0x9431); //본 글에서 사용하고 있는 TFT LCD의 IC인 ILI9431를 
                     //명시해야 정상적으로 초기화가 진행된다.

b. loop()

//p.x = map(p.x, TS_MINX, TS_MAXX, myGLCD.width(), 0); // 기존 코드 
p.x = map(p.x, TS_MINX, TS_MAXX, 0, myGLCD.width()); // 좌표 값을 반전 시켜야 
                                                       // touch가 정상적으로 
                                                       // TFT LCD에 반영이 된다.

 

*ADC 해상도 관련 내용은 다음글에 자세하게 기록해 두었다.

2020.10.20 - [BerryMixLab/Arduino Project] - 아두이노 프로젝트 - GPS Logger 만들기

 

아두이노 프로젝트 - GPS Logger 만들기

세상을 바꾼 아이디어들은 형태에 변형에 따라 다양한 모습으로 진화해왔다. 기존에 있는 것들에 새로운 기능을 추가하거나 아니면 빼거나. 그것도 아니라면 완전하게 다른 시각에서 접근하기

berrymixstreet.tistory.com

다운로드한 예제를 컴파일해 다음과 같은 화면이 나타나면 touch를 확인해 볼 수 있다.

이제 약간의 응용만 가능하다면 touch를 통해 ESP32를 제어할 준비가 끝났다. 여기까지 아무런 문제가 없다면 다음으로 넘어가자.

 

 

세상을 바꾼 아이디어들은 형태에 변형에 따라 다양한 모습으로 진화해왔다. 기존에 있는 것들에 새로운 기능을 추가하거나 아니면 빼거나. 그것도 아니라면 완전하게 다른 시각에서 접근하기도 했다. 이 모든 것은 작은 시도에서 출발한다. 이 작은 출발도 그러하기를 바라본다. 프로젝트는 다음의 순서에 따라 진행했다.

*전통적인 프로젝트 진행 방식과는 다를 수 있다.

 

●제품컨셉구상

●사양 정의

●구현

●제품 디자인

●제작 및 시연


1. 제품 컨셉 구상

 

 지난번 프로젝트에서 기능을 축소해 시간만 표시하는 작은 인테리어 소품을 고민했다. 가장 중요한 점은 시간 설정 및 유지에 불편함이 없어야 한다는 점. 이를 기술적으로 해결하기 위한 방법은 있다.

하나, GPS 모듈을 통해 GPS의 시간을 받아 온다.
둘, 네트워크를 통해 타임 서버에서 시간을 받아 온다.
셋, 직접 시간을 입력하고 RTC(Real Time Clock)으로 시간을 유지한다.

 이중 가장 간편한 방법은 GPS 모듈을 통해 GPS의 시간을 받아 오는 것이다. 하지만 이 프로젝트의 이름이 GPS Clock이 아닌 이유는 ‘사양 정의’ 부분에서 자세하게 설명한다. 이 프로젝트의 정확한 이름은 다음과 같다.

GPS Logger

 


 

2. 사양 정의

 

 인터페이스를 결정하기에 앞서 GPS 모듈에 대한 사전 시험을 진행했다. 그리고 당황을 금치 못했다. 처음 써보는 부품이니 당연한 일이었다.

‘실내에서는 GPS 신호가 도달하기 어렵다.’

 어차피 손에 들어온 GPS 모듈이었다. 이참에 제대로 해보자는 생각이 들었다. 스마트 워치가 제공하는 운동 기능을 모방한 형태의 제품을 만들어 보면 좋겠다고 생각했다. 이미 이전 프로젝트를 진행하면서 보유한 부품을 최대한 활용하기로 했다. 사양은 다음과 같다.

 

·하드웨어

MCU : ESP32 (WiFi, Bluetooth 내장)

공식 홈페이지

LCD : TFT LCD 2.4인치 (SD card 인터페이스 포함)

ILI 9341

GPS : GY-NEO6MV2

Power : 3.7V 배터리(18650) * 2EA

ESP32 동작 전압을 확인하지 않고 구매했다가 추가 구매하여 용량이 다르다. 추가 구매 시에도 확인을 못해서 참사가 벌어졌다.

 

 Weather clock에서 지원해야 하는 기능은 다음과 같다.

 

구분

설명

·필수 기능

GPS 모듈 통신

GPS 시간 및 정보 화면 출력(JPG 이미지 출력)

GPS 데이터 기록을 위한 화면 터치 제어

GPS 데이터 저장을 위한 SD 카드 제어

··부가 기능

서버 통신 중 로고 띄우기(GIF 이미지 출력)


 

3. 구현

 

 구현 내용은 추후 각 단계별로 상세하게 정리해서 올릴 예정이다. 실제 구현은 라이브러리 내에서 제공하는 모든 예제를 활용했다. 사용한 라이브러리만 기능 별로 간단하게 정리한다.


·필수 기능

 

ㄱ. GPS 모듈 통신 : Tiny GPS

 GPS 통신은 모듈의 칩에서 자동으로 해준다. ESP32에서 할 일은 시리얼 통신으로 데이터를 받아오는 것이다. 데이터 파싱도 제공하는 라이브러리에서 자동으로 해준다.

 

ㄴ. GPS 시간 및 정보 화면 출력(JPG 이미지 출력) : TFT_eSPI

 JPG 출력은 예제만으로 문제없다. 다만 화면 구성 및 이미지 버튼 처리가 조금 성가셨다. 프로젝트 진행 중에 아두이노에 적용 가능한 GUI 라이브러리가 있는 것을 확인했다. 추후 다른 프로젝트 진행 시에 적용해볼까 한다.

 

ㄷ. GPS 데이터 기록을 위한 화면 터치 제어 : Adafruit TouchScreen

 이 부분이 조금 성가시다. 구글의 도움을 받아 터치 동작까지는 확인했으나 Arduino Uno(아두이노 우노)에서 동작과 다르다. 핀맵에도 문제가 없었다. 며칠을 헤매고 나서야 원인을 찾을 수 있었다.

ADC 해상도

Arduino Uno ADC 해상도 : 10bit(0 ~ 1023)
ESP32 ADC 해상도 : 12bit(0 ~ 4095)

 

*여기서 기술적인 이야기를 잠시 짚고 넘어가 보자.

 

/** 
감압식 터치 값은 각 ADC 핀을 통한 전압 차로 확인한다. 
LCD에 공급되는 3.3V를 기준으로 변환된 디지털 값을 map 함수를 통해 실제 좌표 값으로 변환하게 된다. 
그렇다. Arduino Uno 나 ESP32 나 LCD에 공급되는 3.3V 값은 달라지지 않기 때문에 
0 ~ 1023의 디지털 값이 발생하게 된다. 
ESP32는 0 ~ 4095 영역의 공간 중 0 ~ 1023 공간만 사용하게 되는 것이다. 

해결할 수 있는 방법은 하나다. 
ESP32 ADC 해상도를 제한하는 것. 
친절하게도 기본으로 제공되는 간단한 함수로 해결이 가능하다. 

*/ 

analogReadResolution(10); // ADC 해상도 범위를 10bit로 설정.

 

ㄹ. GPS 데이터 저장을 위한 SD 카드 제어 : ESP32 Dev Module 예제.

ESP32에서 SD카드를 사용하려면 FAT32로 포맷해야 한다. SD 인식 및 제어는 예제를 활용하면 어렵지 않다.

 

··부가 기능.

ㄱ. 서버 통신 중 로고 띄우기(GIF 이미지 출력) : AnimatedGIFs_SD_Master

별도의 변경 없이 지난번 프로젝트에 적용한 부분을 그대로 적용했다.

 

* GIF 이미지 출력에 대한 이야기는 아래 Weather clock 만들기 참고.

2020/09/17 - [BerryMixLab/Arduino Project] - 아두이노 프로젝트 - Weather clock 만들기

 

아두이노 프로젝트 - Weather clock 만들기

 바야흐로 아두이노 세상에 살고 있다. 초등생, 혹은 유치원생부터 청장년층에 이르기까지 코딩 좀 한다 하면 아두이노의 경험이 있다. 예외도 있지만, 이렇게 많은 사람들의 관심과 노력 속에

berrymixstreet.tistory.com


 

4. 제품 디자인

 Fusion 360을 사용하여 제품을 디자인했다. 별도로 참고한 디자인은 없으며 크기를 최소화하는데 집중했다. 쓸 데 없이 큰 배터리를 구매한 덕분에 케이스 크기가 커진 감이 있다. 달려있는 커넥터만 변경했어도 더 줄일 수 있었을 텐데.

 출력은 보유 중인 유일한 3D 프린터인 Ender 5 Plus를 사용했다.

 

 

 

 

5. 제작 및 시연

https://youtu.be/7X0HEIJEBuk

완성 후 아내를 불러 GPS Logger의 기능을 설명하며 자세히 보여주었다.

“빨간색에 뒤에 검은색 버튼 달려 있으니까 코카콜라 굿즈 같다.
그런데 무슨 말인지는 하나도 모르겠다.”


▶ Trouble shooting.

1. 실내에서 GPS 신호가 잡히지 않는다.

 저층이나 개방된 공간이라면 상황이 달랐겠지만 이와 같은 이유로 테스트에 어려움을 겪었다. 중간중간 마스크를 착용하고 밖으로 나가는 것 말고는 다른 방법이 없었다.

2. GPS Logger 동작 중 jpg 이미지가 깨진다.

 아직까지 이유는 확인하지 못했다. draw string 등 함수가 반복해서 동작할 때 jpg로 그려놓은 메모리 영역을 일부 침범하는 게 아닐까 한다.

 

+ Recent posts