1.28 인치 7PIN 8PIN SPI TFT LCD 모듈 GC9A01
프로젝트 개요: 왜 원형 LCD인가?
일반적인 사각형 디스플레이와 달리 GC9A01 원형 TFT LCD는 로봇의 눈을 표현하기에 최적화된 형태를 가집니다. 하지만 두 개의 고해상도(240×240) 화면을 동시에, 그것도 자연스럽게 구동하는 데는 여러 기술적 난관이 있었습니다.

🛠️ 주요 문제 해결 및 기술적 포인트
1. SPI 통신 속도 최적화 (60MHz의 발견)
초기에는 통신 안정성을 위해 낮은 속도를 고려했으나, 고해상도 이미지를 실시간으로 뿌리기엔 역부족이었습니다.
- 해결: SPI 클럭 속도를 60MHz로 설정하여 데이터 전송 병목 현상을 해결했습니다. 신호가 더 날카롭고 정확하게 전달되면서 화면 깨짐 없이 부드러운 프레임 전환이 가능해졌습니다.
2. 하드웨어 리셋(Reset) 핀의 분리
두 디스플레이의 리셋 핀을 하나로 묶었을 때 발생하는 초기화 오류를 해결했습니다.
- 해결: 각 LCD에 독립적인 리셋 핀을 할당하고, 순차적으로
tft.reset()을 수행하여 컨트롤러가 확실하게 명령을 인식하도록 개선했습니다.
3. 노이즈 없는 깨끗한 부팅 (Zero-Noise Start)
전원을 넣을 때 비디오 램(VRAM)의 무작위 데이터 때문에 나타나는 ‘지직거리는 노이즈’를 잡았습니다.
- 해결: 하드웨어 리셋 직후, 눈 이미지를 그리기 전에
tft.fill(0)명령으로 화면을 검은색으로 즉시 초기화하는 로직을 추가하여 고급스러운 부팅 시퀀스를 완성했습니다.
4. 시차 없는 동기화: 인터리빙(Interleaving) 기법
왼쪽 눈을 다 그리고 오른쪽 눈을 그리면 발생하는 미세한 시차(약 0.1~0.2초)는 로봇의 생동감을 떨어뜨립니다.
- 해결: 전체 이미지를 한 번에 보내지 않고, 20줄씩 번갈아 가며(Interleaving) 양쪽 눈에 쏘는 방식을 도입했습니다. 이를 통해 우리 눈에는 양쪽 눈이 동시에 움직이는 것처럼 보이는 완벽한 동기화를 구현했습니다.
5. 코믹한 감정 표현 (윙크 및 사시 동작)
단순한 시선 이동을 넘어 로봇에게 성격을 부여했습니다.
- 기능: 한쪽 눈의 통신만 열어 수행하는 윙크, 그리고 좌우 이미지를 교차하여 시선을 모으거나 벌리는 코믹 사시(Eye Gag) 패턴을 랜덤으로 배치해 생동감을 더했습니다.
💡 연결 시 주의사항 (Troubleshooting Tips)
- 전력 공급: ESP32의 3.3V 출력은 디스플레이 두 개를 감당하기에 충분하지만, 점퍼 와이어가 너무 길거나 헐거우면 전압 강하로 인해 화면이 떨릴 수 있습니다. 가급적 짧고 굵은 선을 사용하세요.
- 공유 핀 vs 독립 핀: * SCL, SDA, DC는 두 디스플레이가 사이좋게 나눠 쓰는 공유 핀입니다.
- CS와 RES는 각 눈을 따로 제어하기 위한 독립 핀입니다. (이걸 합치면 어제 겪으셨던 초기화 지옥이 다시 찾아옵니다!)
- BL (Backlight) 핀: 만약 8핀 모듈을 사용 중이시라면 BL 핀을 3.3V에 직접 연결하거나, 남는 GPIO에 연결해 밝기 조절(PWM) 용도로 쓰실 수 있습니다. (7핀 모듈은 내부적으로 VCC에 묶여 있어 생략 가능합니다.)
“SPI 통신의 효율을 극대화하기 위해 클럭과 데이터 라인은 공유하되, 각 디스플레이의 개별 제어를 위해 CS와 Reset 라인을 분리하여 하드웨어적 안정성을 확보했습니다.”


Python gc10.py



답글 남기기
댓글을 달기 위해서는 로그인해야합니다.