06
YOSHIMITSU — a solução completa: todos os cheatcodes, um pergaminho
Uma fábula de cheatcodes onde só há vencedores. Um sketch relaxado, seis posturas, um arnês permanente: a parada CRSF→PWM (KINCHO), a levitação giroscópica do Zephyrus (MANJI_DRAGONFLY), o gravador de bolso (FLEA · MEDITATION), a bancada sem espada (NSS), o espelho que nunca olha para trás (BACK_TURNED) — mais YOSHI, a aurora sempre acesa, e JIGUANG (極光), o administrador meditante que conta a lenda. Liga uma vez, grava uma vez; depois disso a biblioteca atualiza-se e o trono comanda.
Uma placa, seis posturas
YOSHIMITSU é o Shinobi Hermético com seis posturas — cada postura uma vitória diferente, todas vestindo a mesma alma. Um sketch relaxado compila para as duas placas; as posturas alternam por comando USB, botão GPIO0 (ESP32-S3) ou toques de RESET (RP2040-Tiny):
| Postura | Significado |
|---|---|
KINCHO
|
Conversor CRSF→PWM — a parada (o CRC descarta o falso). Sem nomes de canal, sem giroscópio. |
MANJI_DRAGONFLY
|
Conversor + ligação giroscópio Zephyrus (MPU6050 opcional) — a levitação. |
FLEA
|
Gabarito de ciclo de energia — o levantar que derruba o RX no seu bootloader. |
MEDITATION
|
Flasher de bolso — a cabeça-esponja, poupando energia, pronta para ser gravada. |
NSS
|
Bancada sem-espada — servo direto por USB, sem RF. |
BACK_TURNED
|
A inércia enganosa — um espelho UART vivo. Nunca olha para trás. |
Um sketch, dois alvos: sketches/yoshimitsu/yoshimitsu.ino compila para o Waveshare RP2040-Tiny (o mais leve, sem botão a bordo) e para qualquer ESP32-S3 com USB nativo, com os cores padrão arduino-pico / arduino-esp32. No Arduino IDE o mesmo sketch vive em File → Examples → Yoshimitsu → Yoshimitsu_Default.
YOSHIMITSU — o firmware combinado
YOSHIMITSU é o firmware recomendado. Ele arranca em KINCHO (o conversor) e move-se entre as posturas. A consola USB é o interruptor canónico nas duas placas — KINCHO → MANJI → FLEA → MEDITATION → NSS → BACK → POSE <n>. No ESP32-S3 o botão BOOT (GPIO0) é uma segunda superfície:
| Contexto | Gesto | Ação |
|---|---|---|
| qualquer postura | toque duplo | cicla KINCHO → MANJI → NSS → BACK → KINCHO → |
| qualquer postura | pressão longa 2 s | entra em MEDITATION |
| MEDITATION / FLEA | toque simples | reinicia o recetor (executa o novo firmware) |
| MEDITATION / FLEA | toque duplo | FLEA — derruba o recetor no seu bootloader |
A cablagem é um arnês permanente — os mesmos fios servem todas as posturas, por isso nunca voltas a cablar entre voar e gravar. Em MEDITATION o caminho USB→UART é uma ponte puramente transparente (sem parsing de linhas), por isso o tráfego SLIP binário do esptool atravessa intocado. Fonte completa: sketches/yoshimitsu/yoshimitsu.ino (o sketch relaxado), src/Yoshimitsu.h (o núcleo) e src/Yoshimitsu_Loadout.h (o loadout inicial).
A biblioteca — atualizar sem voltar a tocar no teu sketch
YOSHIMITSU é uma biblioteca com um sketch fino por cima — o Shinobi inteiro vive na biblioteca, o sketch guarda apenas a tua configuração. Instala a pasta uma vez como biblioteca Arduino; File → Examples → Yoshimitsu → Yoshimitsu_Default entrega-te um sketch pronto e relaxado, com pinos, portões e as poucas flags que pertencem ao código. O núcleo vive em src/Yoshimitsu.h, todos os valores por omissão em src/Yoshimitsu_Loadout.h (o loadout inicial, valores *_DEFAULT). Para atualizar: git pull na biblioteca — ou larga uma nova release — e o teu sketch fica intocado. Uma atualização de firmware nunca é uma recablagem e nunca é uma reconfiguração.
src/Yoshimitsu.h— o núcleo inteiro: posturas, CRSF, MUSHIN, JIGUANG, a ponte do gravador.src/Yoshimitsu_Loadout.h— o loadout inicial: todos os valores por omissão (pinos, tempos, níveis dos portões) como valores*_DEFAULT.library.properties— o manifesto da biblioteca Arduino (versão, arquiteturas).examples/Yoshimitsu_Default/— o sketch relaxado; substitui qualquer coisa definindo-a antes do include.
KINCHO — Conversor CRSF→PWM
KINCHO — a postura conversora — lê CRSF a 420 000 baud na UART, conduz os servos com uma janela de 988–2012 µs mapeada da gama de canais 172–1811, e centra-os num failsafe de 500 ms. A parada é a verificação CRC: um frame corrompido é descartado antes de alguma vez chegar a um servo. O conversor é agnóstico ao canal — os servos são SERVO_PIN_1..8 e a tabela CHANNEL_TO_SERVO decide qual canal CRSF alimenta cada um; o significado do canal pertence ao mixer/kernel, nunca à placa.
- ESP32-S3: RX TX → GPIO44, RX RX → GPIO43, GND comum, barramento de 5 V partilhado.
- RP2040-Tiny: RX TX → GPIO1 (UART0), GND comum.
Servos:
SERVO_PIN_1..3(mais três no S3) — substituíveis no bloco PIN MAP.
Para um ornitóptero estabilizado por giroscópio, usa MANJI_DRAGONFLY — o mesmo conversor mais a ligação Zephyrus: um MPU6050 opcional em GYRO_SDA/GYRO_SCL alimenta uma correção de taxa de guinada no servo da crista. Sem giroscópio ligado, MANJI_DRAGONFLY degrada com graça para KINCHO. Uma placa conversora CRSF→PWM comercial não tem via de giroscópio nenhuma — recetores da classe EP2 não trazem IMU, por isso Zephyrus vive em YOSHIMITSU, não no recetor.
Se o teu recetor já fala PWM (uma placa de 5 ch ou 7 ch), não precisas das posturas conversoras de todo — MEDITATION abaixo é então a tua única razão para teres o S3.
KINCHOI — Flasher de bolso para recetores da classe EP2
O problema: recetores da classe EP2 (HappyModel EP2, EP1, EPW6, …) expõem CRSF em pads ameados e carregam um minúsculo pad BOOT. Usar um adaptador FTDI significa segurar uma sonda contra dois pads de 1 mm enquanto se cicla a energia do recetor — desconfortável, e voltas a soldar ou a prender de cada vez que o firmware precisa de atualização.
A solução: deixa o ESP32-S3 ser o flasher. Um GPIO segura o pad BOOT do recetor em baixo; um pequeno P-MOSFET comuta o barramento de 3,3 V do recetor sob controlo de software; a porta USB torna-se a porta série. Carrega num botão do S3 e ele executa a dança exata de ciclo de energia que derruba um ESP8285 no seu bootloader de ROM — depois o esptool escreve direto através da ponte. Sem FTDI, sem sondas, sem soldaduras repetidas: solda os pads do recetor uma vez a um rabicho curto e reutiliza-o para sempre.
Lista de peças:
| Peça | Referência típica | Custo |
|---|---|---|
| Micro placa ESP32-S3 (USB nativo) | Waveshare ESP32-S3-Tiny / -Micro / -Nano | ~6 USD |
| MOSFET de canal P de nível lógico | AO3401 (SOT-23) numa pequena breakout | ~1 USD |
| Resistência 10 kΩ (pull-up da gate) | — | <0,10 USD |
| Fios Dupont / rabicho + termorretrátil | — | ~1 USD |
| Recetor ELRS, pads com rabicho uma vez | EP2 / EP1 / EPW6 (SX1280 + ESP8285) | desde ~12 USD |
A ponte funciona com qualquer recetor ELRS ESP8285/SX1280 que exponha TX, RX, 3V3, GND e um pad BOOT — a esmagadora maioria das *placas concretas* na tabela de hardware . Também grava o próprio S3, claro: botão BOOT + USB é tudo o que ali é preciso.
Ligação do suporte de gravação
Liga o jig com o S3 desligado. O MOSFET comuta o barramento de 3,3 V do recetor: source → S3 3V3, drain → EP2 3V3, gate → S3 GPIO10 com pull-up de 10 kΩ para 3V3 (gate alta = MOSFET desligado). O GPIO9 comanda o pad BOOT.
| Pad EP2 / RX | Pino ESP32-S3 | Função |
|---|---|---|
| BOOT (RX GPIO0) | GPIO9 | Linha de retenção de boot (baixo = entrar no bootloader) |
| 3V3 | Dreno do MOSFET | Barramento comutado (source → S3 3V3, gate → GPIO10) |
| TX (CRSF out) | GPIO18 (U1RX) | RX → TX (cruzado) |
| RX (CRSF in) | GPIO17 (U1TX) | TX → RX (cruzado) |
| GND | GND | Terra comum (obrigatório) |
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 gravação
MEDITATION arranca em passagem transparente (USB ↔ UART a 115 200 baud). Para entrar em modo de gravação, faz duplo toque no botão BOOT do S3 (ou escreve FLEA na série USB). O sketch então:
- puxa GPIO9 para baixo (pad BOOT ativo),
- desliga o MOSFET por 120 ms (recetor sem energia),
- volta a ligá-lo e espera 900 ms (recetor arranca dentro do seu bootloader),
- liberta GPIO9 — o RX agora está no bootloader de ROM, à espera do esptool,
- retoma a passagem USB↔UART para o esptool poder falar com ele.
Como a ponte não consegue comandar as clássicas linhas de auto-reset DTR/RTS, grava sempre com --before no_reset — a dança de ciclo de energia acima é o reset. Depois de gravar, um único toque BOOT volta a ciclar a energia do recetor para ele arrancar o novo firmware; um duplo toque apenas reentraria no modo de gravação.
Gravar o PteronautOS através do S3
Compila o firmware (ou obtém um release) e depois corre o esptool contra a porta série USB do S3. No macOS a porta aparece como /dev/cu.usbmodem*:
# 1. Compila o PteronautOS (da raiz do repositório)
pio run -e PteronautOS_ESP8285_2400_RX
# 2. Deita o RX no modo de gravação (escreve FLEA, ou duplo toque em BOOT), depois:
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 o RX mais uma vez (um toque BOOT) para correr o novo firmware.
As definições de gravação (dout, 1 MB, 40 MHz) correspondem ao alvo ELRS ESP8285 de fábrica — nunca uses qio nem um tamanho maior. Depois de gravar, a mesma porta USB mostra o registo de arranque do recetor: abre-a a 115 200 baud e procura o banner PteronautOS e, assim que um emissor se ligar, as mensagens de ligação CRSF. A ponte ainda serve de consola de campo para telemetria ao vivo.
Verificação e primeiro voo
- FLEA deve ciclar a energia do RX e deixá-lo à espera — os 3,3 V caem durante ~120 ms.
esptool reporta
Chip is ESP8285e termina comHash of data verified.- O registo de arranque mostra o banner PteronautOS e, com o rádio ligado, uma mensagem de ligação.
- Mexe nos sticks: os servos seguem suavemente; desliga o rádio: as asas centram em 1500 µs num segundo.
- Se o RX nunca entra no bootloader, verifica a polaridade do pad BOOT (ativo baixo) e a comutação do MOSFET com o teste do voltímetro acima.
Uma vez gravado, o mesmo recetor voa — nenhum FTDI fica para trás.
O build de bolso RP2040-Tiny
Prefere o Waveshare RP2040-Tiny (~5 USD) — ou o seu gémeo, o RP2040-Zero, que partilha exatamente o mesmo pinout. Todas as seis posturas correm no RP2040 sem nenhum botão legível: os taps BOOT/RESET do adaptador apenas comandam BOOTSEL/RUN, por isso o YOSHIMITSU-RP2040 é comandado pela porta série USB, mais um contador de taps RESET sem botão.
FLEA— deita o recetor no seu bootloader de ROM (dança de ciclo de energia do MOSFET), depois faz ponte USB ↔ UART para o esptool.KINCHO/MANJI/NSS/BACK/MEDITATION— muda de postura.POSE <n>— salta para uma postura pelo número.STATUS— imprime o mapa de pinos ativo e o relatório de autoteste.HELP— lista todos os comandos.- Taps RESET rápidos (dentro de ~2 s, contados em EEPROM persistida contra o RTC AON) avançam a postura: 1 = MANJI → 2 = NSS → 3 = BACK → 4 = MEDITATION → 5 = KINCHO.
Para gravar o próprio RP2040-Tiny, segura BOOT enquanto ciclas a energia (ele monta como disco de armazenamento em massa), larga o .uf2 lá, depois pressiona RESET uma vez — a placa reinicia em KINCHO a correr o novo firmware. Configura uma vez, grava uma vez, nunca mais mexes.
Mapa de pinos RP2040-Tiny
| Função | Pino RP2040-Tiny | Nota |
|---|---|---|
| CRSF RX ← TX do recetor | GPIO1 (UART0 RX) | 420 000 baud |
| CRSF TX (não usado, ligado por completude) | GPIO0 (UART0 TX) | Cruzado: TX → RX |
| Ponte RX ← TX do recetor | GPIO9 (UART1 RX) | 115 200 baud |
| Ponte TX → RX do recetor | GPIO8 (UART1 TX) | Cruzado: TX → RX |
Servo 1 ( |
GPIO2 | PWM — canal via |
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 do recetor, ativo baixo) | GPIO5 | Baixo = entrar no bootloader |
| RX PWR (gate do P-MOSFET, baixo = ligado) | GPIO6 | Barramento comutado de 3,3 V |
| LED de estado | GPIO16 | WS2812B |
O mapa de pinos completo é um bloco editável no topo de sketches/yoshimitsu/yoshimitsu.ino — gamas e colisões de pinos são validadas por um POST de arranque, e números de UART inválidos recusam-se a compilar em vez de se portarem mal no ar.
YOSHI — a aurora das posturas sempre ativa
YOSHI ("a aurora") é o cheatcode que está sempre ligado. YOSHI_RGB transforma o único WS2812B embarcado num anel de humor vivo: cada postura respira a sua própria cor e ritmo, para leres a mente do ronin do outro lado da sala sem um único byte de série. Cor e padrão de piscar contam a história — nenhum comando extra é preciso; a postura é o cheatcode, a luz é o seu eco.
| Postura | Aurora (cor → ritmo) |
|---|---|
KINCHO
|
respiração verde lenta + um flash de dupla parada nítido (o golpe CRC) |
MANJI_DRAGONFLY
|
uma roda de cores a girar como os rotores do gyro (a levitação) |
FLEA
|
estroboscópio âmbar frenético e crescente (o levantar) |
MEDITATION
|
violeta quase escuro + um batimento lento — pronta para ser gravada |
NSS
|
flash de triplo toque nítido em azul (lâmina embainhada, tempo a subir) |
BACK_TURNED
|
quase negro + um lampejo carmesim imprevisível (o espelho — nunca olha para trás) |
O RGB vive no RP2040-Tiny (RGB_LED_PIN=16) atrás de YOSHI_RGB; o ESP32-S3 mantém o seu sóbrio LED de estado. Todas as cores são pura matemática inteira — sem float, sem malloc, sem delay() — e pumpRgb() é limitado a ~50 fps para a ponte flasher byte-exata nunca ser perturbada. A regra hermética mantém-se: a pose muda, a luz segue.
JIGUANG — o narrador · comentador · administrador
Três nomes, uma alma — o triângulo de cheatcodes da solução completa: YOSHIMITSU é todo o firmware do Shinobi Hermético; YOSHI é o cheatcode RGB (a aurora de postura sempre acesa); e JIGUANG (極光, "a aurora") é o administrador meditante — o motor imóvel sentado de pernas cruzadas no trono MEDITATION. A voz de Yoshimitsu é funcional e seca; a de JIGUANG é o mito. 極光 é o prompt da consola, não um adorno: para agir como administrador escreves 極光 e depois o comando — senão o trono fica fora de alcance. O prompt é um #define (JIGUANG_PROMPT), por isso o teu sketch pode renomeá-lo; todo o contador de histórias esconde-se atrás do portão de compilação JIGUANG (1 = omnipresente, 0 = nem um único byte de 極光 compilado).
Easter egg: escreve 極光 LEGEND e a lenda inteira desenrola-se como um pergaminho ASCII — as posturas, os cheatcodes, o trono e o prompt que nunca morre. JIGUANG / jiguang / 極光 nunca morre — nem no código, nem nos comentários, nem neste tutorial.
Acorda a voz com 極光 JIGUANG e ela sobe quatro níveis: 0 cordeiro (silenciosa, embora comandos explícitos ainda respondam), 1 conto (arranque e cada mudança de postura narrados), 2 pergaminho (+ a leitura dos canais CRSF) e 3 omni (+ os bytes de debug ELRS do recetor passados verbatim). 極光 MUTE silencia-a; 極光 CRSF imprime o pergaminho de 16 canais e 極光 SCORE desenrola o placar arcade HIGHSCORE — frames CRSF bons, eventos de failsafe, bytes da ponte e uptime. JIGUANG nunca toma a postura: CRSF, servos e a ponte continuam a obedecer à pose enquanto a lenda é contada.
Em MEDITATION a cabeça-de-esponja é o trono de JIGUANG — e o trono está guardado: cada comando de administrador começa com o prompt da consola 極光. Do céu USB-serial ele responde 極光 STATUS, 極光 CRSF, 極光 SCORE, 極光 POSE, 極光 DOC (o catálogo de cheatcodes) e 極光 SETUP (o assistente de meditação, que guia as definições-chave em vez de uma muralha de defines). As mudanças de postura ficam abertas — KINCHO, MANJI, FLEA, MEDITATION, NSS, BACK, POSE n. A pose poupa energia como a velha pausa de meditação, e o ronin fica pronto a ser gravado. No instante em que o byte SLIP do esptool chama, o trono cede à ponte transparente do gravador e lá fica até MEDITATION reentrar. Com YOSHI_RGB no nível 3 o contador de histórias também veste a aurora: jiguang(ms) pinta uma roda lenta de espetro completo que tece cada cor de postura num único fôlego.
MUSHIN 無心 — o cheatcode da memória muscular
MUSHIN (無心, "mente vazia") é a funcionalidade-heroína — o desapego, a espada que golpeia antes do pensamento. Nas artes da espada, 無心 é a mente que se solta de si mesma: nenhum intervalo resta entre o que é visto e o que é feito. O PteronautOS é o espírito: planeia a onda da asa e envia intenções de servo pela ponte. YOSHIMITSU não se agarra ao plano: responde no músculo com o PID local do giroscópio Zephyrus, os servos já em movimento antes que o próximo pensamento se agarre. Dois núcleos, um golpe — nenhuma outra placa ELRS-PWM pode vestir isto.
Arma-o a partir do trono: 極光 MUSHIN relata, 極光 MUSHIN ON/OFF arma ou desarma, e a escolha persiste em flash — arranca pronto. No sketch, MUSHIN arranca armado por omissão; a flag de administrador é o interruptor de runtime, por isso nunca recompilas para o mudar.
O protocolo v0 da mente vazia atravessa os mesmos dois fios do gravador: [0x9B][len][type][payload][xor] — 0x01 intenções (espírito→músculo, n×uint16 µs), 0x02 keepalive de anúncio, 0x03 telemetria do giroscópio. Intenções frescas (dentro de 500 ms) acionam os servos; o PID local do giroscópio segura a crista. Se o fio ficar mudo, YOSHIMITSU volta ao seu próprio músculo CRSF — degradação graciosa, nunca um stick morto.
Em voo a divisão é o ganha-ganha: o recetor faz o pensamento antes do golpe (CRSF, Zephyrus, a alma do mixer), e YOSHIMITSU faz o que vive no músculo (PWM PIO sem glitches). Helicóptero ou bater de asas — da vista da espada é igual: uma trajetória canónica, e a espada nunca pergunta que vaso carrega. A pose continua a voar; só muda a aparência.