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 — KINCHOMANJIFLEAMEDITATIONNSSBACKPOSE <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.

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.

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:

  1. baja GPIO9 (pad BOOT activo),
  2. apaga el MOSFET durante 120 ms (receptor sin alimentación),
  3. lo vuelve a encender y espera 900 ms (el receptor arranca dentro de su bootloader),
  4. libera GPIO9 — el RX queda en el bootloader de ROM, esperando a esptool,
  5. 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

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.

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

GPIO2

PWM — canal vía CHANNEL_TO_SERVO

Servo 2 (SERVO_PIN_2)

GPIO3 PWM

Servo 3 (SERVO_PIN_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.