GitHub 트렌딩 딥다이브 · 2026-06-24 · TrendShift 라이브 멘션

NM-CYD-C5 딥다이브
— ESP32-C5 기반, 'ESP32 최초의 듀얼밴드 Wi-Fi 6'를 단 2.8″ 터치 개발보드 '값싼 노란 디스플레이'

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)

목차
  1. 프로젝트 한줄 요약
  2. 왜 주목받는가
  3. 기술 스택 전체 지도
  4. 아키텍처 심화 분석 (한 SPI 버스에 모든 걸 매단 보드)
  5. 디렉토리 구조 해부
  6. 학습 포인트 (기술별)
  7. 하드웨어 / 시스템 요구사항
  8. 직접 해볼 수 있는 실습 과제
  9. 관련 기술 심화 학습 로드맵
  10. 핵심 키워드 사전
  11. 참고 링크

1프로젝트 한줄 요약

"기존에 가장 인기 있던 ESP32 터치보드(CYD)와 똑같은 모양·핀배치에, ESP32 최초로 5GHz Wi-Fi·Zigbee·Thread를 얹은 '업그레이드판' 보드와 그 사용 설명서."

한 줄로

NM-CYD-C5는 '값싼 노란 디스플레이(CYD)' 보드의 차세대 버전으로, 같은 자리·같은 핀에 꽂으면서 5GHz Wi-Fi 6 · Zigbee · Thread를 새로 얻은 ESP32-C5 터치 개발보드다 — 그리고 이 레포는 그 보드를 세 가지 방식(Arduino·PlatformIO·MicroPython)으로 켜는 법을 모아 둔 공식 안내서다.

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개 펌웨어 프로젝트 목록이 들어 있습니다.

용어
CYD (Cheap Yellow Display, 값싼 노란 디스플레이)
기판이 노란색이라 붙은 별명. 원래는 ESP32-2432S028이라는 특정 보드(2.8″ 320×240 터치 LCD + ESP32)를 가리켰는데, 너무 인기를 끌어 "LCD가 달린 값싼 ESP32 보드" 전체를 부르는 보통명사가 됐습니다. witnessmenow가 만든 ESP32-Cheap-Yellow-Display 가이드 저장소가 사실상의 표준 문서이고, NM-CYD-C5는 그 보드와 핀·치수를 일부러 똑같이 맞춘 후속 호환 보드입니다.
용어
ESP32-C5
Espressif의 신형 마이크로컨트롤러(MCU). RISC-V 32비트 싱글코어 @240MHz를 쓰며, ESP32 제품군에서 처음으로 2.4GHz와 5GHz를 모두 지원하는 '듀얼밴드' Wi-Fi 6(802.11ax)를 탑재했습니다. 여기에 Bluetooth 5(LE), 그리고 IEEE 802.15.4 라디오로 Zigbee 3.0·Thread까지 됩니다. 한 칩으로 Wi-Fi·BLE·메시 IoT를 모두 커버하는 게 강점입니다.

조금 더 구체적으로, 이 보드의 두뇌는 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를 처음 공부하는 사람에게 실물 하드웨어로 배우는 좋은 교본입니다.

2왜 주목받는가

"인기 보드의 '핀 호환 업그레이드'라는 영리한 포지셔닝 + ESP32 최초의 5GHz·Zigbee·Thread + 보안·펜테스트 펌웨어 붐."

① '깨지 않는 업그레이드' — 생태계를 그대로 물려받는다

새 하드웨어의 가장 큰 적은 "쓸 만한 소프트웨어가 없다"입니다. NM-CYD-C5는 이 문제를 정공법으로 피합니다 — 원조 CYD와 치수·핀배치·인터페이스를 일부러 똑같이 맞춰서, 이미 존재하는 수많은 CYD용 펌웨어와 케이스·액세서리를 거의 그대로 재사용하게 했습니다. README의 표현으로 "seamless replacement(매끄러운 교체)". 사용자는 익숙한 보드의 모양 그대로, 알맹이만 신형 칩으로 바꾼 셈입니다.

비유

전구 소켓은 그대로 두고 백열등을 LED로 바꾸는 것과 같습니다. 소켓(핀·치수)을 새로 설계했다면 기존 등기구(펌웨어·케이스)를 전부 다시 만들어야 하지만, 소켓을 표준에 맞췄기에 알맹이(ESP32-C5)만 갈아 끼우면 밝기(5GHz Wi-Fi)와 기능(Zigbee·Thread)이 올라갑니다.

② ESP32 최초의 듀얼밴드 — 스펙 비교표

가장 큰 기술적 뉴스는 5GHz Wi-Fi 6입니다. 지난 10년간 모든 ESP32는 2.4GHz 전용이었는데, 2.4GHz는 전자레인지·블루투스·이웃집 공유기로 극심하게 혼잡합니다. 5GHz로 올라가면 간섭이 줄고 처리량이 늘죠. 여기에 Zigbee·Thread까지 더해, 이 작은 보드 하나가 Wi-Fi 허브이자 스마트홈 메시 노드가 될 수 있습니다.

항목원조 CYD (ESP32-2432S028)NM-CYD-C5
Wi-Fi 대역2.4GHz2.4 + 5GHz
Wi-Fi 표준802.11 b/g/n802.11ax (Wi-Fi 6)
Zigbee없음Zigbee 3.0
Thread없음Thread 1.3
Flash4MB16MB
PSRAM없음8MB
코어Xtensa 듀얼코어RISC-V 싱글코어 @240MHz
용어
Zigbee 3.0 · Thread · IEEE 802.15.4
IEEE 802.15.4는 저전력 근거리 무선의 물리계층 표준입니다. 그 위에 Zigbee 3.0(스마트홈 기기들이 서로 중계하는 메시 네트워크 프로토콜)와 Thread(같은 메시인데 IPv6 기반이라 인터넷 주소 체계와 자연스럽게 이어지고, Matter 표준의 토대)가 올라갑니다. Wi-Fi가 '집의 굵은 인터넷 회선'이라면, Zigbee/Thread는 '전구·센서·도어락이 적은 전력으로 서로 손잡는 가는 신경망'입니다.

③ 시기를 탔다 — 보안·펜테스트·AI 에이전트 펌웨어 붐

마침 ESP32 기반 휴대용 무선 보안 도구가 유행입니다. README가 직접 연결해 두는 펌웨어들이 바로 그 흐름의 한복판에 있습니다.

연계 펌웨어무엇
BruceFlipper Zero류의 다기능 무선/RF 도구 펌웨어. 이 레포의 PlatformIO 빌드가 곧 Bruce용 보드 지원.
ESP32MarauderWi-Fi/BLE 분석·스니핑 도구. RockBase가 NM-CYD-C5용 포크를 운영.
CYM (Cheap Yellow Monster)NM-CYD-C5 전용 터치 기반 Wi-Fi 보안 툴킷.
NMMiner비트코인 솔로 복권 채굴기(학습·재미용). 웹 플래셔 제공.
ESP-ClawEspressif의 IoT용 채팅 코딩 AI 에이전트 프레임워크(C로 재구현). 0.3.0이 NM-CYD-C5에서 동작하도록 갱신됨.
LauncherM5Stack·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)와 빈 링크도 있습니다. "보드를 사면 어떻게 켜는지 알려 주는 공식 키트"로 이해하는 게 정확합니다.

3기술 스택 전체 지도

"하나의 보드, 세 갈래 길 — Arduino(C++) · PlatformIO(Bruce 빌드) · MicroPython(Python). 그리고 셋을 떠받치는 ST7789 디스플레이 드라이버."

NM-CYD-C5는 '서버·프론트엔드·인프라'로 나뉘는 웹 프로젝트가 아니라 임베디드 보드라, 기술 지도는 "같은 하드웨어를 켜는 세 개의 펌웨어 툴체인"으로 보는 게 가장 정확합니다. 각 길은 난이도·자유도가 다릅니다.

① 펌웨어 툴체인 세 갈래

툴체인언어특징 / 누구에게
Arduino IDEC++ (Arduino 프레임워크)가장 입문 친화적. ESP32 보드 패키지 v3.3.5+ 설치 후 ESP32C5 Dev Module 선택. TFT_eSPI+XPT2046_Touchscreen 라이브러리로 화면·터치. Zigbee는 Tools → ZigBee Mode에서 켠다.
PlatformIOC++ (주로 Bruce 펌웨어)전문가용. platformio.ini 빌드 플래그로 보드를 정의. 이 레포는 Bruce 펌웨어를 NM-CYD-C5로 빌드하는 환경(board = nm-cyd-c5)과 별도 ESP32-C5 DevKit 환경을 모두 제공.
MicroPythonPython가장 빠른 실험. esptool로 펌웨어를 굽고, REPL에서 즉시 코드 실행. 순수 파이썬 st7789py.py 드라이버로 화면 제어. Thonny/RT-Thread IDE 권장.
용어
TFT_eSPI · ST7789 · XPT2046
ST7789는 이 보드 LCD의 디스플레이 컨트롤러 칩입니다 — MCU가 보낸 픽셀을 받아 실제 화면에 그립니다(240×320). XPT2046저항막 터치 컨트롤러로, 손가락이 누른 좌표를 읽어 줍니다. TFT_eSPI는 Bodmer가 만든 아두이노용 고속 디스플레이 라이브러리로, 수많은 ESP32 LCD 보드의 사실상 표준입니다. 이 레포의 핵심 작업 중 하나가 바로 이 TFT_eSPI를 신형 ESP32-C5에 맞게 포팅한 것입니다(아래 4장 참조).

② 진짜 알맹이 — ESP32-C5용 TFT_eSPI 드라이버 포트

이 레포에서 가장 '코드다운 코드'는 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로 인식하도록 패치하라"고 안내합니다.

디스플레이 설정 (User_Setup-NM-CYD-C5.h 요지)

핀과 속도를 헤더 한 장으로 못박는다

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 쪽은 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)는 이 보드의 '신분증'입니다. 주요 값:

의미
mcuesp32c5RISC-V 코어
f_cpu240000000L240MHz 동작
f_flash / flash_mode80MHz / qio플래시 80MHz, QIO 4비트
flash_size16MB최대 바이너리 16,777,216바이트
maximum_ram_size327680내부 SRAM 320KB
hwids (VID:PID)0x303A:0x1001USB로 보드 자동 인식
connectivitywifi, bluetooth, zigbee, thread네 가지 무선 모두 선언
frameworksarduino, espidf두 프레임워크 지원
debug.openocd_targetesp32c5.cfgJTAG 디버깅 타깃
용어
CH340 · CH9329 · WS2812 · FPC
CH340 = USB를 시리얼(UART)로 바꿔 주는 흔한 변환칩(둘째 USB-C가 이걸 통함). CH9329 = USB-OTG가 없는 ESP32-C5에서 'BadUSB(키보드 흉내)'를 하려면 따로 붙여야 하는 USB-HID 변환 모듈. WS2812 = 한 가닥 신호선으로 색을 제어하는 주소지정 RGB LED(보드의 GPIO27). FPC = 얇은 플렉시블 케이블 커넥터로, 외부 모듈을 깔끔하게 연결하는 12핀 단자.

4아키텍처 심화 분석 (한 SPI 버스에 모든 걸 매단 보드)

"이 보드의 설계를 이해하는 열쇠는 단 하나 — 화면·터치·SD카드·무선모듈이 전부 '같은 SPI 버스'를 CS로 번갈아 쓴다."

전체 하드웨어 구조 한 장

ESP32-C5-WROOM-1 (RISC-V @240MHz, 16MB Flash, 8MB PSRAM) ┌──────────────────────────────────────────────────────────┐ 무선 ◄──┤ Wi-Fi6 2.4/5GHz │ BLE 5 │ 802.15.4 (Zigbee / Thread) │ └───────────────────────────┬──────────────────────────────┘ │ SPI2 / FSPI 버스 (SCK=6, MISO=2, MOSI=7) ── 모두가 공유 ┌───────────┬────────────┬───────────────┬───────────────────────┐ ST7789 LCD XPT2046 microSD CC1101 / NRF24 / W5500 240x320 터치 카드 (외부 RF/이더넷 모듈) CS=23 CS=1 CS=10 CS=9, GDO0/CE/INT=8 DC=24, BL=25 │ ├── WS2812 RGB LED ........ GPIO27 ├── GPS (LP-UART) ......... RX=4 / TX=5 (NM-ATGM336H, 9600bps) ├── 확장 I2C (Grove) ...... SDA=8 / SCL=9 (PN532 / BME280 / FM) ├── LP-UART (고정) ........ TX=11 / RX=12 ├── LP-I2C (고정) ........ SDA=4 / SCL=5 └── USB-C #1: ESP32-C5 네이티브(CDC) │ USB-C #2: CH340 UART

핵심은 SPI 버스 하나(SCK=6, MISO=2, MOSI=7)를 디스플레이·터치·SD카드·외부 RF 모듈이 전부 공유한다는 점입니다. 그러면 신호선이 충돌하지 않을까요? 안 합니다 — CS(Chip Select)라는 '말할 차례' 핀으로 한 번에 하나씩만 깨우기 때문입니다.

설계 ① — 공유 SPI 버스와 CS 중재

비유

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-C5만의 SPI '핸드셰이크' (포팅의 핵심)

왜 디스플레이 드라이버를 새로 포팅해야 했을까요? 구형 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. 이렇게 "같은 라이브러리, 다른 칩"을 메우는 게 임베디드 포팅의 전형적 작업입니다.

용어
레지스터(register) / 메모리 맵 I/O
MCU 내부의 주변장치(SPI·UART·타이머)는 특정 메모리 주소에 매핑돼 있어, 그 주소에 값을 쓰면 하드웨어가 동작합니다. *_spi_cmd = SPI_USR;은 "SPI 명령 레지스터에 전송 시작 비트를 쓴다"는 뜻입니다. 칩이 바뀌면 이 주소와 비트 배치가 달라지기 때문에, 드라이버를 포팅한다는 건 결국 "새 칩의 레지스터 지도에 맞춰 다시 주소·비트를 적는" 일입니다.

설계 ③ — 회전에 따라 터치 좌표를 뒤집는다

화면을 가로/세로로 돌리면(rotation), 디스플레이는 회전해도 터치 패널의 원점은 그대로라 좌표가 어긋납니다. interface.cppInputHandler()는 회전값에 따라 좌표를 수학적으로 변환합니다(rotation 3의 예):

// 회전 3일 때 터치 좌표 보정
if (rotation == 3) {
    t.y = (tftHeight + 20) - t.y;   // 세로축 뒤집기(+오프셋 보정)
    t.x = tftWidth - t.x;           // 가로축 뒤집기
}

또한 이 보드엔 배터리 게이지가 없어 getBattery()는 0, isCharging()은 false를 반환하도록 정직하게 스텁(stub) 처리돼 있습니다 — 없는 하드웨어를 있는 척하지 않는 좋은 예입니다.

함정
ESP32-C5 MicroPython은 펌웨어를 0x2000 주소에 구워야 한다

가장 자주 막히는 지점입니다. 보통 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
함정
ESP32-C5는 USB-OTG가 없다 → BadUSB엔 CH9329 모듈 필요

connections.md가 명시합니다 — ESP32-C5는 USB-OTG(USB 호스트/HID 흉내)를 지원하지 않습니다. Bruce류의 'BadUSB(USB 키보드 주입)' 기능을 쓰려면 별도 CH9329 USB-HID 모듈을 달고(BAD_RX=4, BAD_TX=5) 그쪽으로 키 입력을 흘려보내야 합니다. "ESP32면 다 되겠지"라고 가정하면 막히는 부분입니다.

5디렉토리 구조 해부

"루트는 단출하다 — 데모(세 툴체인) + 문서(데이터시트·회로도). 무게는 Demos/ 폴더에 쏠려 있다."

최상위 한눈에

NM-CYD-C5/ ├── README.md ← 보드 소개·스펙·핀맵·연계 프로젝트 목록 ├── Demos/ ← ★ 핵심: 세 툴체인 데모 │ ├── Arduino/ │ │ ├── README.md ← Arduino IDE 설정, ZigBee 개발 가이드 │ │ └── libraries/TFT_eSPI/ │ │ ├── Processors/ │ │ │ ├── TFT_eSPI_ESP32_C5.c ← C5 전용 SPI 드라이버(857줄) │ │ │ └── TFT_eSPI_ESP32_C5.h ← C5 레지스터/SPI2 정의(571줄) │ │ └── User_Setup-NM-CYD-C5.h ← ST7789 핀/주파수 설정(391줄) │ ├── MicroPython/ │ │ ├── README.md ← esptool 플래싱·Wi-Fi 예제 │ │ └── rotations/ │ │ ├── rotations.py ← 회전/색상 데모(98줄) │ │ ├── st7789py.py ← 순수 파이썬 ST7789 드라이버(994줄) │ │ ├── tft_config.py ← NM-CYD-C5 ST7789 초기화+핀(58줄) │ │ └── vga1_16x16.py ← 비트맵 폰트 │ └── Platformio/ │ ├── _jsonfiles/nm-cyd-c5.json ← PlatformIO 보드 매니페스트 │ └── nm-cyd-c5/ │ ├── platformio.ini ← Bruce 빌드 환경 │ ├── nm-cyd-c5.ini ← 순정 C5 DevKit 환경(GPS/IR/FM) │ ├── connections.md ← 외부 모듈 배선(CC1101/NRF24/W5500/GPS/IR) │ ├── interface.cpp ← Bruce 보드 HAL(174줄) │ └── pins_arduino.h ← 보드 핀맵 변종 └── Documention/ ← (오타) 하드웨어 문서 ├── 1-datasheet/ ← ESP32-C5 데이터시트 + TRM(14MB) PDF ├── 2-sch/SCH_NM-CYD-C5-v1.0.pdf ← 보드 회로도 └── pics/ ← 핀아웃·실물·비교 이미지 16장
용어
HAL (Hardware Abstraction Layer, 하드웨어 추상화 계층)
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가 그 하드웨어와 외부 펌웨어를 잇는 다리입니다.

6학습 포인트 (기술별 — 배울 것 + 실습 아이디어)

"이 작은 보드 하나에 디스플레이 드라이버 포팅·SPI 버스 설계·무선 프로토콜·세 가지 임베디드 툴체인이 다 들어 있다."

① 디스플레이 드라이버 포팅 (레지스터 · SPI 핸드셰이크)

배울 것: "같은 라이브러리를 새 칩에 올린다"는 게 실제로 무슨 작업인지. 칩이 바뀌면 레지스터 주소·비트 배치가 달라지고, ESP32-C5처럼 SPI_UPDATE 같은 새 절차가 끼어듭니다. #if CONFIG_IDF_TARGET_ESP32C5 조건부 컴파일로 칩별 코드를 가르는 패턴도.

실습: TFT_eSPI_ESP32_C5.c에서 #if CONFIG_IDF_TARGET_ESP32C5 블록을 모두 찾아, "구형 ESP32와 무엇이 달라졌는지"를 한 표로 정리해 보기.

② 공유 SPI 버스 + CS 중재

배울 것: 핀을 아끼려고 여러 장치가 한 SPI 버스를 공유할 때, CS(Chip Select)로 충돌 없이 번갈아 쓰는 법. 부팅 시 모든 CS를 비활성(HIGH)으로 초기화하는 안전 습관, 그리고 같은 CS를 쓰는 모듈은 스위치로 골라야 하는 한계까지.

실습: 회로도(SCH_NM-CYD-C5-v1.0.pdf)를 열어 SCK/MISO/MOSI가 LCD·터치·SD로 어떻게 갈라지는지 선을 따라가 보고, 각 장치의 CS 핀을 표로 적기.

③ ST7789 디스플레이 bring-up (초기화 시퀀스)

배울 것: LCD를 처음 켤 때 보내는 초기화 명령 시퀀스(sleep-out 0x11, 픽셀 포맷 0x3A=RGB565, 포치/게이트/VCOM, 감마 커브 0xE0/0xE1…)의 의미. tft_config.py의 17개 init_cmds 튜플이 교과서입니다.

실습: tft_config.py의 초기화 명령 각 줄에 "이 명령이 무엇을 설정하는지" 주석을 달아 보기. 0x3A를 RGB666으로 바꾸면 화면이 어떻게 되는지 가설을 세워 보기.

④ 세 임베디드 툴체인 비교 (Arduino vs PlatformIO vs MicroPython)

배울 것: 같은 보드를 세 방식으로 켜 보며 트레이드오프를 체감. MicroPython은 즉시성·실험, Arduino는 풍부한 라이브러리·입문, PlatformIO는 빌드 플래그로 정밀 제어. platformio.inibuild_flags 한 줄 한 줄이 어떤 하드웨어 특성을 켜는지.

실습: 같은 "화면에 Hello" 작업을 MicroPython과 Arduino 두 방식으로 해 보고, 코드량·반복속도·디버깅 편의를 비교한 짧은 메모 작성.

⑤ 무선 — Wi-Fi 6 · BLE · 802.15.4 (Zigbee/Thread)

배울 것: 한 칩에서 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 좌표 변환식을 종이에 그려, 화면을 돌렸을 때 터치 점이 어디로 가는지 손으로 따라가 보기.

7하드웨어 / 시스템 요구사항

"보드 본체 + USB-C 케이블이면 시작 끝. 고급 기능엔 외부 모듈 몇 개가 추가된다."

보드 핵심 스펙

구성요소사양
SoCESP32-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)
USBUSB-C ×2 (① ESP32-C5 네이티브 CDC, ② CH340 USB-UART)
확장FPC 12핀 커넥터 · Grove I2C · LP-UART/LP-I2C(고정핀) · GPIO 헤더

개발 환경 요구사항

항목요구 / 메모
ArduinoESP32 보드 패키지 v3.3.5 이상 필수(C5 지원). 보드 = ESP32C5 Dev Module.
PlatformIOpioarduino 플랫폼 55.03.36(Arduino 3.3.6) 이상 핀. 순정 espressif32 아님에 주의.
MicroPythonESP32_GENERIC_C5-*.bin 펌웨어 + esptool. 플래시 주소 0x2000.
플래싱(GUI)웹 플래셔 flash.nmminer.com / flash.nmiot.net에서 nm-cyd-c5 선택 → 케이블만 연결.

선택적 외부 모듈(고급 기능)

NM-RF-HATCC1101(서브GHz)·NRF24 등 RF 모듈(SPI 공유, CS=9/INT=8)
GPSNM-ATGM336H 등(LP-UART RX=4/TX=5, 9600bps) — 플러그앤플레이
CH9329BadUSB(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)가 동봉돼 있습니다. 핀이 어디로 연결되는지 추측할 필요 없이 회로도로 확인할 수 있어, 하드웨어를 '읽는' 연습을 하기에 더없이 좋은 자료입니다.

8직접 해볼 수 있는 실습 과제

"펌웨어 굽기 → 화면에 글자 → 인터넷 연결 → 터치 입력 → 무선 메시 → 풀스택 펌웨어 빌드, 난이도 순서대로."

과제 1난이도 ★☆☆☆☆ · 입문

MicroPython 굽고 화면 회전 데모 돌리기

esptool erase_flashwrite_flash 0x2000 ...C5....bin으로 MicroPython을 굽고, Thonny로 st7789py.py·tft_config.py·rotations.py를 올려 실행. 화면이 색을 바꾸며 회전하면 성공.

목표: "보드가 살아 있다"를 가장 빠르게 확인. 0x2000 주소 함정을 직접 겪고 넘어서기.

과제 2난이도 ★★☆☆☆ · 초급

5GHz Wi-Fi에 붙어 보기 (이전 ESP32로는 불가능)

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엔 아예 못 붙는다는 점을 체감.

과제 3난이도 ★★★☆☆ · 중급

Arduino + TFT_eSPI로 터치 그림판 만들기

ESP32 보드 패키지 v3.3.5+ 설치 → C5용 TFT_eSPI_ESP32_C5.c/h를 라이브러리에 넣고 User_Setup 적용 → 터치한 자리에 점을 찍는 그림판 스케치 작성. 화면 회전을 바꿔 터치 좌표 보정도 직접 경험.

목표: 디스플레이+터치를 동시에 다루며 공유 SPI·좌표 변환을 실감. "왜 보정값이 필요한가"를 몸으로 이해.

과제 4난이도 ★★★★☆ · 중상

Zigbee End Device 온도 센서 만들기

Arduino에서 Tools → ZigBee Mode → Zigbee ED(End Device) + Zigbee 8MB with spiffs 파티션 선택. Espressif의 Zigbee 예제를 베이스로, 온도값을 Zigbee 네트워크로 보고하는 End Device를 구현해 코디네이터(허브)에 붙여 본다.

목표: Wi-Fi가 아닌 메시 IoT 프로토콜을 처음 경험. End Device/Coordinator 역할 분담과 파티션 개념을 이해.

과제 5난이도 ★★★★★ · 고급

PlatformIO로 Bruce 펌웨어를 빌드해 5GHz 워드라이버로

이 레포의 platformio.ini(board=nm-cyd-c5)를 출발점으로 Bruce 펌웨어를 직접 빌드·플래시한다. interface.cpp HAL이 어떻게 보드를 추상화하는지 읽고, 5GHz Wi-Fi 스캔/워드라이빙 기능을 켜 본다.

목표: "범용 펌웨어 + 보드 HAL"이라는 임베디드 아키텍처를 끝까지 따라가기. 새 주변모듈을 하나 추가하며 connections.md 배선·CS 충돌까지 다뤄 보기.

9관련 기술 심화 학습 로드맵 (6주 플랜)

"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 · BLESTA/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는 "신형 칩이 나왔을 때 기존 라이브러리를 어떻게 따라가게 하는가(포팅)"라는, 책으로는 잘 안 가르치는 실전 감각을 회로도·드라이버 코드와 함께 보여 줍니다 — 임베디드를 '실물'로 배우고 싶은 사람에게 이상적입니다.

10핵심 키워드 사전

"이 문서와 저장소에서 반복되는 용어를 한곳에 모았다."

용어의미
CYD (Cheap Yellow Display)노란 기판의 저가 ESP32 터치 LCD 보드(원조 ESP32-2432S028)를 부르던 별명 → 보통명사화. NM-CYD-C5는 그 핀 호환 후속
ESP32-C5RISC-V 240MHz, ESP32 최초의 듀얼밴드(2.4/5GHz) Wi-Fi 6 + BLE5 + 802.15.4 MCU
WROOM-1ESP32 SoC를 안테나·플래시와 함께 패키징한 모듈명. 보드엔 ESP32-C5-WROOM-1이 탑재
Wi-Fi 6 (802.11ax)최신 Wi-Fi 표준. NM-CYD-C5는 2.4·5GHz 모두 지원(기존 ESP32는 2.4GHz만)
BLE 5Bluetooth Low Energy 5세대. SPP/HID/GATT 지원
IEEE 802.15.4저전력 근거리 무선 물리계층. Zigbee·Thread의 토대
Zigbee 3.0스마트홈 기기들이 서로 중계하는 저전력 메시 프로토콜. 역할: End Device/Router/Coordinator
ThreadIPv6 기반 저전력 메시. Matter 표준의 네트워크 토대
ST7789이 보드 LCD의 디스플레이 컨트롤러 칩(240×320). ILI9341로 교체 가능
XPT2046저항막 터치 컨트롤러. 누른 좌표를 SPI로 읽어 줌
TFT_eSPIBodmer의 아두이노용 고속 디스플레이 라이브러리. 이 레포가 ESP32-C5로 포팅
SPI · CS(Chip Select)직렬 통신 버스. 여러 장치가 SCK/MOSI/MISO를 공유하고, CS로 한 번에 하나만 활성화
FSPI / SPI2ESP32-C5에서 외부 장치용 SPI 컨트롤러 이름(SPI2_HOST). 드라이버 포트가 이 레지스터를 사용
SPI_UPDATEESP32-C5가 전송 전에 설정 반영을 요구하는 추가 핸드셰이크 비트. 포팅의 핵심 차이
PSRAM외부 의사정적 RAM. 큰 프레임버퍼·버퍼링에 사용(이 보드 8MB)
CH340USB↔UART 변환 칩. 둘째 USB-C 포트가 이를 통해 시리얼 프로그래밍
CH9329USB-HID 변환 모듈. C5는 USB-OTG 미지원이라 BadUSB엔 별도 부착 필요
WS2812한 신호선으로 제어하는 주소지정 RGB LED(GPIO27, GRB 순서)
FPC 커넥터얇은 플렉시블 케이블용 12핀 단자. 외부 모듈 연결을 깔끔하게
LP-UART / LP-I2CESP32-C5의 저전력(Low-Power) UART/I2C. 핀이 하드웨어로 고정(UART TX=11/RX=12, I2C SDA=4/SCL=5)
esptoolESP32 펌웨어를 플래시에 굽는 CLI 도구. C5는 0x2000 주소 사용
PlatformIO임베디드용 빌드/의존성 관리 도구. platformio.ini 플래그로 보드 정의
MicroPythonMCU에서 돌아가는 파이썬 구현. REPL로 즉시 실험 가능
HAL하드웨어 추상화 계층. 범용 펌웨어(Bruce)와 보드별 핀/레지스터를 잇는 다리(interface.cpp)
Bruce / Marauder / CYM이 보드에서 돌아가는 무선/보안 도구 펌웨어들. 레포는 이들을 위한 보드 지원을 제공

11참고 링크