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.inoWaveshare RP2040-Tiny(가장 가볍고 온보드 버튼 없음) 네이티브 USB ESP32-S3 어느 쪽으로도 표준 arduino-pico / arduino-esp32 코어로 컴파일된다. Arduino IDE에서는 같은 스케치가 File → Examples → Yoshimitsu → Yoshimitsu_Default에 있다.

YOSHIMITSU — 통합 펼웨어

YOSHIMITSU는 권장 펌웨어입니다. KINCHO(변환기)로 부팅하여 자세 사이를 오갑니다. USB 콘솔은 두 보드 모두에서 표준 스위치입니다 — KINCHOMANJIFLEAMEDITATIONNSSBACKPOSE <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 — 또는 새 릴리스를 넣어라 — 그러면 스케치는 그대로다. 펌웨어 업데이트는 결코 재배선이 아니고 결코 재설정이 아니다.

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 채널을 정하며, 채널의 의미는 믹서/커널의 것이지 결코 보드의 것이 아닙니다.

자이로 안정화 오르니톱터에는 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 입력). 그러면 스케치가:

  1. GPIO9를 낮춥니다 (BOOT 패드 활성),
  2. MOSFET을 120 ms 동안 끕니다 (수신기 전원 차단),
  3. 다시 켜고 900 ms를 기다립니다 (수신기가 부트로더 안에서 기동),
  4. GPIO9를 놓습니다 — RX가 이제 ROM 부트로더에서 esptool을 기다립니다,
  5. 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 링크업 메시지를 확인하세요. 브리지는 실시간 텔레메트리용 현장 콘솔로도 쓰입니다.

확인 및 첫 비행

한 번 플래시되면 같은 수신기가 날아갑니다 — FTDI는 남지 않습니다.

RP2040-Tiny 포켓 빌드

Waveshare RP2040-Tiny(~5 USD)를 고르세요 — 또는 정확히 같은 핀아웃을 공유하는 쌍둥이 RP2040-Zero를. 여섯 자세 모두 RP2040에서 읽을 수 있는 버튼 없이 돌아갑니다: 어댑터의 BOOT/RESET 탭은 BOOTSEL/RUN만 구동하므로, YOSHIMITSU-RP2040은 USB 시리얼 포트와 버튼 없는 RESET-탭 카운터로 조종됩니다.

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 (SERVO_PIN_1)

GPIO2

PWM — CHANNEL_TO_SERVO 경유 채널

서보 2 (SERVO_PIN_2)

GPIO3 PWM

서보 3 (SERVO_PIN_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). 헬리콥터든 날갯짓이든 — 검의 시점에서는 같다: 표준 궤적 하나, 그리고 검은 자기가 어떤 그릇을 드는지 묻지 않는다. 포즈는 계속 날고, 모습만 바뀐다.