TFT LCD에 GPS 데이터까지 출력했다면 GPS Logger project의 마지막 단계, SD card에 GPS 데이터를 저장해볼 시간이다.
1. SD card 포맷
ESP32 보드에 SD card를 사용하려면 포맷이 필요하다. 여유가 있으면 맥에서도 지원이 가능한 포맷 프로그램을 찾아볼 수 있겠지만 시간 관계상 윈도우에서 포맷을 진행했다. 포맷 관련 내용은 조금만 검색해도 찾을 수 있기 때문에 여기서는 별도로 정리하지 않는다.
2. 라이브러리 활용
SD card를 사용하기 위해서는 앞서 설치한 ESP32 라이브러리가 필요하다. 그중에서 SD test 예제를 활용한다.
지금까지의 과정 중 비교적 간단한 코드 수정을 거쳐 SD card 인식 여부를 확인할 수 있다. 예제 코드를 전부 실행시켜도 상관없지만 여기서는 SD card의 인식만 확인하는 것이 목적이므로 필요한 코드만 남기기로 한다. 전체 코드에서 일부 코드만 주석 처리하면 끝이다.
가끔은 주석 처리조차 귀찮을 때가 있으므로 동작을 확인한 예제를 첨부한다.
주석 처리한 코드를 ESP32에 write한 후 serial을 통해 출력되는 내용을 살펴본다.
SD card에 저장된 파일이 있다면 파일 목록까지 모두 출력된다. 위와 같이 인식된 SD card의 정보가 모두 출력되면 SD card가 정상적으로 인식된 것이다. 이제 GPS data를 SD card에 저장할 모든 준비가 끝났다.
하지만 변환된 좌표 값이 정상적이지는 않아 보인다. 제대로 Touch를 설정하고 제대로 동작을 확인하기 위해서는 몇 가지 라이브러리가 더 필요하다.
3. 추가 라이브러리 설치
아두이노 라이브러리매니저에서 다음 라이브러리를 모두 설치한다.
● Adafruit gfx
● Adafruit tftlcd
a. Adafruit gfx 라이브러리 설치
b. Adafruit tftlcd 라이브러리 설치
4. 예제 응용
이제 예제를 활용해 touch에 따라 TFT LCD에 정보를 표시해볼 차례이다. pin 정보를 수정하고 업로드를 시도하자. 하지만 예상과는 달리 예제를 컴파일 하면 의미를 해석하고 싶지 않은 오류들을 출력한다.
동작하지도 않는 예제를 왜 제공하는지 따져 물을 수 있지만 현재로서 그것은 능력 밖의 일이다. 그래서 다른 방법을 통해 예제의 코드를 수행해 보았다. 방법은 다음과 같다.
ESP32 utftdemo 예제에 Adafruit tftlcd의 tftpaint 예제를 적당히 붙여 넣기 하는 것.
말은 쉽다. 하지만 시도에는 시행 착오가 따른다. 그래서 성공한 예제를 첨부한다.
코드에 별도의 주석은 없으며 예제 실행을 위해 직접 수정한 부분 중 중요하게 생각하는 내용만 일부 별도로 기재한다.
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에 반영이 된다.
연결 및 초기 설정은 위 사이트를 참고했으며 GPS 모듈 연결, SD 카드 동시 사용을 위해 일부 핀맵을 변경했다. ILI9341 TFT LCD 화면과 Arduino를 연결하는 방식은 SPI 방식과 parallel 방식이 있는데 여기서는 위 사이트를 참고하여 parallel 방식을 사용했다.
1. 핀맵
ILI9341 TFT LCD
TFT _eSPI Library
Ref. Parallel
GPS 프로젝트 적용
LCD_CS
TFT_CS
27
33
LCD_RS
TFT_DC(RS)
14
15
LCD_RST
TFT_RST
26
32
LCD_WR
TFT_WR
12
4
LCD_RD
TFT_RD
13
2
LCD_D0
TFT_D0
16(RX2)
12
LCD_D1
TFT_D1
4
13
LCD_D2
TFT_D2
23
26
LCD_D3
TFT_D3
22
25
LCD_D4
TFT_D4
21
21
LCD_D5
TFT_D5
19
22
LCD_D6
TFT_D6
18
27
LCD_D7
TFT_D7
17(TX2)
14
SD_SS
CS
5
SD_DI
DI(MOSI)
23
SD_SCK
SCLK
18
SD_DO
DO(MISO)
19
3V3
3V3
GND
GND
위에서 참고한 사이트와 동일하게 연결해도 무방하다. 하지만 GPS를 연결하려면 시리얼 포트가 필요하고 GPS를 사용하면서 동시에 LCD를 Parallel mode로 사용하려면 남겨두는 편이 좋다. 핀맵을 참고하여 LCD와 ESP32를 연결한다.
2. 라이브러리 설치
ILI9341 TFT LCD를 구동하는데 여러 라이브러리가 있지만 여기서는 TFT_eSPI 라이브러리를 설치한다.
3. Parellel 적용
TFT eSPI 라이브러리를 parellel 방식으로 동작시키려면 경로를 확인하여 User_Setup.h 파일을 변경해야 한다.
Document/Arduino Folder/libararies/TFT_eSPI/User_Setup.h 파일을 열어서 다음과 같이 수정한다. iCloud를 사용 중이라면 iCloud 문서에 Arduino 폴더가 있을 것이다.
4. 예제
다음과 같은 화면이 나타나면 모든 연결과 설정이 정상적으로 완료된 것이다.
이제 각종 예제와 라이브러리를 활용하여 화면에 무엇이든 표시할 준비가 끝났다. 여기까지 아무런 문제가 없다면 다음으로 넘어가자.
모든 코딩의 기본이 되는 ‘hello world’를 시작해보자. 보통 처음 ‘hello world’를 접하게 되는 경우는 화면이 달려 있다. 하지만 여기서는 아직 화면이 없으니 시리얼 통신으로 대체하기로 한다. 시리얼 통신은 각 산업 분야에 다양하게 적용되어 있다. 그리고 시리얼 통신은 아두이노 개발 과정에서는 필수라고 봐도 과언이 아니다.
*MAC에서 Arduino 개발 환경 준비 및 LED 제어 관련 내용은 이전 글에서 확인한다.
예제를 실행하기 전에 ESP32 보드와 PC를 USB 케이블로 연결한다. 이후 다음 경로에서 예제를 선택한다.
와이파이 통신을 위한 MAC address를 출력하는 예제이다. 아래 코드 설명을 참고한다.
uint64_t chipid;
/**
setup은 초기화 함수로 보드 부팅시에 한번만 실행된다.
*/
void setup() {
Serial.begin(115200); // 115200bps의 보드레이트 속도로 시리얼 통신을 시작한다.
}
/**
loop는 말 그대로 루프 함수로 setup 함수 수행 이후에 보드 전원이 유지되는 동안 반복해서 수행된다.
이 예제에서는 내장된 고유 MAC address를 불러오고 출력하는 것이 전부다.
*/
void loop() {
chipid=ESP.getEfuseMac();
//The chip ID is essentially its MAC address(length: 6 bytes).
/*
ESP 라이브러리에서 제공하는 기본 함수로 총 6 bytes의 고유 MAC address를 받아 온다.
*/
Serial.printf("ESP32 Chip ID = %04X",(uint16_t)(chipid>>32));
//print High 2 bytes
/*
상위 2bytes를 먼저 출력한다. MAC address가 AABBCCDDEEFF라면 AABB까지만 출력한다.
*/
Serial.printf("%08X\n",(uint32_t)chipid);
//print Low 4bytes.
/*
하위 4bytes를 출력한다.
*/
delay(3000); //3초간 대기한다.
}
실제 와이파이 통신을 통해 제대로 된 MAC address를 확인해보면 좋겠지만 여기서는 MAC address만 출력해보도록 한다.
*MAC address는 이더넷 통신을 위한 하드웨어 고유 주소로 흔히 알고 있는 IP address와 함께 통신이 가능하도록 한다. (와이파이는 무선 이더넷 통신.)
이제 다음 경로를 참고하여 시리얼 모니터를 실행하자.
보드 레이트가 9600으로 설정되어 있을 것이다. 보드 레이트를 예제에서 설정된 값과 동일하게 115200으로 변경하자. 원하는 속도로 변경 가능하지만 여기서는 변경 없이 진행하도록 한다.
*보드 레이트는 시리얼 통신의 속도로 PC<->Arduino(장치 <-> 장치) 양쪽 모두 동일하게 맞춰주어야 한다.
이제 좌측 상단의 화살표를 클릭해 코드를 write 하자
코드를 정상적으로 write 했다면 다음과 같이 MAC address가 출력된다.
2. Hello world
여기까지 확인했다면 hello world를 출력해볼 차례다. 아래 코드를 참고해서 setup 부분에 Hello world를 입력한다.
Text 출력이 가능한 Print 관련 함수는 몇 가지가 있지만 그중에서도 println을 사용한다. 자동으로 줄 바꿈이 가능한 함수다.
3. 응용
이제 응용을 해볼 차례다. 앞서 진행했던 tutorial 코드를 다시 불러 오자.
그다음 아래 그림을 참고하여 각 위치에 print 함수를 추가해보자.
코드를 디버깅하는 여러 가지 방법이 있지만 디버거를 사용할 수 없는 환경이라면 print 함수나 LED를 활용하는 편이 유용하다고 생각된다. 물론 코드를 완벽하게 이해하고 있어야 하지만.
이렇게 LED 제어, 코드 디버깅을 위한 시리얼 통신까지 확인해봤다. 여기까지 아무런 문제가 없다면 다음 단계로 넘어가자.