ProMicro RP2040 (제네릭 클론, USB-C · 16 MB) + 택트 스위치 8개.
WS2812B 1개는 외부 모듈로 3.3 V에서 구동합니다 — GP17의 온보드 LED는 주소지정 방식이
아니라 이 펌웨어로 못 씁니다(07절).
전원은 PC USB 하나뿐입니다. 핀 번호의 유일한 진실 공급원은
firmware/src/Config.h이고, 핀을 바꾸려면 이 문서가 아니라 그 파일을 고칩니다.
ATmega32u4 판은 wiring.html, 사용법은 manual.html입니다.
이 문서는 하드웨어 기준이 정해진 포팅 가이드이고, 펌웨어 포팅은 아직 되어 있지 않습니다.
Config.h·Storage.h·SerialProtocol.cpp에 손댈 곳이
05 · 06절에 전부 나열돼 있습니다. 그 전에는 이 보드로 빌드해도 올라가지 않습니다.
| ProMicro RP2040 | 연결 대상 | 중간에 들어가는 것 | 비고 |
|---|---|---|---|
| GP2 – GP9 | 택트 스위치 8개의 한쪽 다리 | 없음 | 왼쪽 열에 8개가 연속으로 있음. 내부 풀업, 외부 저항 불필요 |
| GND ×2 | 스위치 8개의 반대쪽 다리 | 없음 | 버튼 블록 바로 위에 나란히 2개. 모든 GND는 한 점으로 |
| 3V3 | 모듈 5V / VCC | 100 µF (3V3–GND, 모듈 가까이) | 5V 핀이 아닙니다. 오른쪽 열 위에서 5번째 |
| GND | 모듈 GND | 없음 | 오른쪽 열 위에서 3번째. 버튼 GND와 같은 네트 |
| GP21 | 모듈 DIN | 330 Ω 직렬 저항 | 오른쪽 열 맨 아래 |
납땜할 선은 버튼 8가닥 + GND 1가닥(왼쪽 열)과 LED 3가닥(오른쪽 열)입니다.
32u4 판과 부품 구성은 같지만, 전원을 3V3에서 뽑기 때문에 레벨 시프터가 필요
없다는 점이 다릅니다 — 그 이유는 07절에 있습니다.
GP17의 온보드 LED는 이 프로젝트에서 쓸 수 없습니다. 이 보드에는 GP17에 RGB LED가
달려 있지만 WS2812 계열의 주소지정 소자가 아니라서, LedController가 쓰는
Adafruit_NeoPixel로는 구동되지 않습니다. LED 기능을 쓰려면 외부 WS2812B 모듈이
선택이 아니라 필수입니다. 펌웨어는 GP17을 건드리지 않습니다.
버튼이 한쪽 열에 다 모입니다. 32u4 Pro Micro는 D11이 없어서 여덟 번째 버튼만 반대쪽 줄(D10)로 넘어갔고, 그게 조립에서 가장 자주 틀리는 지점이었습니다. RP2040 판은 GP2–GP9가 왼쪽 열에 연속으로 있고 바로 위에 GND가 2개 있어서, 왼쪽 한 변만 배선하면 키패드가 완성됩니다.
USB-C가 위로 오게 세워 놓고 부품면을 위에서 본 그림. 왼쪽 열
GND·GND 다음의 GP2부터 GP9까지 여덟 칸이 그대로 버튼 1–8입니다. 오른쪽 열은
버튼에 쓰지 않고, 외부 WS2812B가 3V3·GND·GP21
세 자리를 씁니다.
RP2040 핀은 5 V를 못 견딥니다. 32u4 판과 달리 로직이 3.3 V이고 GPIO에 5 V 톨러런스가
없습니다. 이 프로젝트는 버튼을 GND로 떨어뜨릴 뿐이라 문제가 없지만, 5V 핀에서
나온 선을 GPIO 쪽으로 끌고 가는 배선은 절대 만들지 마세요. 5V는 USB VBUS가
그대로 나오는 핀이고, 로직 전압은 3V3입니다.
외부 WS2812B를 3.3 V로 구동하는 구성입니다. LED 없이 키패드만 먼저 만들어도 펌웨어는 그대로 동작하므로, 2·5단계를 나중으로 미뤄도 됩니다.
3V3·GND·GP21 세 자리뿐이라
잘라 쓰는 헤더로 세 칸만 꽂아도 되지만, 빵판에 세울 거면 12핀을 통째로 다는 편이 보드가
안 흔들립니다.3V3·GND·GP21에 연결하고
07절의 판정 스케치를 올립니다. 빨강·초록·파랑·흰색이 차례로 도는데,
파랑이 아예 안 뜨면 그 모듈은 3.3 V로 못 씁니다 — 다이오드 방식으로 바꿔야 하고
배선이 달라지므로, 확정하고 납땜을 시작하세요. 이 단계가 5분이고 나중에 뜯어내는 것이
30분입니다.MK_KEY_PINS 배열 순서 = GP2가 1번, GP9가 8번입니다.5V/VCC → 보드 3V3.
5V 핀이 아닙니다 — 여기가 이 조립에서 유일하게 치명적인 지점입니다.GND → 보드 오른쪽 열 GND. 버튼 GND와 다른 핀이지만
보드 안에서 같은 네트라 상관없습니다.DIN → 330 Ω 직렬 → 보드 GP21.
저항은 모듈 쪽에 붙입니다.3V3–GND 사이에.
극성이 있습니다 — 긴 다리가 3V3, 몸통의 흰 띠 쪽이 GND입니다.Config.h에서 MK_LED_PIN을
21로 (05절의 전체 목록에 포함돼 있습니다). GP17은 펌웨어가 아예
건드리지 않으므로 온보드 LED는 그대로 둡니다.5V가 아니라
3V3에 물렸는지, 커패시터 극성, 3V3–GND 단락 여부,
DIN이 GP21인지, 스위치가 대각선 두 핀인지. RP2040은 BOOT 버튼이 있으므로 32u4처럼
RST–GND 점퍼를 미리 꽂아 둘 필요는 없습니다.순서를 지키는 이유는 2단계 하나 때문입니다. 3.3 V에서 파랑이 안 뜨는 모듈이면
1N4001을 5V와 모듈 사이에 넣는 구성으로 가야 하고, 그러면 전원이 오른쪽 열
3V3가 아니라 5V에서 나옵니다. 다 납땜한 뒤에 알게 되면 전원 배선을
다시 뜯습니다.
선을 읽기 쉽게 배치한 논리 결선도입니다. 핀의 실제 물리 위치는 그림 1을 보세요. 아래는 버튼 쪽만 그린 것으로, 왼쪽 열에서 나가는 버튼 8가닥 + GND 1가닥입니다. LED 3가닥은 오른쪽 열에서 따로 나가며 07절 그림 3에 있습니다.
0.9.0 펌웨어는 ATmega32U4와 RP2040을 같은 소스에서 빌드합니다. AVR의 기존 1 KB 프로필은 그대로 두고, RP2040 빌드에서만 LittleFS 기반 대용량 프로필을 선택합니다.
firmware/src/Config.h
#define MK_BOARD_NAME "promicro-rp2040"
// 왼쪽 열에 연속으로 있는 여덟 핀. 배열 순서가 키 번호입니다.
static const uint8_t MK_KEY_PINS[MK_KEY_COUNT] = {2, 3, 4, 5, 6, 7, 8, 9};
// 외부 WS2812B 모듈의 DIN. 오른쪽 열 맨 아래 핀입니다.
// GP17의 온보드 LED는 WS2812가 아니라 여기 쓸 수 없습니다(07절).
#define MK_LED_PIN 21
// RP2040은 14 MB LittleFS 파티션에 프로필 파일을 원자적으로 교체합니다.
#define MK_STORAGE_FLASH_EMULATED 1
두 보드는 용량만 다르고 동작 모델은 같습니다. AVR은 1,024 B/schema 2와
308 레코드를 그대로 유지합니다. RP2040은 65,520 B/schema 3, 2바이트 슬롯 카운트와
총 21,801 레코드를 사용합니다. 앱은 HELLO bytes=를 보고 자동 선택하며,
큰 프로필을 AVR로 잘라 보내지 않고 명시적으로 거부합니다.
firmware/src/Storage.h — 빌드가
'class EEPROMClass' has no member named 'update'에서 멈추면(코어에 따라 다릅니다)
플래시 분기에만 래퍼를 넣습니다.
inline void mkStoreUpdate(uint16_t address, uint8_t value) {
#if MK_STORAGE_FLASH_EMULATED
// 같은 값이면 건드리지 않는다는 update()의 의미는 그대로 유지합니다.
if (EEPROM.read(address) != value) EEPROM.write(address, value);
#else
EEPROM.update(address, value);
#endif
}
firmware/src/SerialProtocol.cpp — 시리얼
BOOT 명령이 지금은 ERR code=unsupported를 답합니다. RP2040은
부트롬에 진입 함수가 있어 세 줄이면 됩니다.
#elif defined(ARDUINO_ARCH_RP2040)
#include <pico/bootrom.h>
#define MK_HAS_BOOTLOADER_ENTRY 1
void enterBootloader() { reset_usb_boot(0, 0); }
#else
macrokey/device/discovery.py — 선택 사항입니다. 모르는 벤더의 포트도
어차피 마지막에 시도하므로 안 고쳐도 연결은 됩니다. 다만 자동 연결이 한 번에 붙게 하려면
RP2040의 CDC id를 목록에 넣어 줍니다.
# arduino-pico 코어의 기본 CDC id.
KNOWN_USB_IDS = {
...,
(0x2E8A, 0x000A),
}
firmware.ino의 quietBoardLeds()는 손댈 필요가
없습니다. defined(RXLED0) && defined(TXLED0) 가드가 걸려 있어 RP2040에서는
빈 함수로 컴파일되고, 이 보드에는 애초에 RX/TX LED가 없습니다.
볼륨·재생 키는 이 보드에서 아직 못 씁니다. ACT_CONSUMER를 살리는
MK_USE_HID_PROJECT는 NicoHood의 HID-Project를 쓰는데 그 라이브러리는 AVR 전용입니다.
RP2040에서 consumer 페이지를 쓰려면 TinyUSB로 리포트 디스크립터를 직접 짜야 하고, 그건
HidBackend.h 한 줄로 끝나지 않습니다. MK_USE_HID_PROJECT는 0으로 둡니다.
RP2040은 Earle Philhower의 arduino-pico 코어를 씁니다. SparkFun AVR 패키지와
무관하며, 둘을 같이 설치해 둬도 됩니다.
arduino-cli config add board_manager.additional_urls \
https://github.com/earlephilhower/arduino-pico/releases/download/global/package_rp2040_index.json
arduino-cli core update-index
arduino-cli core install rp2040:rp2040
arduino-cli lib install "Adafruit NeoPixel"
arduino-cli compile --upload \
--fqbn rp2040:rp2040:generic:flash=16777216_14680064,freq=133 \
-p /dev/ttyACM0 firmware
flash= 값을 보드와 맞추세요. 산 것은 16 MB 판이므로
16777216_14680064(플래시 16 MB, LittleFS 14 MB)입니다. 펌웨어 영역은 2 MB이고
프로필은 LittleFS 안의 고정 65,520 B 파일로 저장됩니다. 보드 뒷면 실크의
2M / 4M / 8M / 16M 중 표시된 칸이 정답이고, 옵션 문자열은
arduino-cli board details --fqbn rp2040:rp2040:generic로 확인할 수 있습니다.
Keyboard·Mouse 라이브러리를 설치하지 마세요. 32u4 절차에서
깔던 그 둘은 AVR 코어용이고, arduino-pico는 같은 이름의 구현을 코어에 이미
들고 있습니다. 따로 설치하면 라이브러리 쪽이 먼저 잡혀 컴파일이 깨집니다. 32u4와 RP2040을
같은 PC에서 번갈아 빌드한다면 이 점이 유일한 충돌 지점입니다.
첫 업로드는 UF2로. 공장 출하 상태에는 시리얼 포트가 없어 -p가 가리킬
대상이 없습니다.
RPI-RP2 이름의 USB 드라이브가 뜹니다.arduino-cli compile --fqbn rp2040:rp2040:generic:flash=16777216_14680064,freq=133 --output-dir build/rp2040-large firmware로
만든 build/rp2040-large/firmware.ino.uf2를 그 드라이브에 복사합니다.한 번 올라간 뒤부터는 compile --upload가 그냥 됩니다 — 코어가 1200 bps로
포트를 열었다 닫는 신호를 부트로더 진입으로 받습니다.
업로드가 더 이상 타이밍 싸움이 아닙니다. 32u4에서는 RST–GND를
빠르게 두 번 단락시키고 8초 안에 업로드를 시작해야 했습니다. RP2040은 BOOT 버튼을 누른 채
꽂으면 시간 제한 없이 부트로더에 머뭅니다. 매크로가 키를 무한히 뿜는 상태가 되어도
MK_BOOT_GRACE_MS 2초에 기댈 필요 없이 언제든 빠져나올 수 있습니다.
배선 확인은 python -m macrokey monitor가 빠릅니다 —
키를 누르면 EV t=key k=0 g=tap 같은 줄이 찍힙니다.
python -m macrokey ports로 포트를 먼저 확인하세요.
이 절은 선택이 아닙니다. 이 보드의 GP17에는 RGB LED가 달려 있지만 WS2812 계열의
주소지정 소자가 아니라서, LedController가 쓰는 Adafruit_NeoPixel로
구동되지 않습니다. macroKey의 LED 기능(탭 큐, 매크로 시안 펄스, 미바인딩 빨강,
호스트 오버레이)을 쓰려면 외부 WS2812B 모듈이 필요합니다.
그리고 RP2040은 3.3 V 로직이라 5 V 급전 WS2812B를 그냥 물리면 데이터 레벨이 미달입니다. 그래서 이 절이 있습니다 — 결론은 모듈을 3.3 V로 급전하는 것이고, 근거는 아래와 같습니다.
결론부터 — 켜집니다. 다만 규격 밖이고, 색이 붉게 기웁니다. 근거는 이렇습니다.
실물에서 확인한 구성입니다. ProMicro RP2040 판에 3V3로 급전한 WS2812B 모듈이 정상 동작합니다. 아래는 왜 그런지에 대한 설명이지 추정이 아닙니다.
| 항목 | 값 | 판정 |
|---|---|---|
| WS2812B 데이터시트 전원 전압 | 3.5 – 5.3 V | 3.3 V는 규격 아래입니다. 대부분 동작하지만 제조사 보증 범위 밖 |
| 입력 하이 임계 VIH = 0.7 × VDD 3.3 V 급전일 때 | 2.31 V | RP2040 출력이 3.3 V이므로 여유 충분. 이게 3V3 급전을 하는 이유입니다 |
| 같은 임계, 5 V 급전일 때 (하면 안 되는 쪽) | 3.50 V | RP2040의 3.3 V로는 미달. 되다 안 되다 하는 가장 나쁜 형태로 나타납니다 |
| 파랑·초록 칩 순방향 전압 Vf | 약 3.0 – 3.2 V | 3.3 V에서 헤드룸이 거의 없음 → 어두워집니다 |
| 빨강 칩 순방향 전압 Vf | 약 2.0 V | 여유 있음 → 정상 밝기 |
즉 데이터 레벨 문제는 3V3 급전으로 완전히 해결되고, 대신 밝기와 색균형을 내줍니다. 흰색이 노르스름하거나 분홍으로 보이고 전체가 어두워집니다. 이 프로젝트는 픽셀 1개를 기본 밝기 64/255로 쓰므로 실사용에서는 거의 문제가 되지 않습니다.
모듈 로트에 따라 파랑이 아예 안 켜지는 개체가 있습니다. 3.0–3.2 V라는 Vf가 개체마다 흩어지는 값이라 3.3 V에서는 어떤 것은 켜지고 어떤 것은 안 켜집니다. 그래서 납땜하기 전에 아래 스케치로 판정하고 넘어가세요 — 5분이면 끝나고, 안 되는 모듈이면 다이오드 방식으로 바꾸면 됩니다.
버튼이 왼쪽 열을 다 쓰므로 LED는 오른쪽 열에서 전부 해결됩니다.
GND와 3V3가 위쪽에 나란히 있고, 데이터는 같은 열 맨 아래
GP21을 씁니다.
| 보드 핀 | 위치 | 모듈 쪽 | 중간에 들어가는 것 |
|---|---|---|---|
| 3V3 | 오른쪽 열 위에서 5번째 | 모듈의 5V / VCC |
100 µF 전해 커패시터 (3V3–GND, 모듈 가까이) |
| GND | 오른쪽 열 위에서 3번째 | 모듈의 GND | 없음 |
| GP21 | 오른쪽 열 맨 아래 | 모듈의 DIN |
330 Ω 직렬 저항 (모듈 가까이) |
모듈 실크에 "5V"라고 적혀 있어도 보드의 3V3에 물립니다. 이 절 전체가
그 한 줄을 위해 있습니다. 보드의 5V 핀(USB VBUS)에 물으면 임계값이 3.5 V로
올라가 RP2040의 3.3 V 데이터가 미달이 됩니다.
데이터 핀은 GP21이 무난합니다. 왼쪽 열은 버튼이 다 쓰고, GP17은 온보드 LED 전용이며, GP0·GP1은 UART입니다. 다른 자리가 필요하면 GP26·GP27·GP28도 됩니다. GP23·GP24·GP25·GP29는 피하세요 — RP2040 보드 설계에 따라 내부 용도(VBUS 감지, 전원 모드, VSYS 분압)가 붙어 있는 자리라서 개체마다 다릅니다. GND는 왼쪽 열 것을 써도 같은 네트라 상관없지만, 오른쪽 열 GND를 쓰면 LED 배선 세 가닥이 한쪽에 모입니다.
빵판에 임시로 물려 놓고 이것부터 올려 보세요. 펌웨어와 무관한 독립 스케치입니다.
#include <Adafruit_NeoPixel.h>
// 외부 WS2812B가 3.3 V 급전으로 제대로 켜지는지만 보는 스케치.
// 데이터 = GP21, 전원 = 보드의 3V3.
Adafruit_NeoPixel pixel(1, 21, NEO_GRB + NEO_KHZ800);
void flash(uint8_t r, uint8_t g, uint8_t b) {
pixel.setPixelColor(0, pixel.Color(r, g, b));
pixel.show();
delay(900);
}
void setup() {
pixel.begin();
pixel.setBrightness(255); // 판정은 최대 밝기에서. 펌웨어 기본값은 64입니다.
}
void loop() {
flash(255, 0, 0); // 빨강
flash(0, 255, 0); // 초록
flash(0, 0, 255); // 파랑
flash(255, 255, 255); // 흰색
flash(0, 0, 0); // 꺼짐
}
arduino-cli compile --upload \
--fqbn rp2040:rp2040:generic:flash=16777216_0 \
-p /dev/ttyACM0 ledtest
| 보이는 것 | 판정 |
|---|---|
| 네 색이 다 나오고 흰색만 노르스름·분홍 쪽으로 기움 | 정상입니다. 예상된 색균형이고 그대로 진행하면 됩니다 |
| 파랑이 많이 어둡지만 켜지기는 함 | 정상 범위. 프로필 팔레트에서 파랑 계열 값만 올려 보정하세요 |
| 파랑(과 초록)이 아예 안 켜짐 | 이 모듈은 3.3 V로는 안 됩니다 → 아래 다이오드 방식으로 |
| 색이 랜덤하게 튀거나 깜빡임 | 데이터 레벨이 아니라 배선 문제입니다. 330 Ω을 모듈 가까이로, GND 공통, 100 µF 확인 |
| 아무것도 안 켜짐 | 배선이나 핀 번호. 3V3에 물렸는지, DIN이 GP21인지, 모듈이 GRB가 맞는지 |
// firmware/src/Config.h
#define MK_LED_PIN 21
05절의 변경 목록에 이미 들어 있습니다. 데이터 핀을 GP21이 아닌 곳으로 잡았다면 그 번호로 맞추세요.
GP17은 그냥 둡니다. 펌웨어가 건드리지 않으므로 온보드 LED는 부팅 상태 그대로
남습니다. 켜진 채로 남아 거슬리면 setup()에서 출력으로 잡아 끄면 되는데,
어느 레벨이 꺼짐인지는 그 LED의 결선에 달렸습니다 — 캐소드가 GP17이면
LOW, 애노드가 GP17이면 HIGH가 꺼짐입니다. 한 번 눌러 보고 꺼지는
쪽을 쓰세요.
pinMode(17, OUTPUT);
digitalWrite(17, LOW); // 안 꺼지면 HIGH로
| 방법 | 내용 | 비용 |
|---|---|---|
| 다이오드 강하 권장 대안 |
보드의 5V와 모듈 사이에 1N4001을 직렬로 넣습니다. 0.7 V가 떨어져
모듈은 약 4.3 V로 켜지고, 임계값은 0.7 × 4.3 = 3.01 V로 내려와 RP2040의 3.3 V가
규격 안에 들어옵니다. 밝기와 색균형이 온전히 살아납니다. 여유가 0.3 V뿐이라
데이터 선은 짧게 유지하세요. |
다이오드 1개 |
| 레벨 시프터 | 74AHCT125로 데이터만 5 V로 올리고 급전은 5V에서 받습니다. 여유가 가장
크고, 긴 스트립이나 데이터 선이 길어질 때 정석입니다. |
IC 1개 |
픽셀 수를 늘리면 Config.h의 MK_LED_COUNT와 호스트
macrokey/config/model.py의 LED_COUNT를 같은 값으로 올립니다. EEPROM
팔레트 크기와 MK_LED_MAX_MILLIAMPS 전류 제한은 그 값에서 자동으로 따라옵니다.
3V3 급전으로 몇 개까지 되는지는 08절에 있습니다.
전원은 PC USB 하나뿐이고 USB 2.0 장치는 500 mA를 넘게 쓸 수 없습니다. 32u4 판보다 MCU가 더 먹지만 LED가 3.3 V로 켜져 덜 먹으므로 총합은 비슷합니다.
| 조건 | 전류 | 판정 |
|---|---|---|
| RP2040 133 MHz + 레귤레이터, LED 꺼짐 | 약 30 mA | 예산의 6% |
| + 외부 픽셀 1개, 기본 밝기 64/255 단색 | 약 40 mA | 예산의 8%. 넉넉 |
| + 외부 픽셀 1개, 흰색 100% (3.3 V 급전) | 약 70 mA | 예산의 14%. 안전 |
외부 픽셀을 3V3에서 뽑을 때의 상한. 3.3 V 급전에서 픽셀 하나는 흰색 최대로도 약 40 mA입니다(파랑·초록이 헤드룸 부족으로 덜 먹기 때문에 5 V의 60 mA보다 적습니다). 걸리는 천장은 둘인데, 보드의 3.3 V 레귤레이터가 보통 500 mA급이고 USB 2.0 예산도 500 mA라 MCU 30 mA를 빼면 실질적으로 픽셀 8개 정도까지가 편안한 범위입니다. 그 이상은 레귤레이터가 뜨거워지므로 별도 전원과 레벨 시프터로 가세요.
근사치입니다. 픽셀이 하나뿐이라 전력은 실질적인 제약이 아니고 밝기를
255로 올려도 안전합니다. MK_LED_MAX_MILLIAMPS(100)는 3.3 V 급전에서 더더욱
걸릴 일이 없지만, MK_LED_COUNT를 올리는 순간 다른 곳을 고치지 않아도 바로
안전장치로 동작하기 때문에 그대로 둡니다.
케이블은 여기서도 조용한 원인입니다. 길고 얇은 충전 전용 케이블은 보드 쪽 전압을 끌어내립니다. 다만 32u4 판만큼 치명적이지는 않습니다 — 3.3 V 레귤레이터는 입력이 4.5 V까지 떨어져도 출력을 유지하므로, 5 V 직결이던 32u4보다 여유가 있습니다. 그래도 1 m 이하 데이터용 USB-C 케이블을 쓰세요. 충전 전용 케이블은 아예 인식되지 않습니다.
| 항목 | Pro Micro (ATmega32u4) | ProMicro RP2040 |
|---|---|---|
| 로직 전압 | 5 V | 3.3 V. GPIO에 5 V 톨러런스 없음 |
| 버튼 핀 | D3–D9 + D10 혼자 반대쪽 줄 | GP2–GP9, 한 열에 연속 |
| WS2812 급전 | 외부 모듈, 5 V(VCC)에서 급전. 레벨 문제 없음 | 외부 모듈, 3.3 V에서 급전. 5 V로 물면 데이터 레벨 미달 |
| 온보드 LED | RX/TX LED뿐 (상태 표시에 못 씀) | GP17에 RGB LED가 있으나 WS2812가 아니라 못 씀 |
| 프로필 저장 | 진짜 EEPROM 1 KB/schema 2 | LittleFS 65,520 B/schema 3 |
| 부트로더 진입 | RST–GND 더블탭, 8초 창 | BOOT 버튼. 시간 제한 없음 |
시리얼 BOOT 명령 | 지원 (Caterina 매직 워드) | reset_usb_boot() 추가 필요 (05절) |
| 볼륨·재생 키 | HID-Project로 가능 | 아직 불가 (HID-Project는 AVR 전용) |
| RX/TX LED | 있음. 끄려고 포트 조작이 필요했음 | 없음. quietBoardLeds()가 빈 함수 |
| 커넥터 | micro-B (잘 부러짐) | USB-C |
| 플래시 / SRAM | 32 KB / 2.5 KB | 16 MB / 264 KB |
저장 방식이 다릅니다. 32u4는 바뀐 바이트만 EEPROM에 쓰고 끝이지만,
RP2040은 완성된 프로필을 임시 파일에 쓴 뒤 기존 파일과 교체합니다. 프로필 저장
경로가 모두 Profile.cpp의 커밋 한 곳으로 모여 있어
끝나지만, 앱에서 밝기 슬라이더를 끌면서 매 프레임 저장하는 식의 사용은 피하세요.
플래시 수명은 섹터당 약 10만 회이므로 정상적인 사용에서는 문제가 되지 않습니다.
| 증상 | 가장 흔한 원인 | 확인/조치 |
|---|---|---|
| LED가 전혀 안 켜짐 | MK_LED_PIN이 아직 18(32u4의 A0) | 21로 바꿨는지 확인. 배선은 그림 3 |
| GP17에 물렸는데 아무 반응 없음 | 온보드 LED 핀에 외부 모듈을 붙임 | GP17은 WS2812 데이터 핀이 아닙니다. GP21로 옮기세요 |
| 빨강↔초록이 바뀜 | 모듈 색 순서가 GRB가 아님 | LedController.h의 NEO_GRB를 NEO_RGB로 |
| 외부 LED의 파랑·초록이 안 켜짐 | 3.3 V가 그 모듈의 Vf에 못 미침 | 정상적인 실패입니다. 07절의 1N4001 다이오드 방식으로 |
| 외부 LED 색이 되다 안 되다 함 | 모듈을 5V에 물림 | 3V3로 옮기세요. 5 V 급전은 임계값이 3.5 V라 3.3 V 데이터가 미달입니다 |
| 온보드 LED가 켜진 채로 거슬림 | 펌웨어가 GP17을 건드리지 않음 | 출력으로 잡아 끄되, 꺼지는 레벨은 결선에 따라 LOW/HIGH (07절) |
| 설정이 재부팅마다 사라짐 | LittleFS 파티션이나 프로필 파일 문제 | FQBN이 flash=16777216_14680064,freq=133인지 확인 |
| 프로필을 읽으면 쓰레기 값 | begin() 없이 읽음 | 모든 접근이 Storage.h를 지나는지. Profile::begin()이 mkStoreBegin()을 먼저 부릅니다 |
컴파일이 Mouse.h/Keyboard.h에서 깨짐 | AVR용 라이브러리를 따로 설치함 | arduino-cli lib uninstall Keyboard Mouse. 코어 내장본을 씁니다 |
EEPROMClass has no member 'update' | 코어의 EEPROM API 차이 | 05절의 mkStoreUpdate 래퍼 |
| 포트가 안 보임 (첫 업로드) | 아직 스케치가 없어 CDC가 없음 | BOOT 누른 채 꽂아 RPI-RP2에 .uf2 복사 |
| 앱이 패드를 못 찾음 | VID가 목록에 없어 마지막에 시도됨 | 연결은 됩니다(느릴 뿐). discovery.py에 (0x2E8A, 0x000A) 추가 |
| 특정 키가 계속 눌린 상태 | 택트 스위치의 같은 변 두 핀 사용 | 대각선으로 마주 보는 두 핀으로 이동 |
| 매크로가 키를 무한히 뿜음 | 잘못 저장된 매크로 | BOOT 누른 채 재연결 → 부트로더에서 재플래시. 32u4와 달리 시간 제한 없음 |
| 부품 | 수량 | 비고 |
|---|---|---|
| ProMicro RP2040 (제네릭 클론) | 1 | 16 MB 판. 뒷면 실크의 표시로 확인 |
| 6 mm 택트 스위치 | 8 | 4핀형이면 대각선 두 핀 사용 |
| 12핀 헤더 | 1–2 | 버튼용 왼쪽 열 1개. 외부 LED를 붙이면 오른쪽 열도 필요 |
| 점퍼선 / 배선재 | 12가닥 | 버튼 8 + GND 1 (왼쪽 열), LED 3 (오른쪽 열) |
| WS2812B 모듈 | 1 | 단품 또는 스트립에서 1픽셀. 3.3 V에서 켜지는지 먼저 판정 (07절) |
| 330 Ω 저항 (1/4 W) | 1 | 300–500 Ω이면 무방. DIN에 모듈 가까이 직렬로 |
| 100 µF 전해 커패시터 | 1 | 정격 6.3 V 이상, 극성 있음. 3V3–GND 사이 |
| 1N4001 다이오드 | 0–1 | 3.3 V로 파랑이 안 켜지는 모듈일 때만 (07절) |
| USB-C 데이터 케이블 | 1 | 1 m 이하 권장. 충전 전용 불가 |
부품 구성은 32u4 판과 같습니다 — 이 보드의 온보드 RGB LED는 WS2812가
아니라 상태 표시에 쓸 수 없어서, WS2812B 모듈·330 Ω·100 µF가 그대로 필요합니다. 달라지는 것은
모듈을 VCC(5 V)가 아니라 3V3에서 급전한다는 점 하나입니다.