06
YOSHIMITSU — 완전한 솔루션: 모든 치트코드, 하나의 두루마리
승자만 있는 치트코드 우화. 하나의 여유로운 스케치, 여섯 자세, 하나의 영구 하네스: CRSF→PWM 막아내기(KINCHO), Zephyrus 자이로 부양(MANJI_DRAGONFLY), 주머니 플래셔(FLEA · MEDITATION), 검이 없는 작업대(NSS), 뒤를 돌아보지 않는 거울(BACK_TURNED) — 그리고 항상 켜진 오로라 YOSHI와 전설을 들려주는 명상하는 관리자 JIGUANG(極光). 한 번 배선하고 한 번 플래시하면, 그 뒤로는 라이브러리가 업데이트되고 옥좌가 명령한다.
보드 하나, 여섯 가지 자세
YOSHIMITSU는 여섯 자세를 지닌 헤르메스 시노비다 — 각 자세는 서로 다른 승리이며, 모두 같은 영혼을 입는다. 하나의 여유로운 스케치가 두 보드 모두에서 빌드되고, 자세는 USB 명령, GPIO0 버튼(ESP32-S3) 또는 RESET 탭(RP2040-Tiny)으로 전환한다:
| 자세 | 의미 |
|---|---|
KINCHO
|
CRSF→PWM 변환기 — 막아내기(CRC가 거짓을 버린다). 채널 이름 없음, 자이로 없음. |
MANJI_DRAGONFLY
|
변환기 + Zephyrus 자이로 링크(옵션 MPU6050) — 공중부양. |
FLEA
|
전원 순환 지그 — RX를 부트로더로 떨어뜨리는 들어올림. |
MEDITATION
|
포켓 플래셔 — 스펀지 머리, 에너지를 아끼며, 플래시될 준비 완료. |
NSS
|
칼 없는 작업대 — USB 직결 서보, 무선 없음. |
BACK_TURNED
|
기만적인 정적 — 살아있는 UART 거울. 결코 뒤돌아보지 않는다. |
하나의 스케치, 두 개의 타깃: sketches/yoshimitsu/yoshimitsu.ino는 Waveshare RP2040-Tiny(가장 가볍고 온보드 버튼 없음)와 네이티브 USB ESP32-S3 어느 쪽으로도 표준 arduino-pico / arduino-esp32 코어로 컴파일된다. Arduino IDE에서는 같은 스케치가 File → Examples → Yoshimitsu → Yoshimitsu_Default에 있다.
YOSHIMITSU — 통합 펼웨어
YOSHIMITSU는 권장 펌웨어입니다. KINCHO(변환기)로 부팅하여 자세 사이를 오갑니다. USB 콘솔은 두 보드 모두에서 표준 스위치입니다 — KINCHO → MANJI → FLEA → MEDITATION → NSS → BACK → POSE <n>. ESP32-S3에서는 BOOT 버튼(GPIO0)이 두 번째 표면입니다:
| 상황 | 제스처 | 동작 |
|---|---|---|
| 어느 자세에서나 | 더블 탭 | KINCHO → MANJI → NSS → BACK → KINCHO → 순환 |
| 어느 자세에서나 | 2초 길게 누름 | MEDITATION 진입 |
| MEDITATION / FLEA | 싱글 탭 | 수신기 재시작(새 펌웨어 실행) |
| MEDITATION / FLEA | 더블 탭 | FLEA — 수신기를 부트로더로 떨어뜨림 |
배선은 하나의 영구 하네스다 — 같은 전선이 모든 자세를 섬기므로 비행과 플래시 사이에서 다시 배선할 일이 없다. MEDITATION에서 USB→UART 경로는 순수 투명 브리지(라인 파싱 없음)라서 esptool의 바이너리 SLIP 트래픽이 그대로 통과한다. 전체 소스: sketches/yoshimitsu/yoshimitsu.ino (여유로운 스케치), src/Yoshimitsu.h (코어), src/Yoshimitsu_Loadout.h (시작 로드아웃).
라이브러리 — 스케치를 다시 건드리지 않고 업데이트하기
YOSHIMITSU는 그 위에 얇은 스케치를 얹은 라이브러리다 — 시노비 전체가 라이브러리에 살고, 스케치는 당신의 설정만 담는다. 폴더를 한 번 Arduino 라이브러리로 설치하면 File → Examples → Yoshimitsu → Yoshimitsu_Default가 핀, 게이트, 코드에 속한 몇 안 되는 플래그를 갖춘 완성된 여유로운 스케치를 건넨다. 코어는 src/Yoshimitsu.h에, 모든 기본값은 src/Yoshimitsu_Loadout.h(시작 로드아웃, *_DEFAULT 값)에 있다. 업데이트하려면 라이브러리를 git pull — 또는 새 릴리스를 넣어라 — 그러면 스케치는 그대로다. 펌웨어 업데이트는 결코 재배선이 아니고 결코 재설정이 아니다.
src/Yoshimitsu.h— 전체 코어: 자세, CRSF, MUSHIN, JIGUANG, 플래셔 브리지.src/Yoshimitsu_Loadout.h— 시작 로드아웃: 모든 기본값(핀, 타이밍, 게이트 레벨)을*_DEFAULT값으로.library.properties— Arduino 라이브러리 매니페스트(버전, 아키텍처).examples/Yoshimitsu_Default/— 여유로운 스케치; include 전에 정의하면 무엇이든 재정의할 수 있다.
KINCHO — CRSF→PWM 컨버터
KINCHO — 변환기 자세 — 는 UART에서 420 000 baud로 CRSF를 읽고, 172–1811 채널 범위에서 매핑된 988–2012 µs 창으로 서보를 구동하며, 500 ms 페일세이프로 중앙에 맞춥니다. 막아내기는 CRC 검사입니다: 손상된 프레임은 서보에 닿기도 전에 폐기됩니다. 변환기는 채널에 무관합니다 — 서보는 SERVO_PIN_1..8이고 CHANNEL_TO_SERVO 테이블이 각각을 먹일 CRSF 채널을 정하며, 채널의 의미는 믹서/커널의 것이지 결코 보드의 것이 아닙니다.
- ESP32-S3: RX TX → GPIO44, RX RX → GPIO43, 공통 GND, 공유 5 V 레일.
- RP2040-Tiny: RX TX → GPIO1 (UART0), 공통 GND.
서보:
SERVO_PIN_1..3(S3에는 셋 더) — PIN MAP 블록에서 재정의 가능.
자이로 안정화 오르니톱터에는 MANJI_DRAGONFLY를 쓰세요 — 같은 변환기에 Zephyrus 링크를 더한 것입니다: GYRO_SDA/GYRO_SCL의 옵션 MPU6050이 요-레이트 보정을 볏 서보로 공급합니다. 자이로 배선이 없으면 MANJI_DRAGONFLY는 우아하게 KINCHO로 저하됩니다. 상용 CRSF→PWM 변환 보드에는 자이로 경로가 전혀 없습니다 — EP2급 수신기는 IMU가 없으므로, Zephyrus는 수신기가 아니라 YOSHIMITSU 안에 삽니다.
수신기가 이미 PWM을 말한다면(5 ch 또는 7 ch 보드), 변환기 자세는 전혀 필요 없습니다 — 아래 MEDITATION이 그때 S3를 소유할 유일한 이유입니다.
KINCHOI — EP2급 수신기용 포켓 플래셔
문제: EP2급 수신기(HappyModel EP2, EP1, EPW6, …)는 성곽형 패드로 CRSF를 내고 아주 작은 BOOT 패드를 지닙니다. FTDI 어댑터를 쓰면 전원을 순환하는 동안 1 mm 패드 두 개에 프로브를 대고 있어야 합니다 — 불편하고, 펌웨어 업데이트가 필요할 때마다 다시 납땜하거나 다시 집어야 합니다.
해법: ESP32-S3가 플래셔가 되게 하세요. GPIO 하나가 수신기의 BOOT 패드를 낮게 잡고, 작은 P-MOSFET이 소프트웨어 제어로 수신기의 3.3 V 레일을 전환하며, USB 포트가 직렬 포트가 됩니다. S3의 버튼을 한 번 누르면 ESP8285를 ROM 부트로더로 떨어뜨리는 정확한 전원-순환 춤을 춘 뒤 — esptool이 브리지를 통해 곧장 기록합니다. FTDI도, 프로브도, 반복 납땜도 없습니다: 수신기 패드를 한 번만 짧은 피그테일에 납땜하고 영원히 재사용하세요.
부품 목록:
| 부품 | 일반적인 부품 번호 | 비용 |
|---|---|---|
| ESP32-S3 마이크로 보드(네이티브 USB) | Waveshare ESP32-S3-Tiny / -Micro / -Nano | ~6 USD |
| P채널 로직레벨 MOSFET | AO3401 (SOT-23), 소형 브레이크아웃 | ~1 USD |
| 저항 10 kΩ (게이트 풀업) | — | <0.10 USD |
| 듀폰 / 피그테일 와이어 + 수축튜브 | — | ~1 USD |
| ELRS 수신기, 패드에 피그테일 한 번 | EP2 / EP1 / EPW6 (SX1280 + ESP8285) | ~12 USD부터 |
브리지는 TX, RX, 3V3, GND, BOOT 패드를 노출하는 모든 ESP8285/SX1280 ELRS 수신기와 작동합니다 — 하드웨어 표 에 실린 *구체 보드*들의 압도적 다수입니다. 물론 S3 자신도 플래시합니다: BOOT 버튼 + USB면 그곳에서 필요한 전부입니다.
플래싱 지그 배선
S3 전원이 꺼진 상태에서 지그를 배선하세요. MOSFET이 수신기의 3.3 V 레일을 전환합니다: 소스 → S3 3V3, 드레인 → EP2 3V3, 게이트 → S3 GPIO10, 10 kΩ 풀업으로 3V3에 (게이트 높음 = MOSFET 꺼짐). GPIO9가 BOOT 패드를 구동합니다.
| EP2 / RX 패드 | ESP32-S3 핀 | 기능 |
|---|---|---|
| BOOT (RX GPIO0) | GPIO9 | 부트 유지 라인 (낮음 = 부트로더 진입) |
| 3V3 | MOSFET 드레인 | 전환 레일 (소스 → S3 3V3, 게이트 → GPIO10) |
| TX (CRSF out) | GPIO18 (U1RX) | RX → TX (교차) |
| RX (CRSF in) | GPIO17 (U1TX) | TX → RX (교차) |
| GND | GND | 공통 접지 (필수) |
S3 3V3 ──► S ── P-MOSFET (AO3401) ── D ──► EP2 3V3
S3 GPIO10 ──► gate (10kΩ pull-up to 3V3; LOW = ON)
S3 GPIO9 ──► EP2 BOOT pad (asserted LOW during power-up)
S3 GPIO18 ◄── EP2 TX (U1 RX)
S3 GPIO17 ──► EP2 RX (U1 TX)
S3 GND ──► EP2 GND
플래시 모드
MEDITATION은 투명 패스스루(USB ↔ UART, 115 200 baud)로 부팅합니다. 플래시 모드에 들어가려면 S3의 BOOT 버튼을 더블 탭하세요 (또는 USB 시리얼로 FLEA 입력). 그러면 스케치가:
- GPIO9를 낮춥니다 (BOOT 패드 활성),
- MOSFET을 120 ms 동안 끕니다 (수신기 전원 차단),
- 다시 켜고 900 ms를 기다립니다 (수신기가 부트로더 안에서 기동),
- GPIO9를 놓습니다 — RX가 이제 ROM 부트로더에서 esptool을 기다립니다,
- USB↔UART 패스스루를 재개하여 esptool이 통신할 수 있게 합니다.
브리지는 고전적인 DTR/RTS 자동 리셋 라인을 구동할 수 없으므로 항상 --before no_reset으로 플래시하세요 — 위의 전원-순환 춤 자체가 리셋입니다. 플래시 후 싱글 BOOT 탭이 수신기의 전원을 다시 순환시켜 새 펌웨어를 부팅하게 합니다; 더블 탭은 그저 플래시 모드로 재진입할 뿐입니다.
S3로 PteronautOS 플래싱
펌웨어를 빌드하고(또는 릴리스를 받아) S3의 USB 시리얼 포트로 esptool을 실행하세요. macOS에서는 포트가 /dev/cu.usbmodem*로 나타납니다:
# 1. PteronautOS 빌드 (저장소 루트에서)
pio run -e PteronautOS_ESP8285_2400_RX
# 2. RX를 플래시 모드로 떨어뜨림 (FLEA 입력, 또는 BOOT 더블 탭), 그 후:
python3 -m esptool --chip esp8285 \
--port /dev/cu.usbmodemXXXX --baud 115200 \
--before no_reset write_flash \
--flash_mode dout --flash_size 1MB --flash_freq 40m \
0x0 .pio/build/PteronautOS_ESP8285_2400_RX/firmware.bin
# 3. RX를 한 번 더 재시작 (싱글 BOOT 탭)하여 새 펌웨어 실행.
플래시 설정(dout, 1 MB, 40 MHz)은 순정 ESP8285 ELRS 타깃과 일치합니다 — qio나 더 큰 크기는 절대 쓰지 마세요. 플래시 후 같은 USB 포트가 수신기의 부트 로그를 보여줍니다: 115 200 baud로 열어 PteronautOS 배너와, 송신기가 바인딩되면 CRSF 링크업 메시지를 확인하세요. 브리지는 실시간 텔레메트리용 현장 콘솔로도 쓰입니다.
확인 및 첫 비행
- FLEA는 RX의 전원을 순환시키고 대기시켜야 합니다 — 3.3 V가 ~120 ms 동안 떨어집니다.
esptool이
Chip is ESP8285을 보고하고Hash of data verified로 끝납니다.- 부트 로그에 PteronautOS 배너와, 무선이 켜져 있으면 링크업 메시지가 보입니다.
- 스틱을 흔들어 보세요: 서보가 부드럽게 추종합니다; 무선을 끄면: 날개가 1초 안에 1500 µs로 중앙 정렬합니다.
- RX가 부트로더에 전혀 들어가지 않으면 BOOT 패드 극성(액티브 로우)과 위의 전압계 테스트로 MOSFET 전환을 확인하세요.
한 번 플래시되면 같은 수신기가 날아갑니다 — FTDI는 남지 않습니다.
RP2040-Tiny 포켓 빌드
Waveshare RP2040-Tiny(~5 USD)를 고르세요 — 또는 정확히 같은 핀아웃을 공유하는 쌍둥이 RP2040-Zero를. 여섯 자세 모두 RP2040에서 읽을 수 있는 버튼 없이 돌아갑니다: 어댑터의 BOOT/RESET 탭은 BOOTSEL/RUN만 구동하므로, YOSHIMITSU-RP2040은 USB 시리얼 포트와 버튼 없는 RESET-탭 카운터로 조종됩니다.
FLEA— 수신기를 ROM 부트로더로 떨어뜨리고(MOSFET 전원-순환 춤), esptool을 위해 USB ↔ UART 브리지.KINCHO/MANJI/NSS/BACK/MEDITATION— 자세 전환.POSE <n>— 번호로 자세 이동.STATUS— 활성 핀 맵과 자체 테스트 보고서 출력.HELP— 모든 명령 나열.- 빠른 RESET 탭(~2 s 이내, AON RTC 대비 플래시 EEPROM에 카운트)이 자세를 전진시킵니다: 1 = MANJI → 2 = NSS → 3 = BACK → 4 = MEDITATION → 5 = KINCHO.
RP2040-Tiny 자체를 플래시하려면 전원 순환 중 BOOT를 누르고(대용량 저장 드라이브로 마운트됨), .uf2를 올려놓은 뒤 RESET을 한 번 누르세요 — 보드가 새 펌웨어로 KINCHO에 재부팅합니다. 한 번 설정, 한 번 플래시, 다시는 만지지 않기.
RP2040-Tiny 핀 배치
| 기능 | RP2040-Tiny 핀 | 비고 |
|---|---|---|
| CRSF RX ← 수신기 TX | GPIO1 (UART0 RX) | 420 000 baud |
| CRSF TX (미사용, 완결성을 위해 배선) | GPIO0 (UART0 TX) | 교차: TX → RX |
| 브리지 RX ← 수신기 TX | GPIO9 (UART1 RX) | 115 200 baud |
| 브리지 TX → 수신기 RX | GPIO8 (UART1 TX) | 교차: TX → RX |
서보 1 ( |
GPIO2 | PWM — |
서보 2 ( |
GPIO3 | PWM |
서보 3 ( |
GPIO4 | PWM |
| 자이로 SDA (MPU6050, 옵션) | GPIO10 | MANJI_DRAGONFLY |
| 자이로 SCL (MPU6050, 옵션) | GPIO11 | MANJI_DRAGONFLY |
| RX BOOT (수신기 GPIO0, 액티브 로우) | GPIO5 | 낮음 = 부트로더 진입 |
| RX PWR (P-MOSFET 게이트, 낮음 = 전원 공급) | GPIO6 | 전환 3.3 V 레일 |
| 상태 LED | GPIO16 | WS2812B |
전체 핀 맵은 sketches/yoshimitsu/yoshimitsu.ino 상단의 편집 가능한 블록입니다 — 핀 범위와 충돌은 부트 POST가 검증하고, 잘못된 UART 번호는 공중에서 잘못 동작하는 대신 빌드를 거부합니다.
YOSHI — 항상 켜진 자세 오로라
YOSHI(“오로라”)는 항상 켜져 있는 치트코드입니다. YOSHI_RGB는 온보드 WS2812B 하나를 살아있는 무드링으로 바꿉니다: 자세마다 자기 색과 리듬으로 숨 쉬므로, 시리얼 바이트 하나 없이도 방 건너편에서 로닌의 마음을 읽을 수 있습니다. 색과 점멸 패턴이 이야기를 들려줍니다 — 추가 명령은 필요 없습니다; 자세 자체가 치트코드이고, 빛은 그 메아리입니다.
| 자세 | 오로라 (색 → 리듬) |
|---|---|
KINCHO
|
느린 초록 호흡 + 또렷한 이중 막아내기 섬광 (CRC 일격) |
MANJI_DRAGONFLY
|
자이로 로터처럼 도는 색상환 (공중부양) |
FLEA
|
광란의 상승 호박색 스트로브 (들어올림) |
MEDITATION
|
거의 어두운 보라 + 느린 심박 한 번 — 플래시될 준비 완료 |
NSS
|
파란 날카로운 삼중 탭 섬광 (칼집에 든 칼날, 템포 상승) |
BACK_TURNED
|
거의 검정 + 예측 불가한 진홍빛 한 점 (거울 — 결코 뒤돌아보지 않는다) |
RGB는 YOSHI_RGB 뒤의 RP2040-Tiny(RGB_LED_PIN=16)에 삽니다; ESP32-S3는 차분한 상태 LED를 유지합니다. 모든 색은 순수 정수 수학입니다 — float도, malloc도, delay()도 없으며 — pumpRgb()는 ~50 fps로 제한되어 바이트-정확 플래셔 브리지가 결코 방해받지 않습니다. 은밀한 규칙은 유지됩니다: 자세가 바뀌면, 빛이 따른다.
JIGUANG — 스토리텔러 · 해설자 · 관리자
세 이름, 하나의 영혼 — 완전판 솔루션의 치트코드 삼각형: YOSHIMITSU는 헤르메스 시노비 펌웨어 전체이고, YOSHI는 RGB 치트코드(항상 켜진 자세 오로라)이며, JIGUANG(極光, 「오로라」)은 명상하는 관리자 — MEDITATION 옥좌에 책상다리로 앉은 부동의 원동자다. Yoshimitsu의 목소리는 기능적이고 간결하며, JIGUANG의 목소리는 신화다. 極光은 장식이 아니라 콘솔 프롬프트다: 관리자로 행동하려면 極光을 입력한 다음 명령을 내려라 — 그렇지 않으면 옥좌는 손이 닿지 않는 곳에 남는다. 프롬프트는 #define(JIGUANG_PROMPT)이므로 스케치에서 이름을 바꿀 수 있고, 이야기꾼 전체는 컴파일 게이트 JIGUANG(1 = 편재, 0 = 極光 바이트 단 한 개도 컴파일되지 않음) 뒤에 숨는다.
이스터 에그: 極光 LEGEND를 입력하면 전설 전체가 하나의 ASCII 두루마리로 풀린다 — 자세, 치트코드, 옥좌, 그리고 죽지 않는 프롬프트. JIGUANG / jiguang / 極光은 죽지 않는다 — 코드에도, 주석에도, 이 튜토리얼에도.
極光 JIGUANG으로 목소리를 깨우면 네 단계로 올라간다: 0 어린 양(조용함, 다만 명시적 명령은 여전히 응답), 1 이야기(부팅과 모든 자세 전환을 서술), 2 두루마리(+ CRSF 채널 판독), 3 omni(+ 수신기의 ELRS 디버그 바이트를 그대로 통과). 極光 MUTE는 침묵시키고, 極光 CRSF는 16채널 두루마리를 출력하며, 極光 SCORE는 아케이드 HIGHSCORE 장부를 펼친다 — 좋은 CRSF 프레임, failsafe 이벤트, 브리지 바이트와 업타임. JIGUANG은 결코 자세를 빼앗지 않는다: 전설이 들려지는 동안에도 CRSF, 서보, 브리지는 계속 포즈에 복종한다.
MEDITATION에서 스펀지 머리는 JIGUANG의 옥좌다 — 그리고 옥좌는 지켜진다: 모든 관리자 명령은 콘솔 프롬프트 極光으로 시작한다. USB-시리얼 하늘에서 極光 STATUS, 極光 CRSF, 極光 SCORE, 極光 POSE, 極光 DOC(치트코드 카탈로그), 極光 SETUP(디파인 벽 대신 핵심 설정을 안내하는 명상 마법사)에 응답한다. 자세 변경은 열려 있다 — KINCHO, MANJI, FLEA, MEDITATION, NSS, BACK, POSE n. 포즈는 옛 명상 멈춤처럼 에너지를 아끼고, 로닌은 플래시될 준비로 앉아 있다. esptool의 SLIP 바이트가 부르는 순간, 옥좌는 투명한 플래셔 브리지에 양보하고 MEDITATION이 다시 들어올 때까지 거기 머문다. YOSHI_RGB 레벨 3에서 이야기꾼은 오로라를 입기도 한다: jiguang(ms)가 느린 풀스펙트럼 휠을 그려 모든 자세 색을 하나의 숨결로 엮는다.
MUSHIN 無心 — 근육 기억 치트코드
MUSHIN(無心, 「무심」)은 영웅 기능이다 — 무집착, 생각보다 먼저 치는 검. 검술에서 無心은 자기 자신을 놓아버리는 마음이다: 보이는 것과 행해지는 것 사이에 틈이 남지 않는다. PteronautOS는 정신이다 — 날개 파형을 계획하고 브리지 너머로 서보 인텐트를 보낸다. YOSHIMITSU는 계획에 집착하지 않는다: 로컬 Zephyrus 자이로 PID로 근육에서 응답하며, 다음 생각이 붙들기 전에 서보가 이미 움직인다. 두 코어, 하나의 일격 — 다른 어떤 ELRS-PWM 보드도 이를 입을 수 없다.
옥좌에서 무장하라: 極光 MUSHIN은 보고하고, 極光 MUSHIN ON/OFF는 무장/해제하며, 선택은 플래시에 영속된다 — 준비된 채로 부팅한다. 스케치에서 MUSHIN은 기본적으로 무장된 채 부팅하며, 관리자 플래그가 런타임 스위치라서 이를 바꾸려고 다시 컴파일할 일이 없다.
무심 프로토콜 v0은 플래셔와 같은 두 전선을 건넌다: [0x9B][len][type][payload][xor] — 0x01 인텐트(정신→근육, n×uint16 µs), 0x02 어나운스 킵얼라이브, 0x03 자이로 텔레메트리. 신선한 인텐트(500 ms 이내)가 서보를 구동하고, 로컬 자이로 PID가 볏을 붙든다. 전선이 침묵하면 YOSHIMITSU는 자신의 CRSF 근육으로 돌아간다 — 우아한 성능 저하, 결코 죽은 스틱이 아니다.
비행 중 분업은 win-win이다: 수신기는 일격 전에 생각을 하고(CRSF, Zephyrus, 믹서의 영혼), YOSHIMITSU는 근육에 붙어 있는 일을 한다(글리치 없는 PIO PWM). 헬리콥터든 날갯짓이든 — 검의 시점에서는 같다: 표준 궤적 하나, 그리고 검은 자기가 어떤 그릇을 드는지 묻지 않는다. 포즈는 계속 날고, 모습만 바뀐다.