RockBase-iot/NM-CYD-C5. 2.8인치 터치 LCD가 붙은 ESP32-C5 개발보드다. 핵심은 두 가지 — 첫째, 원조 '값싼 노란 디스플레이(CYD, ESP32-2432S028)'와 핀·치수가 그대로 호환되어 기존 CYD 펌웨어를 거의 꽂기만 하면 돌릴 수 있고, 둘째 ESP32 계열 최초로 5GHz Wi-Fi 6(802.11ax)·Zigbee 3.0·Thread를 모두 지원한다(기존 ESP32는 전부 2.4GHz 전용이었다). 저장소 자체는 독립 펌웨어 앱이 아니라, Arduino · PlatformIO(Bruce) · MicroPython 세 툴체인의 보드 지원 파일 + 데모 + 커스텀 TFT_eSPI 드라이버 포트 + 하드웨어 문서(데이터시트·회로도 PDF)를 모아 둔 '보드 벤더 공식 지원 레포'다. (저장소: RockBase-iot/NM-CYD-C5 · SoC ESP32-C5-WROOM-1 RISC-V 240MHz · 16MB Flash + 8MB PSRAM · 디스플레이 240×320 ST7789 + XPT2046 터치 · 세 툴체인 데모 + 11개 연계 펌웨어 프로젝트 큐레이션 · 라이선스 표기는 데모별 상이(TFT_eSPI/st7789py 등 원작 라이선스 승계) · TrendShift 라이브 멘션 #62141)
"기존에 가장 인기 있던 ESP32 터치보드(CYD)와 똑같은 모양·핀배치에, ESP32 최초로 5GHz Wi-Fi·Zigbee·Thread를 얹은 '업그레이드판' 보드와 그 사용 설명서."
CYD(Cheap Yellow Display)는 취미 전자공학계의 스테디셀러입니다 — 2.8인치 터치 LCD가 달린 ESP32 보드를 1~2만 원대에 살 수 있어, 수많은 펌웨어(시계·대시보드·보안도구)가 이 보드를 기준으로 만들어졌죠. 문제는 그 원조 보드의 ESP32가 2.4GHz Wi-Fi만 되고 PSRAM도 없다는 것. NM-CYD-C5는 치수와 핀을 그대로 유지한 채 SoC만 신형 ESP32-C5로 갈아 끼워, 기존 CYD 생태계를 깨지 않으면서 5GHz Wi-Fi 6, Bluetooth 5, 그리고 IoT 메시 프로토콜(Zigbee·Thread)을 한 번에 얻었습니다. 레포에는 보드를 켜는 데모 코드 3종, ESP32-C5에 맞춰 새로 포팅한 디스플레이 드라이버, 회로도·데이터시트 PDF, 그리고 이 보드에서 돌아가는 11개 펌웨어 프로젝트 목록이 들어 있습니다.
ESP32-2432S028이라는 특정 보드(2.8″ 320×240 터치 LCD + ESP32)를 가리켰는데, 너무 인기를 끌어 "LCD가 달린 값싼 ESP32 보드" 전체를 부르는 보통명사가 됐습니다. witnessmenow가 만든 ESP32-Cheap-Yellow-Display 가이드 저장소가 사실상의 표준 문서이고, NM-CYD-C5는 그 보드와 핀·치수를 일부러 똑같이 맞춘 후속 호환 보드입니다.조금 더 구체적으로, 이 보드의 두뇌는 ESP32-C5-WROOM-1 모듈입니다 — RISC-V 240MHz, 16MB Flash + 8MB PSRAM. 화면은 2.8″ 240×320 TFT(ST7789 컨트롤러, ILI9341로 교체 가능)에 XPT2046 저항막 터치가 붙고, microSD 슬롯·WS2812 RGB LED·여러 확장 핀이 있습니다. 전원·프로그래밍용 USB-C가 두 개(하나는 ESP32-C5 네이티브 USB, 하나는 CH340 USB-UART 변환기)입니다. 레포는 이 하드웨어를 ① Arduino IDE, ② PlatformIO(주로 Bruce 펌웨어 빌드), ③ MicroPython 세 갈래로 켜는 법을 각각의 README·설정파일·드라이버로 안내합니다.
이 문서가 파고드는 건 "보드 스펙 나열"이 아니라 그 안에서 배울 수 있는 것입니다 — "디스플레이 드라이버를 새 칩(ESP32-C5)에 포팅한다는 게 무슨 뜻인지", "디스플레이·터치·SD카드가 한 SPI 버스를 어떻게 나눠 쓰는지", "왜 ESP32-C5만 펌웨어를 0x2000 주소에 써야 하는지", "Zigbee End Device가 뭔지". 임베디드·IoT를 처음 공부하는 사람에게 실물 하드웨어로 배우는 좋은 교본입니다.
"인기 보드의 '핀 호환 업그레이드'라는 영리한 포지셔닝 + ESP32 최초의 5GHz·Zigbee·Thread + 보안·펜테스트 펌웨어 붐."
새 하드웨어의 가장 큰 적은 "쓸 만한 소프트웨어가 없다"입니다. NM-CYD-C5는 이 문제를 정공법으로 피합니다 — 원조 CYD와 치수·핀배치·인터페이스를 일부러 똑같이 맞춰서, 이미 존재하는 수많은 CYD용 펌웨어와 케이스·액세서리를 거의 그대로 재사용하게 했습니다. README의 표현으로 "seamless replacement(매끄러운 교체)". 사용자는 익숙한 보드의 모양 그대로, 알맹이만 신형 칩으로 바꾼 셈입니다.
전구 소켓은 그대로 두고 백열등을 LED로 바꾸는 것과 같습니다. 소켓(핀·치수)을 새로 설계했다면 기존 등기구(펌웨어·케이스)를 전부 다시 만들어야 하지만, 소켓을 표준에 맞췄기에 알맹이(ESP32-C5)만 갈아 끼우면 밝기(5GHz Wi-Fi)와 기능(Zigbee·Thread)이 올라갑니다.
가장 큰 기술적 뉴스는 5GHz Wi-Fi 6입니다. 지난 10년간 모든 ESP32는 2.4GHz 전용이었는데, 2.4GHz는 전자레인지·블루투스·이웃집 공유기로 극심하게 혼잡합니다. 5GHz로 올라가면 간섭이 줄고 처리량이 늘죠. 여기에 Zigbee·Thread까지 더해, 이 작은 보드 하나가 Wi-Fi 허브이자 스마트홈 메시 노드가 될 수 있습니다.
| 항목 | 원조 CYD (ESP32-2432S028) | NM-CYD-C5 |
|---|---|---|
| Wi-Fi 대역 | 2.4GHz | 2.4 + 5GHz |
| Wi-Fi 표준 | 802.11 b/g/n | 802.11ax (Wi-Fi 6) |
| Zigbee | 없음 | Zigbee 3.0 |
| Thread | 없음 | Thread 1.3 |
| Flash | 4MB | 16MB |
| PSRAM | 없음 | 8MB |
| 코어 | Xtensa 듀얼코어 | RISC-V 싱글코어 @240MHz |
마침 ESP32 기반 휴대용 무선 보안 도구가 유행입니다. README가 직접 연결해 두는 펌웨어들이 바로 그 흐름의 한복판에 있습니다.
| 연계 펌웨어 | 무엇 |
|---|---|
| Bruce | Flipper Zero류의 다기능 무선/RF 도구 펌웨어. 이 레포의 PlatformIO 빌드가 곧 Bruce용 보드 지원. |
| ESP32Marauder | Wi-Fi/BLE 분석·스니핑 도구. RockBase가 NM-CYD-C5용 포크를 운영. |
| CYM (Cheap Yellow Monster) | NM-CYD-C5 전용 터치 기반 Wi-Fi 보안 툴킷. |
| NMMiner | 비트코인 솔로 복권 채굴기(학습·재미용). 웹 플래셔 제공. |
| ESP-Claw | Espressif의 IoT용 채팅 코딩 AI 에이전트 프레임워크(C로 재구현). 0.3.0이 NM-CYD-C5에서 동작하도록 갱신됨. |
| Launcher | M5Stack·Lilygo·CYD·Marauder 등 ESP32 기기용 앱 런처. |
즉 NM-CYD-C5는 "가장 인기 있는 보드의 모양 + 가장 최신의 무선 칩 + 마침 뜨거운 보안/AI 펌웨어 생태계"가 겹친 지점에 있습니다. 5GHz Wi-Fi가 되니 5GHz 워드라이빙(ESP32DualBandWardriver)처럼 이전 ESP32로는 불가능하던 작업도 열립니다.
오해를 막기 위해 분명히 해 둡니다. 이 저장소 자체에는 독립 실행되는 펌웨어 앱이 없습니다 — main()을 가진 완결 프로젝트, ESP-IDF의 CMakeLists.txt·sdkconfig·idf_component.yml이 없습니다. 실제 Wi-Fi 6/Zigbee/Thread 기능을 쓰는 '진짜 펌웨어'는 위 표의 외부 프로젝트(Bruce·Marauder·CYM 등)에 살고, 이 레포는 그것들을 위한 핀맵·드라이버 포트·빌드 설정·데모를 제공합니다. README에 오타(Documention, chould)와 빈 링크도 있습니다. "보드를 사면 어떻게 켜는지 알려 주는 공식 키트"로 이해하는 게 정확합니다.
"하나의 보드, 세 갈래 길 — Arduino(C++) · PlatformIO(Bruce 빌드) · MicroPython(Python). 그리고 셋을 떠받치는 ST7789 디스플레이 드라이버."
NM-CYD-C5는 '서버·프론트엔드·인프라'로 나뉘는 웹 프로젝트가 아니라 임베디드 보드라, 기술 지도는 "같은 하드웨어를 켜는 세 개의 펌웨어 툴체인"으로 보는 게 가장 정확합니다. 각 길은 난이도·자유도가 다릅니다.
| 툴체인 | 언어 | 특징 / 누구에게 |
|---|---|---|
| Arduino IDE | C++ (Arduino 프레임워크) | 가장 입문 친화적. ESP32 보드 패키지 v3.3.5+ 설치 후 ESP32C5 Dev Module 선택. TFT_eSPI+XPT2046_Touchscreen 라이브러리로 화면·터치. Zigbee는 Tools → ZigBee Mode에서 켠다. |
| PlatformIO | C++ (주로 Bruce 펌웨어) | 전문가용. platformio.ini 빌드 플래그로 보드를 정의. 이 레포는 Bruce 펌웨어를 NM-CYD-C5로 빌드하는 환경(board = nm-cyd-c5)과 별도 ESP32-C5 DevKit 환경을 모두 제공. |
| MicroPython | Python | 가장 빠른 실험. esptool로 펌웨어를 굽고, REPL에서 즉시 코드 실행. 순수 파이썬 st7789py.py 드라이버로 화면 제어. Thonny/RT-Thread IDE 권장. |
이 레포에서 가장 '코드다운 코드'는 Demos/Arduino/libraries/TFT_eSPI/Processors/ 아래 TFT_eSPI_ESP32_C5.c(857줄)와 .h(571줄)입니다. 신형 칩 ESP32-C5의 SPI 하드웨어는 구형 ESP32와 레지스터가 달라, 표준 TFT_eSPI가 그대로 동작하지 않습니다. 그래서 개발자는 C5 전용 SPI 구동 코드를 새로 작성했습니다. README는 사용자에게 "이 두 파일을 TFT_eSPI의 Processors에 넣고, 라이브러리를 CONFIG_IDF_TARGET_ESP32C5로 인식하도록 패치하라"고 안내합니다.
TFT_eSPI는 컴파일 시점에 핀·드라이버를 헤더로 고정하는 방식입니다. NM-CYD-C5용 설정의 핵심 값:
// User_Setup-NM-CYD-C5.h 핵심 정의(요약)
#define ST7789_DRIVER // 디스플레이 컨트롤러 = ST7789
#define TFT_WIDTH 240
#define TFT_HEIGHT 320
#define SPI_FREQUENCY 20000000 // 화면 SPI 20MHz
#define SPI_TOUCH_FREQUENCY 2500000 // 터치는 2.5MHz(느리게)
PlatformIO 쪽은 platformio.ini의 빌드 플래그로 보드 특성을 통째로 기술합니다. Bruce 펌웨어를 NM-CYD-C5로 빌드하는 환경의 실제 값들:
; platformio.ini (NM-CYD-C5 / Bruce 환경, 요약)
board = nm-cyd-c5
board_build.partitions = support_files/custom_16Mb.csv
build_flags =
-DNM_CYD_C5 -DPART_16MB=1 -DHAS_TOUCH=1
-DST7789_DRIVER=1 -DTFT_WIDTH=240 -DTFT_HEIGHT=320
-DROTATION=3 -DDIMMER_SETUP=60
-DARDUINO_USB_CDC_ON_BOOT=1 -DARDUINO_USB_MODE=1
lib_deps =
ESP32Async/ESPAsyncWebServer
bblanchon/ArduinoJson @ ^7.0.4
moononournation/GFX Library for Arduino @ ^1.5.5
별도 환경(nm-cyd-c5.ini)은 순정 esp32-c5-devkitc-1 보드로 빌드하며 -DBOARD_HAS_PSRAM=1, GPS 핀(TX=5/RX=4), Grove I2C(SDA=8/SCL=9), 선택적 FM 라디오(-DFM_SI4713=1) 등을 켭니다.
PlatformIO 보드 정의(_jsonfiles/nm-cyd-c5.json)는 이 보드의 '신분증'입니다. 주요 값:
| 키 | 값 | 의미 |
|---|---|---|
| mcu | esp32c5 | RISC-V 코어 |
| f_cpu | 240000000L | 240MHz 동작 |
| f_flash / flash_mode | 80MHz / qio | 플래시 80MHz, QIO 4비트 |
| flash_size | 16MB | 최대 바이너리 16,777,216바이트 |
| maximum_ram_size | 327680 | 내부 SRAM 320KB |
| hwids (VID:PID) | 0x303A:0x1001 | USB로 보드 자동 인식 |
| connectivity | wifi, bluetooth, zigbee, thread | 네 가지 무선 모두 선언 |
| frameworks | arduino, espidf | 두 프레임워크 지원 |
| debug.openocd_target | esp32c5.cfg | JTAG 디버깅 타깃 |
"이 보드의 설계를 이해하는 열쇠는 단 하나 — 화면·터치·SD카드·무선모듈이 전부 '같은 SPI 버스'를 CS로 번갈아 쓴다."
핵심은 SPI 버스 하나(SCK=6, MISO=2, MOSI=7)를 디스플레이·터치·SD카드·외부 RF 모듈이 전부 공유한다는 점입니다. 그러면 신호선이 충돌하지 않을까요? 안 합니다 — CS(Chip Select)라는 '말할 차례' 핀으로 한 번에 하나씩만 깨우기 때문입니다.
SPI 버스는 여러 사람이 둘러앉은 회의 테이블의 공용 마이크입니다. 데이터선(MOSI/MISO)·클럭(SCK)은 공유하지만, 사회자(MCU)가 CS 핀으로 "지금은 너만 말해" 하고 한 명만 지목합니다. 디스플레이에 그릴 땐 CS=23만 낮추고, 터치를 읽을 땐 CS=1만, SD를 읽을 땐 CS=10만 낮춥니다. 그래서 선은 적게 쓰면서도 충돌이 없습니다.
그래서 Bruce 보드 지원 코드(interface.cpp)의 _setup_gpio()는 부팅 직후 모든 CS 핀(TFT·NRF24·CC1101·SD·W5500)을 HIGH로 올려 전부 '비활성'으로 만들어 둡니다 — 누가 실수로 동시에 버스를 잡는 것을 막는 안전 초기화입니다. 외부 RF 모듈(CC1101/NRF24/W5500)이 같은 CS=9, GDO0/CE/INT=8을 공유하므로, connections.md는 "어느 모듈을 쓸지 CS·CE 라인에 스위치를 달아 고르라"고 안내합니다.
왜 디스플레이 드라이버를 새로 포팅해야 했을까요? 구형 ESP32는 SPI 전송을 시작할 때 레지스터에 SPI_USR 비트만 세우면 됐는데, ESP32-C5는 전송 전에 SPI_UPDATE라는 '설정 반영' 신호를 추가로 줘야 합니다. 이 한 줄 차이 때문에 표준 TFT_eSPI가 C5에서 멈춥니다. 포트 코드의 핵심:
// TFT_eSPI_ESP32_C5.c — 전송 직전 C5 전용 핸드셰이크
#if CONFIG_IDF_TARGET_ESP32C5
*_spi_cmd = SPI_UPDATE; // "방금 바꾼 설정을 반영해"
while (*_spi_cmd & SPI_UPDATE); // 반영될 때까지 대기
#endif
*_spi_cmd = SPI_USR; // 이제 전송 시작
헤더(.h)에서는 레지스터 베이스 주소도 C5에 맞게 다시 매핑합니다 — REG_SPI_BASE → DR_REG_SPI2_BASE, SPI_MOSI_DLEN_REG → SPI_MS_DLEN_REG, SPI_PORT = SPI2_HOST. 이렇게 "같은 라이브러리, 다른 칩"을 메우는 게 임베디드 포팅의 전형적 작업입니다.
*_spi_cmd = SPI_USR;은 "SPI 명령 레지스터에 전송 시작 비트를 쓴다"는 뜻입니다. 칩이 바뀌면 이 주소와 비트 배치가 달라지기 때문에, 드라이버를 포팅한다는 건 결국 "새 칩의 레지스터 지도에 맞춰 다시 주소·비트를 적는" 일입니다.화면을 가로/세로로 돌리면(rotation), 디스플레이는 회전해도 터치 패널의 원점은 그대로라 좌표가 어긋납니다. interface.cpp의 InputHandler()는 회전값에 따라 좌표를 수학적으로 변환합니다(rotation 3의 예):
// 회전 3일 때 터치 좌표 보정
if (rotation == 3) {
t.y = (tftHeight + 20) - t.y; // 세로축 뒤집기(+오프셋 보정)
t.x = tftWidth - t.x; // 가로축 뒤집기
}
또한 이 보드엔 배터리 게이지가 없어 getBattery()는 0, isCharging()은 false를 반환하도록 정직하게 스텁(stub) 처리돼 있습니다 — 없는 하드웨어를 있는 척하지 않는 좋은 예입니다.
가장 자주 막히는 지점입니다. 보통 ESP32는 esptool로 펌웨어를 0x1000(또는 0x0)에 쓰는데, ESP32-C5의 MicroPython 펌웨어 시작 주소는 0x2000입니다. 주소를 틀리면 부팅이 안 됩니다. 올바른 절차:
esptool erase_flash
esptool --baud 961200 write_flash 0x2000 ESP32_GENERIC_C5-20260406-v1.28.0.bin
connections.md가 명시합니다 — ESP32-C5는 USB-OTG(USB 호스트/HID 흉내)를 지원하지 않습니다. Bruce류의 'BadUSB(USB 키보드 주입)' 기능을 쓰려면 별도 CH9329 USB-HID 모듈을 달고(BAD_RX=4, BAD_TX=5) 그쪽으로 키 입력을 흘려보내야 합니다. "ESP32면 다 되겠지"라고 가정하면 막히는 부분입니다.
"루트는 단출하다 — 데모(세 툴체인) + 문서(데이터시트·회로도). 무게는 Demos/ 폴더에 쏠려 있다."
interface.cpp가 하는 일입니다 — Bruce 같은 범용 펌웨어가 "화면 밝기를 올려", "터치 좌표를 줘", "GPIO를 초기화해" 같은 추상 명령을 내리면, HAL이 그것을 이 보드의 구체적 핀·레지스터 동작으로 번역합니다. 덕분에 Bruce 본체 코드는 보드가 무엇이든 똑같이 짜고, 보드마다 HAL 한 장만 갈아 끼우면 됩니다. NM-CYD-C5의 HAL은 CS 초기화·터치 보정값·밝기 PWM·GPS/RF 핀 설정을 담당합니다.이 디렉토리 배치는 레포의 정체성을 그대로 드러냅니다. 독립 앱 폴더(src/, main/)가 없고 Demos/와 Documention/만 있다는 건, 이 레포가 "펌웨어 제품"이 아니라 "보드를 켜는 출발점 키트 + 하드웨어 레퍼런스"라는 뜻입니다. 가장 기술적으로 깊은 자산은 TFT_eSPI_ESP32_C5.c/.h(신형 칩 드라이버 포트)와 SCH_*.pdf(회로도)이며, interface.cpp가 그 하드웨어와 외부 펌웨어를 잇는 다리입니다.
"이 작은 보드 하나에 디스플레이 드라이버 포팅·SPI 버스 설계·무선 프로토콜·세 가지 임베디드 툴체인이 다 들어 있다."
배울 것: "같은 라이브러리를 새 칩에 올린다"는 게 실제로 무슨 작업인지. 칩이 바뀌면 레지스터 주소·비트 배치가 달라지고, ESP32-C5처럼 SPI_UPDATE 같은 새 절차가 끼어듭니다. #if CONFIG_IDF_TARGET_ESP32C5 조건부 컴파일로 칩별 코드를 가르는 패턴도.
실습: TFT_eSPI_ESP32_C5.c에서 #if CONFIG_IDF_TARGET_ESP32C5 블록을 모두 찾아, "구형 ESP32와 무엇이 달라졌는지"를 한 표로 정리해 보기.
배울 것: 핀을 아끼려고 여러 장치가 한 SPI 버스를 공유할 때, CS(Chip Select)로 충돌 없이 번갈아 쓰는 법. 부팅 시 모든 CS를 비활성(HIGH)으로 초기화하는 안전 습관, 그리고 같은 CS를 쓰는 모듈은 스위치로 골라야 하는 한계까지.
실습: 회로도(SCH_NM-CYD-C5-v1.0.pdf)를 열어 SCK/MISO/MOSI가 LCD·터치·SD로 어떻게 갈라지는지 선을 따라가 보고, 각 장치의 CS 핀을 표로 적기.
배울 것: LCD를 처음 켤 때 보내는 초기화 명령 시퀀스(sleep-out 0x11, 픽셀 포맷 0x3A=RGB565, 포치/게이트/VCOM, 감마 커브 0xE0/0xE1…)의 의미. tft_config.py의 17개 init_cmds 튜플이 교과서입니다.
실습: tft_config.py의 초기화 명령 각 줄에 "이 명령이 무엇을 설정하는지" 주석을 달아 보기. 0x3A를 RGB666으로 바꾸면 화면이 어떻게 되는지 가설을 세워 보기.
배울 것: 같은 보드를 세 방식으로 켜 보며 트레이드오프를 체감. MicroPython은 즉시성·실험, Arduino는 풍부한 라이브러리·입문, PlatformIO는 빌드 플래그로 정밀 제어. platformio.ini의 build_flags 한 줄 한 줄이 어떤 하드웨어 특성을 켜는지.
실습: 같은 "화면에 Hello" 작업을 MicroPython과 Arduino 두 방식으로 해 보고, 코드량·반복속도·디버깅 편의를 비교한 짧은 메모 작성.
배울 것: 한 칩에서 Wi-Fi(굵은 회선)와 Zigbee/Thread(저전력 메시)가 각각 무엇에 적합한지. Zigbee의 End Device / Router / Coordinator 역할 구분, Thread가 IPv6·Matter와 이어지는 맥락. Arduino에서 Zigbee ED 모드 + 전용 파티션을 고르는 절차.
실습: "우리 집 온도센서를 만든다면 Wi-Fi·BLE·Zigbee·Thread 중 무엇을 쓸까?"를 전력·중계·인터넷연결 기준으로 표로 비교해 결정해 보기.
배울 것: 저항막 터치(XPT2046)의 원시 좌표를 화면 회전에 맞춰 변환하는 수학(축 뒤집기·오프셋), 그리고 보드별 터치 보정값(calibration)이 왜 필요한지. 없는 하드웨어(배터리)를 스텁으로 정직하게 처리하는 설계.
실습: interface.cpp의 rotation 0/2/3 좌표 변환식을 종이에 그려, 화면을 돌렸을 때 터치 점이 어디로 가는지 손으로 따라가 보기.
"보드 본체 + USB-C 케이블이면 시작 끝. 고급 기능엔 외부 모듈 몇 개가 추가된다."
| 구성요소 | 사양 |
|---|---|
| SoC | ESP32-C5-WROOM-1 · RISC-V 32비트 싱글코어 @240MHz |
| 메모리 | 16MB Flash + 8MB PSRAM · 내부 SRAM 320KB |
| 무선 | Wi-Fi 6(802.11ax) 2.4/5GHz · BLE 5 · IEEE 802.15.4(Zigbee 3.0/Thread) |
| 디스플레이 | 2.8″ TFT 240×320 · ST7789(ILI9341 교체 가능) · XPT2046 저항막 터치 |
| 저장 | microSD 슬롯(CS=10, SPI 공유) |
| 표시·입력 | WS2812 RGB LED(GPIO27) · 백라이트 PWM(GPIO25) |
| USB | USB-C ×2 (① ESP32-C5 네이티브 CDC, ② CH340 USB-UART) |
| 확장 | FPC 12핀 커넥터 · Grove I2C · LP-UART/LP-I2C(고정핀) · GPIO 헤더 |
| 항목 | 요구 / 메모 |
|---|---|
| Arduino | ESP32 보드 패키지 v3.3.5 이상 필수(C5 지원). 보드 = ESP32C5 Dev Module. |
| PlatformIO | pioarduino 플랫폼 55.03.36(Arduino 3.3.6) 이상 핀. 순정 espressif32 아님에 주의. |
| MicroPython | ESP32_GENERIC_C5-*.bin 펌웨어 + esptool. 플래시 주소 0x2000. |
| 플래싱(GUI) | 웹 플래셔 flash.nmminer.com / flash.nmiot.net에서 nm-cyd-c5 선택 → 케이블만 연결. |
| NM-RF-HAT | CC1101(서브GHz)·NRF24 등 RF 모듈(SPI 공유, CS=9/INT=8) |
| GPS | NM-ATGM336H 등(LP-UART RX=4/TX=5, 9600bps) — 플러그앤플레이 |
| CH9329 | BadUSB(USB-HID) 기능용 — C5는 USB-OTG 미지원이라 필수 |
| I2C 센서 | PN532(NFC)·BME280(환경)·Si4713(FM 송신) 등(SDA=8/SCL=9) |
이 레포의 숨은 강점은 Documention/ 폴더입니다 — ESP32-C5 공식 데이터시트, 기술 레퍼런스 매뉴얼(TRM, 14MB), 그리고 이 보드의 실제 회로도(SCH_NM-CYD-C5-v1.0.pdf)가 동봉돼 있습니다. 핀이 어디로 연결되는지 추측할 필요 없이 회로도로 확인할 수 있어, 하드웨어를 '읽는' 연습을 하기에 더없이 좋은 자료입니다.
"펌웨어 굽기 → 화면에 글자 → 인터넷 연결 → 터치 입력 → 무선 메시 → 풀스택 펌웨어 빌드, 난이도 순서대로."
esptool erase_flash 후 write_flash 0x2000 ...C5....bin으로 MicroPython을 굽고, Thonny로 st7789py.py·tft_config.py·rotations.py를 올려 실행. 화면이 색을 바꾸며 회전하면 성공.
목표: "보드가 살아 있다"를 가장 빠르게 확인. 0x2000 주소 함정을 직접 겪고 넘어서기.
MicroPython REPL에서 network.WLAN으로 5GHz 공유기에 접속해 본다. 같은 코드로 2.4GHz와 5GHz를 각각 붙여 신호·속도를 비교.
import network
wlan = network.WLAN(network.STA_IF)
wlan.active(True)
wlan.connect("내5GHz_SSID", "비밀번호")
print(wlan.isconnected(), wlan.ifconfig())
목표: "이 보드의 가장 큰 차별점(5GHz)"을 손으로 확인. 원조 CYD라면 5GHz엔 아예 못 붙는다는 점을 체감.
ESP32 보드 패키지 v3.3.5+ 설치 → C5용 TFT_eSPI_ESP32_C5.c/h를 라이브러리에 넣고 User_Setup 적용 → 터치한 자리에 점을 찍는 그림판 스케치 작성. 화면 회전을 바꿔 터치 좌표 보정도 직접 경험.
목표: 디스플레이+터치를 동시에 다루며 공유 SPI·좌표 변환을 실감. "왜 보정값이 필요한가"를 몸으로 이해.
Arduino에서 Tools → ZigBee Mode → Zigbee ED(End Device) + Zigbee 8MB with spiffs 파티션 선택. Espressif의 Zigbee 예제를 베이스로, 온도값을 Zigbee 네트워크로 보고하는 End Device를 구현해 코디네이터(허브)에 붙여 본다.
목표: Wi-Fi가 아닌 메시 IoT 프로토콜을 처음 경험. End Device/Coordinator 역할 분담과 파티션 개념을 이해.
이 레포의 platformio.ini(board=nm-cyd-c5)를 출발점으로 Bruce 펌웨어를 직접 빌드·플래시한다. interface.cpp HAL이 어떻게 보드를 추상화하는지 읽고, 5GHz Wi-Fi 스캔/워드라이빙 기능을 켜 본다.
목표: "범용 펌웨어 + 보드 HAL"이라는 임베디드 아키텍처를 끝까지 따라가기. 새 주변모듈을 하나 추가하며 connections.md 배선·CS 충돌까지 다뤄 보기.
"ESP32 기초에서 출발해 디스플레이·터치·무선·메시 IoT·펌웨어 포팅까지, NM-CYD-C5를 실습대 삼아."
| 주차 | 주제 | 핵심 학습 + NM-CYD-C5 연결점 |
|---|---|---|
| 1주 | ESP32 / 임베디드 기초 | MCU·GPIO·플래시·부팅, esptool 플래싱(0x2000 함정) → MicroPython 데모로 첫 부팅 |
| 2주 | SPI · 디스플레이 드라이버 | SPI 버스·CS 중재, ST7789 초기화 시퀀스 → tft_config.py·User_Setup |
| 3주 | 그래픽 · 터치 입력 | 프레임버퍼·폰트·회전, 저항막 터치 보정 → st7789py.py·interface.cpp |
| 4주 | Wi-Fi · BLE | STA/AP 모드, 2.4 vs 5GHz Wi-Fi 6, BLE GATT → MicroPython/Arduino 네트워킹 예제 |
| 5주 | 802.15.4 — Zigbee · Thread · Matter | 메시 토폴로지·역할(ED/Router/Coordinator), Thread↔IPv6↔Matter → Arduino Zigbee 모드 |
| 6주 | 드라이버 포팅 · 펌웨어 통합 | 레지스터 매핑·조건부 컴파일, HAL 설계 → TFT_eSPI_ESP32_C5.c 독해 + Bruce 빌드 |
이 로드맵은 "마이크로컨트롤러 + 디스플레이 + 무선통신 + 펌웨어 엔지니어링"을 한 보드로 꿰는 코스입니다. 특히 NM-CYD-C5는 "신형 칩이 나왔을 때 기존 라이브러리를 어떻게 따라가게 하는가(포팅)"라는, 책으로는 잘 안 가르치는 실전 감각을 회로도·드라이버 코드와 함께 보여 줍니다 — 임베디드를 '실물'로 배우고 싶은 사람에게 이상적입니다.
"이 문서와 저장소에서 반복되는 용어를 한곳에 모았다."
| 용어 | 의미 |
|---|---|
| CYD (Cheap Yellow Display) | 노란 기판의 저가 ESP32 터치 LCD 보드(원조 ESP32-2432S028)를 부르던 별명 → 보통명사화. NM-CYD-C5는 그 핀 호환 후속 |
| ESP32-C5 | RISC-V 240MHz, ESP32 최초의 듀얼밴드(2.4/5GHz) Wi-Fi 6 + BLE5 + 802.15.4 MCU |
| WROOM-1 | ESP32 SoC를 안테나·플래시와 함께 패키징한 모듈명. 보드엔 ESP32-C5-WROOM-1이 탑재 |
| Wi-Fi 6 (802.11ax) | 최신 Wi-Fi 표준. NM-CYD-C5는 2.4·5GHz 모두 지원(기존 ESP32는 2.4GHz만) |
| BLE 5 | Bluetooth Low Energy 5세대. SPP/HID/GATT 지원 |
| IEEE 802.15.4 | 저전력 근거리 무선 물리계층. Zigbee·Thread의 토대 |
| Zigbee 3.0 | 스마트홈 기기들이 서로 중계하는 저전력 메시 프로토콜. 역할: End Device/Router/Coordinator |
| Thread | IPv6 기반 저전력 메시. Matter 표준의 네트워크 토대 |
| ST7789 | 이 보드 LCD의 디스플레이 컨트롤러 칩(240×320). ILI9341로 교체 가능 |
| XPT2046 | 저항막 터치 컨트롤러. 누른 좌표를 SPI로 읽어 줌 |
| TFT_eSPI | Bodmer의 아두이노용 고속 디스플레이 라이브러리. 이 레포가 ESP32-C5로 포팅 |
| SPI · CS(Chip Select) | 직렬 통신 버스. 여러 장치가 SCK/MOSI/MISO를 공유하고, CS로 한 번에 하나만 활성화 |
| FSPI / SPI2 | ESP32-C5에서 외부 장치용 SPI 컨트롤러 이름(SPI2_HOST). 드라이버 포트가 이 레지스터를 사용 |
| SPI_UPDATE | ESP32-C5가 전송 전에 설정 반영을 요구하는 추가 핸드셰이크 비트. 포팅의 핵심 차이 |
| PSRAM | 외부 의사정적 RAM. 큰 프레임버퍼·버퍼링에 사용(이 보드 8MB) |
| CH340 | USB↔UART 변환 칩. 둘째 USB-C 포트가 이를 통해 시리얼 프로그래밍 |
| CH9329 | USB-HID 변환 모듈. C5는 USB-OTG 미지원이라 BadUSB엔 별도 부착 필요 |
| WS2812 | 한 신호선으로 제어하는 주소지정 RGB LED(GPIO27, GRB 순서) |
| FPC 커넥터 | 얇은 플렉시블 케이블용 12핀 단자. 외부 모듈 연결을 깔끔하게 |
| LP-UART / LP-I2C | ESP32-C5의 저전력(Low-Power) UART/I2C. 핀이 하드웨어로 고정(UART TX=11/RX=12, I2C SDA=4/SCL=5) |
| esptool | ESP32 펌웨어를 플래시에 굽는 CLI 도구. C5는 0x2000 주소 사용 |
| PlatformIO | 임베디드용 빌드/의존성 관리 도구. platformio.ini 플래그로 보드 정의 |
| MicroPython | MCU에서 돌아가는 파이썬 구현. REPL로 즉시 실험 가능 |
| HAL | 하드웨어 추상화 계층. 범용 펌웨어(Bruce)와 보드별 핀/레지스터를 잇는 다리(interface.cpp) |
| Bruce / Marauder / CYM | 이 보드에서 돌아가는 무선/보안 도구 펌웨어들. 레포는 이들을 위한 보드 지원을 제공 |