06
YOSHIMITSU — la solución completa: todos los códigos, un pergamino
Una fábula de cheatcodes donde solo hay ganadores. Un sketch relajado, seis posturas, un arnés permanente: la parada CRSF→PWM (KINCHO), la levitación giroscópica de Zephyrus (MANJI_DRAGONFLY), el flasher de bolsillo (FLEA · MEDITATION), el banco sin espada (NSS), el espejo que nunca mira atrás (BACK_TURNED) — más YOSHI, la aurora siempre encendida, y JIGUANG (極光), el administrador meditante que cuenta la leyenda. Cabléalo una vez, flashealo una vez; después la biblioteca se actualiza y el trono ordena.
Una placa, seis posturas
YOSHIMITSU es el Shinobi Hermético con seis posturas — cada postura una victoria distinta, todas con la misma alma. Un sketch relajado compila para ambas placas; las posturas cambian por comando USB, botón GPIO0 (ESP32-S3) o toques de RESET (RP2040-Tiny):
| Postura | Significado |
|---|---|
KINCHO
|
Convertidor CRSF→PWM — la parada (el CRC descarta lo falso). Sin nombres de canal, sin giroscopio. |
MANJI_DRAGONFLY
|
Convertidor + enlace de giroscopio Zephyrus (MPU6050 opcional) — la levitación. |
FLEA
|
Útil de ciclo de potencia — la elevación que deja caer el RX en su bootloader. |
MEDITATION
|
Flasher de bolsillo — la cabeza-esponja, ahorrando energía, lista para ser flasheada. |
NSS
|
Banco sin-espada — servo directo por USB, sin RF. |
BACK_TURNED
|
El reposo engañoso — un espejo UART viviente. Nunca mira atrás. |
Un sketch, dos objetivos: sketches/yoshimitsu/yoshimitsu.ino compila para el Waveshare RP2040-Tiny (el más ligero, sin botón integrado) y para cualquier ESP32-S3 con USB nativo, con los cores estándar arduino-pico / arduino-esp32. En el Arduino IDE el mismo sketch vive en File → Examples → Yoshimitsu → Yoshimitsu_Default.
YOSHIMITSU — el firmware combinado
YOSHIMITSU es el firmware recomendado. Arranca en KINCHO (el convertidor) y se mueve entre posturas. La consola USB es el interruptor canónico en ambas placas — KINCHO → MANJI → FLEA → MEDITATION → NSS → BACK → POSE <n>. En el ESP32-S3 el botón BOOT (GPIO0) es una segunda superficie:
| Contexto | Gesto | Acción |
|---|---|---|
| cualquier postura | doble toque | cicla KINCHO → MANJI → NSS → BACK → KINCHO → |
| cualquier postura | pulsación larga 2 s | entrar en MEDITATION |
| MEDITATION / FLEA | toque simple | reiniciar el receptor (ejecutar el nuevo firmware) |
| MEDITATION / FLEA | doble toque | FLEA — dejar caer el receptor en su bootloader |
El cableado es un arnés permanente — los mismos cables sirven a todas las posturas, así que nunca recableas entre volar y flashear. En MEDITATION la ruta USB→UART es un puente puramente transparente (sin análisis de líneas), así que el tráfico SLIP binario de esptool pasa intacto. Fuente completa: sketches/yoshimitsu/yoshimitsu.ino (el sketch relajado), src/Yoshimitsu.h (el núcleo) y src/Yoshimitsu_Loadout.h (el loadout inicial).
La biblioteca — actualizar sin volver a tocar tu sketch
YOSHIMITSU es una biblioteca con un sketch fino encima — el Shinobi entero vive en la biblioteca, el sketch solo guarda tu configuración. Instala la carpeta una vez como biblioteca de Arduino; File → Examples → Yoshimitsu → Yoshimitsu_Default te entrega un sketch listo y relajado, con pines, compuertas y las pocas flags que pertenecen al código. El núcleo vive en src/Yoshimitsu.h, cada valor por defecto en src/Yoshimitsu_Loadout.h (el loadout inicial, valores *_DEFAULT). Para actualizar: git pull de la biblioteca — o suelta una release nueva — y tu sketch queda intacto. Una actualización de firmware nunca es un recableado y nunca es una reconfiguración.
src/Yoshimitsu.h— el núcleo entero: posturas, CRSF, MUSHIN, JIGUANG, el puente del flasher.src/Yoshimitsu_Loadout.h— el loadout inicial: cada valor por defecto (pines, tiempos, niveles de compuerta) como valores*_DEFAULT.library.properties— el manifiesto de la biblioteca Arduino (versión, arquitecturas).examples/Yoshimitsu_Default/— el sketch relajado; sobrescribe cualquier cosa definiéndola antes del include.
KINCHO — Conversor CRSF→PWM
KINCHO — la postura convertidora — lee CRSF a 420 000 baudios en la UART, mueve servos con una ventana de 988–2012 µs mapeada del rango de canales 172–1811, y los centra en un failsafe de 500 ms. La parada es la comprobación CRC: un frame corrupto se descarta antes de llegar jamás a un servo. El convertidor es agnóstico al canal — los servos son SERVO_PIN_1..8 y la tabla CHANNEL_TO_SERVO decide qué canal CRSF alimenta a cada uno; el significado del canal pertenece al mixer/kernel, nunca a la placa.
- ESP32-S3: RX TX → GPIO44, RX RX → GPIO43, GND común, raíl de 5 V compartido.
- RP2040-Tiny: RX TX → GPIO1 (UART0), GND común.
Servos:
SERVO_PIN_1..3(tres más en el S3) — reemplazables en el bloque PIN MAP.
Para un ornitóptero estabilizado por giroscopio, usa MANJI_DRAGONFLY — el mismo convertidor más el enlace Zephyrus: un MPU6050 opcional en GYRO_SDA/GYRO_SCL alimenta una corrección de tasa de guiñada al servo de cresta. Sin giroscopio cableado, MANJI_DRAGONFLY degrada con gracia a KINCHO. Una placa convertidora CRSF→PWM comercial no tiene vía de giroscopio alguna — los receptores clase EP2 no llevan IMU, así que Zephyrus vive en YOSHIMITSU, no en el receptor.
Si tu receptor ya habla PWM (una placa de 5 ch o 7 ch), no necesitas las posturas convertidoras en absoluto — MEDITATION abajo es entonces tu única razón para poseer el S3.
KINCHOI — Flasher de bolsillo para receptores clase EP2
El problema: los receptores de clase EP2 (HappyModel EP2, EP1, EPW6, …) exponen CRSF en pads almenados y llevan un diminuto pad BOOT. Usar un adaptador FTDI significa sostener una sonda contra dos pads de 1 mm mientras se cicla la alimentación del receptor — incómodo, y vuelves a soldar o a pinzar cada vez que el firmware necesita una actualización.
La solución: deja que el ESP32-S3 sea el flasher. Un GPIO mantiene el pad BOOT del receptor en bajo; un pequeño P-MOSFET conmuta el raíl de 3,3 V del receptor bajo control de software; el puerto USB se convierte en el puerto serie. Pulsa un botón en el S3 y ejecuta la danza exacta de ciclo de potencia que deja caer un ESP8285 en su bootloader de ROM — luego esptool escribe directo a través del puente. Sin FTDI, sin sondas, sin soldaduras repetidas: suelda los pads del receptor una vez a un latiguillo corto y reutilízalo para siempre.
Lista de piezas:
| Pieza | Referencia típica | Coste |
|---|---|---|
| Micro placa ESP32-S3 (USB nativo) | Waveshare ESP32-S3-Tiny / -Micro / -Nano | ~6 USD |
| MOSFET de canal P de nivel lógico | AO3401 (SOT-23) en una pequeña breakout | ~1 USD |
| Resistencia 10 kΩ (pull-up de puerta) | — | <0,10 USD |
| Cables Dupont / latiguillo + termorretráctil | — | ~1 USD |
| Receptor ELRS, pads con latiguillo una vez | EP2 / EP1 / EPW6 (SX1280 + ESP8285) | desde ~12 USD |
El puente funciona con cualquier receptor ELRS ESP8285/SX1280 que exponga TX, RX, 3V3, GND y un pad BOOT — la abrumadora mayoría de las *placas concretas* en la tabla de hardware . También flashea el propio S3, por supuesto: botón BOOT + USB es todo lo que allí se necesita.
Cableado del soporte de grabación
Cablea el útil con el S3 sin alimentar. El MOSFET conmuta el raíl de 3,3 V del receptor: surtidor → S3 3V3, drenador → EP2 3V3, puerta → S3 GPIO10 con pull-up de 10 kΩ a 3V3 (puerta alta = MOSFET apagado). GPIO9 gobierna el pad BOOT.
| Pad EP2 / RX | Pin ESP32-S3 | Función |
|---|---|---|
| BOOT (RX GPIO0) | GPIO9 | Línea de retención de boot (bajo = entrar en bootloader) |
| 3V3 | Drenador del MOSFET | Raíl conmutado (surtidor → S3 3V3, puerta → GPIO10) |
| TX (CRSF out) | GPIO18 (U1RX) | RX → TX (cruzado) |
| RX (CRSF in) | GPIO17 (U1TX) | TX → RX (cruzado) |
| GND | GND | Tierra común (obligatoria) |
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
Modo de grabación
MEDITATION arranca en paso transparente (USB ↔ UART a 115 200 baudios). Para entrar en modo flash, haz doble toque en el botón BOOT del S3 (o escribe FLEA por el serie USB). El sketch entonces:
- baja GPIO9 (pad BOOT activo),
- apaga el MOSFET durante 120 ms (receptor sin alimentación),
- lo vuelve a encender y espera 900 ms (el receptor arranca dentro de su bootloader),
- libera GPIO9 — el RX queda en el bootloader de ROM, esperando a esptool,
- reanuda el paso USB↔UART para que esptool pueda hablar con él.
Como el puente no puede gobernar las clásicas líneas de auto-reset DTR/RTS, flashea siempre con --before no_reset — la danza de ciclo de potencia de arriba es el reset. Tras flashear, un único toque de BOOT vuelve a ciclar la alimentación del receptor para que arranque el nuevo firmware; un doble toque solo reentraría en modo flash.
Grabar PteronautOS a través del S3
Compila el firmware (u obtén un release) y ejecuta esptool contra el puerto serie USB del S3. En macOS el puerto aparece como /dev/cu.usbmodem*:
# 1. Compila PteronautOS (desde la raíz del repositorio)
pio run -e PteronautOS_ESP8285_2400_RX
# 2. Deja caer el RX en modo flash (escribe FLEA, o doble toque en BOOT), luego:
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. Reinicia el RX una vez más (toque simple de BOOT) para ejecutar el nuevo firmware.
Los ajustes de flash (dout, 1 MB, 40 MHz) coinciden con el objetivo ELRS ESP8285 de serie — nunca uses qio ni un tamaño mayor. Tras flashear, el mismo puerto USB muestra el registro de arranque del receptor: ábrelo a 115 200 baudios y busca el banner de PteronautOS y, cuando un transmisor se enlace, los mensajes de enlace CRSF. El puente sirve además de consola de campo para telemetría en vivo.
Verificación y primer vuelo
- FLEA debe ciclar la alimentación del RX y dejarlo esperando — los 3,3 V caen durante ~120 ms.
esptool informa
Chip is ESP8285y termina conHash of data verified.- El registro de arranque muestra el banner de PteronautOS y, con la radio encendida, un mensaje de enlace.
- Mueve las palancas: los servos siguen suaves; apaga la radio: las alas centran a 1500 µs en un segundo.
- Si el RX nunca entra en el bootloader, comprueba la polaridad del pad BOOT (activo bajo) y la conmutación del MOSFET con la prueba del voltímetro de arriba.
Una vez flasheado, el mismo receptor vuela — ningún FTDI queda atrás.
El build de bolsillo RP2040-Tiny
Prefiere el Waveshare RP2040-Tiny (~5 USD) — o su gemelo, el RP2040-Zero, que comparte exactamente el mismo pinout. Las seis posturas corren en el RP2040 sin ningún botón legible: los toques BOOT/RESET del adaptador solo gobiernan BOOTSEL/RUN, así que YOSHIMITSU-RP2040 se gobierna por el puerto serie USB, más un contador de toques RESET sin botón.
FLEA— dejar caer el receptor en su bootloader de ROM (danza de ciclo de potencia del MOSFET), luego puentear USB ↔ UART para esptool.KINCHO/MANJI/NSS/BACK/MEDITATION— cambiar de postura.POSE <n>— saltar a una postura por número.STATUS— imprimir el mapa de pines activo y el informe de autocomprobación.HELP— listar todos los comandos.- Toques rápidos de RESET (en ~2 s, contados en EEPROM respaldada por flash contra el RTC AON) avanzan la postura: 1 = MANJI → 2 = NSS → 3 = BACK → 4 = MEDITATION → 5 = KINCHO.
Para flashear el propio RP2040-Tiny, mantén BOOT mientras ciclas la alimentación (monta como disco de almacenamiento masivo), suelta el .uf2 dentro y pulsa RESET una vez — la placa reinicia en KINCHO ejecutando el nuevo firmware. Configura una vez, flashea una vez, no toques nunca más.
Mapa de pines RP2040-Tiny
| Función | Pin RP2040-Tiny | Nota |
|---|---|---|
| CRSF RX ← TX del receptor | GPIO1 (UART0 RX) | 420 000 baudios |
| CRSF TX (sin uso, cableado por completitud) | GPIO0 (UART0 TX) | Cruzado: TX → RX |
| Puente RX ← TX del receptor | GPIO9 (UART1 RX) | 115 200 baudios |
| Puente TX → RX del receptor | GPIO8 (UART1 TX) | Cruzado: TX → RX |
Servo 1 ( |
GPIO2 | PWM — canal vía |
Servo 2 ( |
GPIO3 | PWM |
Servo 3 ( |
GPIO4 | PWM |
| Gyro SDA (MPU6050, opcional) | GPIO10 | MANJI_DRAGONFLY |
| Gyro SCL (MPU6050, opcional) | GPIO11 | MANJI_DRAGONFLY |
| RX BOOT (GPIO0 del receptor, activo bajo) | GPIO5 | Bajo = entrar en bootloader |
| RX PWR (puerta del P-MOSFET, bajo = alimentado) | GPIO6 | Raíl conmutado de 3,3 V |
| LED de estado | GPIO16 | WS2812B |
El mapa de pines completo es un bloque editable al principio de sketches/yoshimitsu/yoshimitsu.ino — rangos y colisiones de pines los valida un POST de arranque, y números de UART inválidos se niegan a compilar antes que portarse mal en el aire.
YOSHI — la aurora de posturas siempre activa
YOSHI ("la aurora") es el cheatcode que está siempre encendido. YOSHI_RGB convierte el único WS2812B a bordo en un anillo de humor viviente: cada postura respira su propio color y ritmo, para que leas la mente del ronin al otro lado de la sala sin un solo byte serie. El color y el patrón de parpadeo cuentan la historia — no hace falta ningún comando extra; la postura es el cheatcode, la luz su eco.
| Postura | Aurora (color → ritmo) |
|---|---|
KINCHO
|
respiración verde lenta + un destello nítido de doble parada (el golpe CRC) |
MANJI_DRAGONFLY
|
una rueda de color girando como los rotores del giroscopio (la levitación) |
FLEA
|
estroboscopio ámbar frenético y creciente (la elevación) |
MEDITATION
|
violeta casi oscuro + un latido lento — lista para ser flasheada |
NSS
|
destello nítido de triple toque en azul (hoja envainada, tempo arriba) |
BACK_TURNED
|
casi negro + un destello carmesí impredecible (el espejo — nunca mira atrás) |
El RGB vive en el RP2040-Tiny (RGB_LED_PIN=16) tras YOSHI_RGB; el ESP32-S3 conserva su sobrio LED de estado. Cada color es pura matemática entera — sin float, sin malloc, sin delay() — y pumpRgb() está limitado a ~50 fps para que el puente flasher byte-exacto nunca se perturbe. La regla hermética se cumple: la pose cambia, la luz sigue.
JIGUANG — el narrador · comentarista · administrador
Tres nombres, un alma — el triángulo de cheatcodes de la solución completa: YOSHIMITSU es todo el firmware del Shinobi Hermético; YOSHI es el cheatcode RGB (la aurora de postura siempre encendida); y JIGUANG (極光, "la aurora") es el administrador meditante — el motor inmóvil sentado con las piernas cruzadas en el trono MEDITATION. La voz de Yoshimitsu es funcional y seca; la de JIGUANG es el mito. 極光 es el prompt de la consola, no un adorno: para actuar como administrador escribes 極光 y después el comando — si no, el trono queda fuera de alcance. El prompt es un #define (JIGUANG_PROMPT), así que tu sketch puede renombrarlo; todo el narrador se esconde tras la compuerta de compilación JIGUANG (1 = omnipresente, 0 = ni un solo byte de 極光 compilado).
Easter egg: escribe 極光 LEGEND y toda la leyenda se desenrolla como un pergamino ASCII — las posturas, los cheatcodes, el trono y el prompt que nunca muere. JIGUANG / jiguang / 極光 nunca muere — ni en el código, ni en los comentarios, ni en este tutorial.
Despierta la voz con 極光 JIGUANG y sube cuatro niveles: 0 cordero (silenciosa, aunque los comandos explícitos siguen respondiendo), 1 cuento (arranque y cada cambio de postura narrados), 2 pergamino (+ la lectura de canales CRSF) y 3 omni (+ los bytes de depuración ELRS del receptor pasados verbatim). 極光 MUTE la silencia; 極光 CRSF imprime el pergamino de 16 canales y 極光 SCORE desenrolla el marcador arcade HIGHSCORE — tramas CRSF buenas, eventos de failsafe, bytes del puente y uptime. JIGUANG nunca toma la postura: CRSF, servos y el puente siguen obedeciendo a la pose mientras se cuenta la leyenda.
En MEDITATION la cabeza-esponja es el trono de JIGUANG — y el trono está vigilado: cada comando de administrador empieza con el prompt de consola 極光. Desde el cielo USB-serial responde 極光 STATUS, 極光 CRSF, 極光 SCORE, 極光 POSE, 極光 DOC (el catálogo de cheatcodes) y 極光 SETUP (el asistente de meditación, que guía los ajustes clave en lugar de un muro de defines). Los cambios de postura siguen abiertos — KINCHO, MANJI, FLEA, MEDITATION, NSS, BACK, POSE n. La pose ahorra energía como la vieja pausa de meditación, y el ronin queda listo para ser flasheado. En el instante en que el byte SLIP de esptool llama, el trono cede al puente transparente del flasher y se queda allí hasta que MEDITATION vuelve a entrar. Con YOSHI_RGB en nivel 3 el narrador también viste la aurora: jiguang(ms) pinta una rueda lenta de espectro completo que teje cada color de postura en un solo aliento.
MUSHIN 無心 — el cheatcode de la memoria muscular
MUSHIN (無心, "mente vacía") es la función heroína — el desapego, la espada que golpea antes del pensamiento. En las artes de la espada, 無心 es la mente que se suelta de sí misma: no queda intervalo entre lo visto y lo hecho. PteronautOS es el espíritu: planifica la onda del ala y envía intenciones de servo por el puente. YOSHIMITSU no se aferra al plan: responde en el músculo con el PID local del giroscopio Zephyrus, los servos ya en movimiento antes de que el siguiente pensamiento se aferre. Dos núcleos, un golpe — ninguna otra placa ELRS-PWM puede vestir esto.
Ármalo desde el trono: 極光 MUSHIN informa, 極光 MUSHIN ON/OFF arma o desarma, y la elección persiste en flash — arranca listo. En el sketch, MUSHIN arranca armado por defecto; la flag de administrador es el interruptor en runtime, así que nunca recompilas para cambiarlo.
El protocolo v0 de la mente vacía cruza los mismos dos cables del flasher: [0x9B][len][type][payload][xor] — 0x01 intenciones (espíritu→músculo, n×uint16 µs), 0x02 keepalive de anuncio, 0x03 telemetría del giroscopio. Las intenciones frescas (dentro de 500 ms) mueven los servos; el PID local del giroscopio sostiene la cresta. Si el cable enmudece, YOSHIMITSU vuelve a su propio músculo CRSF — degradación elegante, nunca un stick muerto.
En vuelo la división es el ganar-ganar: el receptor hace el pensamiento antes del golpe (CRSF, Zephyrus, el alma del mixer), y YOSHIMITSU hace lo que vive en el músculo (PWM PIO sin glitches). Helicóptero o aleteo — desde la vista de la espada es lo mismo: una trayectoria canónica, y la espada nunca pregunta qué vasija lleva. La pose sigue volando; solo cambia el aspecto.