Embedded / IoT
Advanced
ESP-IDF / Arduino
ESP32 I2S DMA 기반 HUB75 RGB LED 매트릭스 패널 구동 및 더블 버퍼링
CPU 개입 없이 I2S DMA 엔진이 프레임 버퍼를 LED 패널로 자동 스트리밍하게 설계하여 60fps 이상의 플리커 프리 화면을 출력하는 하드웨어 설정.
#Embedded #ESP32 #HUB75 #DMA #Hardware
핵심 개념HUB75 패널(64x32 또는 64x64)은 자체 메모리가 없는 시프트 레지스터 구조이므로 초당 수천 번의 클럭과 래치 신호를 CPU로 쏴주어야 깜빡임이 없습니다. ESP32의 I2S 병렬 DMA(Direct Memory Access)를 활용하면 CPU 낭비 없이 완벽한 플리커 프리 그래픽을 구현할 수 있습니다.
1. I2S DMA Matrix 패널 셋업 코드
#include <ESP32-HUB75-MatrixPanel-I2S-DMA.h>
#define PANEL_RES_X 64
#define PANEL_RES_Y 32
#define PANEL_CHAIN 1
MatrixPanel_I2S_DMA *dma_display = nullptr;
void setup() {
HUB75_I2S_CFG mxconfig(
PANEL_RES_X, // 모듈 가로 폭
PANEL_RES_Y, // 모듈 세로 폭
PANEL_CHAIN // 체인 연결 개수
);
// 하드웨어 핀 커스텀 매핑 (ESP32 WROOM)
mxconfig.gpio.r1 = 25; mxconfig.gpio.g1 = 26; mxconfig.gpio.b1 = 27;
mxconfig.gpio.r2 = 14; mxconfig.gpio.g2 = 12; mxconfig.gpio.b2 = 13;
mxconfig.gpio.a = 23; mxconfig.gpio.b = 19; mxconfig.gpio.c = 5;
mxconfig.gpio.d = 17; mxconfig.gpio.e = -1; // 1/16 스캔
mxconfig.gpio.lat = 4; mxconfig.gpio.oe = 15; mxconfig.gpio.clk = 16;
mxconfig.double_buff = true; // 더블 버퍼링 활성화 (테어링 방지)
dma_display = new MatrixPanel_I2S_DMA(mxconfig);
dma_display->begin();
dma_display->setBrightness8(64); // 밝기 조절 (0~255)
}
void loop() {
dma_display->fillScreen(dma_display->color565(0, 0, 0));
dma_display->drawString(4, 12, "LYSC*", dma_display->color565(255, 222, 89));
dma_display->flipDMABuffer(); // 화면 버퍼 교체
delay(33);
}