06
YOSHIMITSU — die Komplettlösung: alle Cheatcodes, eine Schriftrolle
Eine Cheatcode-Fabel, in der es nur Gewinner gibt. Ein entspannter Sketch, sechs Stellungen, ein permanentes Geschirr: die CRSF→PWM-Parade (KINCHO), die Zephyrus-Gyro-Levitation (MANJI_DRAGONFLY), der Taschenflasher (FLEA · MEDITATION), die schwertlose Werkbank (NSS), der Spiegel, der nie zurückschaut (BACK_TURNED) — dazu YOSHI, die immer leuchtende Aurora, und JIGUANG (極光), der meditierende Administrator, der die Legende erzählt. Einmal verdrahten, einmal flashen; danach aktualisiert sich die Bibliothek und der Thron befiehlt.
Ein Board, sechs Posen
YOSHIMITSU ist der Hermetische Shinobi mit sechs Stellungen — jede Stellung ein anderer Sieg, alle tragen dieselbe Seele. Ein entspannter Sketch baut für beide Boards; die Stellungen wechseln per USB-Befehl, GPIO0-Taste (ESP32-S3) oder RESET-Taps (RP2040-Tiny):
| Stance | Bedeutung |
|---|---|
KINCHO
|
CRSF→PWM-Wandler — die Parade (CRC verwirft das Falsche). Keine Kanalnamen, kein Gyro. |
MANJI_DRAGONFLY
|
Wandler + Zephyrus-Gyro-Link (optional MPU6050) — die Levitation. |
FLEA
|
Power-Cycle-Jig — der Heber, der den RX in seinen Bootloader fallen lässt. |
MEDITATION
|
Taschen-Flasher — der Schwammkopf, energiesparend, bereit geflasht zu werden. |
NSS
|
No-Sword-Werkbank — Servo direkt über USB, kein RF. |
BACK_TURNED
|
Der täuschende Leerlauf — ein lebender UART-Spiegel. Blickt nie zurück. |
Ein Sketch, zwei Ziele: sketches/yoshimitsu/yoshimitsu.ino kompiliert für den Waveshare RP2040-Tiny (der leichteste, ohne Onboard-Taste) und jedes Native-USB-ESP32-S3, mit den Standard-Cores arduino-pico / arduino-esp32. In der Arduino IDE lebt derselbe Sketch unter File → Examples → Yoshimitsu → Yoshimitsu_Default.
YOSHIMITSU — die kombinierte Firmware
YOSHIMITSU ist die empfohlene Firmware. Sie bootet in KINCHO (dem Wandler) und wechselt zwischen den Stances. Die USB-Konsole ist der kanonische Schalter auf beiden Platinen — KINCHO → MANJI → FLEA → MEDITATION → NSS → BACK → POSE <n>. Auf dem ESP32-S3 ist der BOOT-Knopf (GPIO0) eine zweite Oberfläche:
| Kontext | Geste | Aktion |
|---|---|---|
| jede Stance | Doppeltipp | KINCHO → MANJI → NSS → BACK → KINCHO → durchschalten |
| jede Stance | 2 s lang drücken | in MEDITATION gehen |
| MEDITATION / FLEA | einfacher Tipp | Empfänger neu starten (neue Firmware ausführen) |
| MEDITATION / FLEA | Doppeltipp | FLEA — den Empfänger in seinen Bootloader fallen lassen |
Die Verdrahtung ist ein permanentes Geschirr — dieselben Drähte dienen jeder Stellung, du verdrahtest also nie neu zwischen Fliegen und Flashen. In MEDITATION ist der USB→UART-Pfad eine rein transparente Brücke (kein Zeilen-Parsing), daher passiert esptools binärer SLIP-Verkehr unberührt. Voller Quellcode: sketches/yoshimitsu/yoshimitsu.ino (der entspannte Sketch), src/Yoshimitsu.h (der Kern) und src/Yoshimitsu_Loadout.h (das Start-Loadout).
Die Bibliothek — aktualisieren, ohne deinen Sketch anzufassen
YOSHIMITSU ist eine Bibliothek mit einem dünnen Sketch darüber — der ganze Shinobi lebt in der Bibliothek, der Sketch hält nur deine Konfiguration. Installiere den Ordner einmal als Arduino-Bibliothek; File → Examples → Yoshimitsu → Yoshimitsu_Default reicht dir einen fertigen, entspannten Sketch mit Pins, Gates und den wenigen Flags, die in den Code gehören. Der Kern lebt in src/Yoshimitsu.h, jeder Standardwert in src/Yoshimitsu_Loadout.h (das Start-Loadout, *_DEFAULT-Werte). Zum Aktualisieren: git pull der Bibliothek — oder wirf ein neues Release ein — und dein Sketch bleibt unberührt. Ein Firmware-Update ist niemals ein Neu-Verdrahten und niemals ein Neu-Konfigurieren.
src/Yoshimitsu.h— der ganze Kern: Stellungen, CRSF, MUSHIN, JIGUANG, die Flasher-Brücke.src/Yoshimitsu_Loadout.h— das Start-Loadout: jeder Standardwert (Pins, Timings, Gate-Level) als*_DEFAULT-Werte.library.properties— das Arduino-Bibliotheks-Manifest (Version, Architekturen).examples/Yoshimitsu_Default/— der entspannte Sketch; überschreibe alles, indem du es vor dem Include definierst.
KINCHO — CRSF→PWM-Konverter
KINCHO — die Wandler-Stance — liest CRSF mit 420 000 baud auf der UART, treibt Servos mit einem 988–2012 µs-Fenster, abgebildet aus dem 172–1811-Kanalbereich, und zentriert sie bei einem 500 ms-Failsafe. Die Parade ist die CRC-Prüfung: ein korrupter Frame wird verworfen, bevor er je einen Servo erreicht. Der Wandler ist kanal-agnostisch — Servos sind SERVO_PIN_1..8, und die CHANNEL_TO_SERVO-Tabelle entscheidet, welcher CRSF-Kanal welchen speist; die Kanal-Bedeutung gehört dem Mixer/Kernel, niemals der Platine.
- ESP32-S3: RX TX → GPIO44, RX RX → GPIO43, gemeinsame GND, geteilte 5 V-Schiene.
- RP2040-Tiny: RX TX → GPIO1 (UART0), gemeinsame GND.
Servos:
SERVO_PIN_1..3(drei weitere auf dem S3) — überschreibbar im PIN-MAP-Block.
Für einen gyro-stabilisierten Ornithopter nimm MANJI_DRAGONFLY — derselbe Wandler plus den Zephyrus-Link: ein optionaler MPU6050 an GYRO_SDA/GYRO_SCL speist eine Gierraten-Korrektur in den Kamm-Servo. Ohne angeschlossenen Gyro degradiert MANJI_DRAGONFLY mit Grazie zu KINCHO. Eine kommerzielle CRSF→PWM-Wandlerplatine hat überhaupt keinen Gyro-Pfad — Empfänger der EP2-Klasse tragen keine IMU, also lebt Zephyrus in YOSHIMITSU, nicht im Empfänger.
Wenn dein Empfänger bereits PWM spricht (eine 5 ch- oder 7 ch-Platine), brauchst du die Wandler-Stances überhaupt nicht — MEDITATION unten ist dann dein einziger Grund, das S3 zu besitzen.
KINCHOI — Taschen-Flasher für EP2-Klasse-Empfänger
Das Problem: Empfänger der EP2-Klasse (HappyModel EP2, EP1, EPW6, …) legen CRSF auf Zinnenpads frei und tragen ein winziges BOOT-Pad. Ein FTDI-Adapter bedeutet: eine Sonde gegen zwei 1 mm-Pads halten, während man den Empfänger stromlos schaltet — fummelig, und bei jedem Firmware-Update wird neu gelötet oder neu geklemmt.
Die Lösung: Lass das ESP32-S3 der Flasher sein. Ein GPIO hält das BOOT-Pad des Empfängers auf LOW; ein kleiner P-MOSFET schaltet die 3,3 V-Schiene des Empfängers per Software; der USB-Port wird zum seriellen Port. Ein Knopfdruck am S3 führt exakt den Power-Cycle-Tanz aus, der einen ESP8285 in seinen ROM-Bootloader fallen lässt — dann schreibt esptool direkt durch die Brücke. Kein FTDI, keine Sonden, kein wiederholtes Löten: Löt die Empfänger-Pads einmal an ein kurzes Pigtail und verwende es für immer.
Teileliste:
| Teil | Typische Bezeichnung | Kosten |
|---|---|---|
| ESP32-S3-Mikroboard (natives USB) | Waveshare ESP32-S3-Tiny / -Micro / -Nano | ~6 USD |
| P-Kanal-Logiklevel-MOSFET | AO3401 (SOT-23) auf kleiner Breakout | ~1 USD |
| Widerstand 10 kΩ (Gate-Pull-up) | — | <0,10 USD |
| Dupont- / Pigtail-Drähte + Schrumpfschlauch | — | ~1 USD |
| ELRS-Empfänger, Pads einmalig mit Pigtail | EP2 / EP1 / EPW6 (SX1280 + ESP8285) | ab ~12 USD |
Die Brücke funktioniert mit jedem ESP8285/SX1280-ELRS-Empfänger, der TX, RX, 3V3, GND und ein BOOT-Pad freilegt — die überwältigende Mehrheit der *konkreten Platinen* in der Hardware-Tabelle . Sie flasht natürlich auch das S3 selbst: BOOT-Knopf + USB ist dort alles, was es braucht.
Verdrahtung der Flash-Halterung
Verdrahte den Jig bei stromlosem S3. Der MOSFET schaltet die 3,3 V-Schiene des Empfängers: Source → S3 3V3, Drain → EP2 3V3, Gate → S3 GPIO10 mit 10 kΩ-Pull-up auf 3V3 (Gate HIGH = MOSFET aus). GPIO9 treibt das BOOT-Pad.
| EP2- / RX-Pad | ESP32-S3-Pin | Funktion |
|---|---|---|
| BOOT (RX GPIO0) | GPIO9 | Boot-Halte-Leitung (LOW = Bootloader betreten) |
| 3V3 | MOSFET-Drain | Geschaltete Schiene (Source → S3 3V3, Gate → GPIO10) |
| TX (CRSF out) | GPIO18 (U1RX) | RX → TX (gekreuzt) |
| RX (CRSF in) | GPIO17 (U1TX) | TX → RX (gekreuzt) |
| GND | GND | Gemeinsame Masse (Pflicht) |
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
Flash-Modus
MEDITATION bootet in transparentes Passthrough (USB ↔ UART mit 115 200 baud). Für den Flash-Modus tippe BOOT am S3 doppelt (oder schreibe FLEA über USB-Serial). Der Sketch:
- zieht GPIO9 auf LOW (BOOT-Pad aktiv),
- schaltet den MOSFET für 120 ms aus (Empfänger stromlos),
- schaltet ihn wieder ein und wartet 900 ms (Empfänger startet im Bootloader),
- gibt GPIO9 frei — der RX sitzt nun im ROM-Bootloader und wartet auf esptool,
- nimmt das USB↔UART-Passthrough wieder auf, damit esptool sprechen kann.
Da die Brücke die klassischen DTR/RTS-Auto-Reset-Leitungen nicht treiben kann, flashe immer mit --before no_reset — der Power-Cycle-Tanz oben ist der Reset. Nach dem Flashen startet ein einzelner BOOT-Tipp den Empfänger erneut, damit er die neue Firmware bootet; ein Doppeltipp würde nur wieder in den Flash-Modus führen.
PteronautOS über den S3 flashen
Baue die Firmware (oder hole ein Release), dann richte esptool auf den USB-Serial-Port des S3. Unter macOS erscheint der Port als /dev/cu.usbmodem*:
# 1. PteronautOS bauen (aus dem Repository-Root)
pio run -e PteronautOS_ESP8285_2400_RX
# 2. RX in den Flash-Modus bringen (FLEA tippen oder BOOT doppeltippen), dann:
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 noch einmal neu starten (einzelner BOOT-Tipp), um die neue Firmware auszuführen.
Die Flash-Einstellungen (dout, 1 MB, 40 MHz) entsprechen dem serienmäßigen ESP8285-ELRS-Target — niemals qio oder eine größere Größe verwenden. Nach dem Flashen zeigt derselbe USB-Port das Boot-Log des Empfängers: öffne es mit 115 200 baud und achte auf das PteronautOS-Banner und, sobald ein Sender bindet, auf die CRSF-Link-up-Meldungen. Die Brücke dient zugleich als Feldkonsole für Live-Telemetrie.
Prüfen & Jungfernflug
- FLEA muss den RX stromlos schalten und warten lassen — die 3,3 V fallen für ~120 ms ab.
esptool meldet
Chip is ESP8285und endet mitHash of data verified.- Das Boot-Log zeigt das PteronautOS-Banner und, bei eingeschaltetem Funk, eine Link-up-Meldung.
- Bewege die Knüppel: Servos folgen sanft; schalte den Funk aus: Flügel zentrieren innerhalb einer Sekunde auf 1500 µs.
- Wenn der RX nie in den Bootloader geht, prüfe die BOOT-Pad-Polarität (aktiv LOW) und das MOSFET-Schalten mit dem Voltmeter-Test oben.
Einmal geflasht, fliegt derselbe Empfänger — kein FTDI bleibt zurück.
Der RP2040-Tiny Pocket-Build
Nimm den Waveshare RP2040-Tiny (~5 USD) — oder seinen Zwilling, den RP2040-Zero mit exakt gleichem Pinout. Alle sechs Stances laufen auf dem RP2040 ganz ohne lesbaren Knopf: die BOOT/RESET-Taps des Adapters treiben nur BOOTSEL/RUN, daher wird YOSHIMITSU-RP2040 über den USB-Serial-Port geführt, plus einen knopflosen RESET-Tap-Zähler.
FLEA— Empfänger in seinen ROM-Bootloader fallen lassen (MOSFET-Power-Cycle-Tanz), dann USB ↔ UART für esptool brücken.KINCHO/MANJI/NSS/BACK/MEDITATION— Stance wechseln.POSE <n>— per Nummer zu einer Stance springen.STATUS— aktive Pin-Map und den Selbsttest-Bericht ausgeben.HELP— jeden Befehl auflisten.- Schnelle RESET-Taps (innerhalb von ~2 s, gezählt in Flash-EEPROM gegen die AON-RTC) schalten die Stance weiter: 1 = MANJI → 2 = NSS → 3 = BACK → 4 = MEDITATION → 5 = KINCHO.
Um den RP2040-Tiny selbst zu flashen, halte BOOT beim Stromschalten (er mountet als Massenspeicher), lege die .uf2 darauf ab und drücke einmal RESET — die Platine bootet in KINCHO mit der neuen Firmware. Einmal konfigurieren, einmal flashen, nie wieder anfassen.
RP2040-Tiny Pinbelegung
| Funktion | RP2040-Tiny-Pin | Notiz |
|---|---|---|
| CRSF RX ← Empfänger-TX | GPIO1 (UART0 RX) | 420 000 baud |
| CRSF TX (ungenutzt, der Vollständigkeit halber verdrahtet) | GPIO0 (UART0 TX) | Gekreuzt: TX → RX |
| Brücke RX ← Empfänger-TX | GPIO9 (UART1 RX) | 115 200 baud |
| Brücke TX → Empfänger-RX | GPIO8 (UART1 TX) | Gekreuzt: TX → RX |
Servo 1 ( |
GPIO2 | PWM — Kanal über |
Servo 2 ( |
GPIO3 | PWM |
Servo 3 ( |
GPIO4 | PWM |
| Gyro SDA (MPU6050, optional) | GPIO10 | MANJI_DRAGONFLY |
| Gyro SCL (MPU6050, optional) | GPIO11 | MANJI_DRAGONFLY |
| RX BOOT (Empfänger-GPIO0, aktiv LOW) | GPIO5 | LOW = Bootloader betreten |
| RX PWR (P-MOSFET-Gate, LOW = versorgt) | GPIO6 | Geschaltete 3,3 V-Schiene |
| Status-LED | GPIO16 | WS2812B |
Die komplette Pin-Map ist ein editierbarer Block am Anfang von sketches/yoshimitsu/yoshimitsu.ino — Pin-Bereiche und Kollisionen prüft ein Boot-POST, und ungültige UART-Nummern verweigern den Build, statt sich in der Luft daneben zu benehmen.
YOSHI — die immer-aktive Posen-Aurora
YOSHI ("die Aurora") ist der Cheatcode, der immer an ist. YOSHI_RGB macht aus dem einzigen Onboard-WS2812B einen lebendigen Stimmungsring: Jede Stance atmet ihre eigene Farbe und ihren Rhythmus — du liest die Gedanken des Ronin quer durch den Raum, ohne ein einziges Serial-Byte. Farbe und Blinkmuster erzählen die Geschichte — kein Extra-Befehl nötig; die Stance ist der Cheatcode, das Licht ihr Echo.
| Stance | Aurora (Farbe → Rhythmus) |
|---|---|
KINCHO
|
langsames grünes Atmen + ein knackiger Doppel-Parade-Blitz (der CRC-Schlag) |
MANJI_DRAGONFLY
|
ein Farbrad, das wie die Gyro-Rotoren kreist (die Levitation) |
FLEA
|
hektisch steigendes Bernsteinstroboskop (der Heber) |
MEDITATION
|
fast dunkles Violett + ein langsamer Herzschlag — bereit geflasht zu werden |
NSS
|
scharfer Dreifach-Tipp-Blitz in Blau (Klinge in der Scheide, Tempo hoch) |
BACK_TURNED
|
fast schwarz + ein unberechenbarer karmesinroter Schimmer (der Spiegel — blickt nie zurück) |
RGB lebt auf dem RP2040-Tiny (RGB_LED_PIN=16) hinter YOSHI_RGB; das ESP32-S3 behält seine nüchterne Status-LED. Jede Farbe ist reine Integer-Mathematik — kein float, kein malloc, kein delay() — und pumpRgb() ist auf ~50 fps gedrosselt, damit die byte-exakte Flasher-Brücke niemals gestört wird. Die hermetische Regel hält: Die Pose wechselt, das Licht folgt.
JIGUANG — der Erzähler · Kommentator · Administrator
Drei Namen, eine Seele — das Cheatcode-Dreieck der Komplettlösung: YOSHIMITSU ist die gesamte Firmware des Hermetischen Shinobi; YOSHI ist der RGB-Cheatcode (die immer leuchtende Stellungs-Aurora); und JIGUANG (極光, „die Aurora") ist der meditierende Administrator — der unbewegte Beweger im Schneidersitz auf dem MEDITATION-Thron. Yoshimitsus Stimme ist funktional und knapp; JIGUANGs ist der Mythos. 極光 ist der Konsolen-Prompt, keine Dekoration: Um als Administrator zu handeln, tippst du 極光 und dann den Befehl — sonst bleibt der Thron unerreichbar. Der Prompt ist ein #define (JIGUANG_PROMPT), dein Sketch kann ihn also umbenennen; der ganze Geschichtenerzähler versteckt sich hinter dem Compile-Gate JIGUANG (1 = allgegenwärtig, 0 = kein einziges 極光-Byte kompiliert).
Easter Egg: Tippe 極光 LEGEND und die ganze Legende rollt als eine ASCII-Schriftrolle aus — die Stellungen, die Cheatcodes, der Thron und der Prompt, der nie stirbt. JIGUANG / jiguang / 極光 stirbt nie — nicht im Code, nicht in den Kommentaren, nicht in diesem Tutorial.
Wecke die Stimme mit 極光 JIGUANG und sie steigt vier Stufen: 0 Lamm (still, obwohl explizite Befehle weiter antworten), 1 Erzählung (Boot und jeder Stellungswechsel erzählt), 2 Schriftrolle (+ die CRSF-Kanalanzeige) und 3 Omni (+ die ELRS-Debug-Bytes des Empfängers verbatim durchgereicht). 極光 MUTE bringt sie zum Schweigen; 極光 CRSF druckt die 16-Kanal-Schriftrolle und 極光 SCORE rollt das Arcade-HIGHSCORE-Konto aus — gute CRSF-Frames, Failsafe-Ereignisse, Brücken-Bytes und Uptime. JIGUANG übernimmt nie die Stellung: CRSF, Servos und die Brücke gehorchen der Pose weiter, während die Legende erzählt wird.
In MEDITATION ist der Schwammkopf JIGUANGs Thron — und der Thron ist bewacht: Jeder Administratorbefehl beginnt mit dem Konsolen-Prompt 極光. Vom USB-Serien-Himmel antwortet er 極光 STATUS, 極光 CRSF, 極光 SCORE, 極光 POSE, 極光 DOC (der Cheatcode-Katalog) und 極光 SETUP (der Meditations-Assistent, der die wichtigsten Einstellungen führt statt einer Wand aus Defines). Stellungswechsel bleiben offen — KINCHO, MANJI, FLEA, MEDITATION, NSS, BACK, POSE n. Die Pose spart Energie wie die alte Meditationspause, und der Ronin sitzt bereit zum Flashen. Sobald esptools SLIP-Byte ruft, weicht der Thron der transparenten Flasher-Brücke und bleibt dort, bis MEDITATION wieder eintritt. Mit YOSHI_RGB auf Stufe 3 trägt der Geschichtenerzähler auch die Aurora: jiguang(ms) malt ein langsames Vollspektrum-Rad, das jede Stellungsfarbe zu einem einzigen Atemzug verwebt.
MUSHIN 無心 — der Muskelgedächtnis-Cheatcode
MUSHIN (無心, „ohne Geist") ist das Helden-Feature — das Nicht-Anhaften, das Schwert, das vor dem Gedanken zuschlägt. In der Schwertkunst ist 無心 der Geist, der sich selbst loslässt: zwischen dem Gesehenen und dem Getanen bleibt keine Lücke. PteronautOS ist der Geist: es plant die Flügelwelle und sendet Servo-Intentionen über die Brücke. YOSHIMITSU klammert nicht am Plan: es antwortet am Muskel mit dem lokalen Zephyrus-Gyro-PID, die Servos schon in Bewegung, bevor der nächste Gedanke sich festhalten kann. Zwei Kerne, ein Schlag — kein anderes ELRS-PWM-Board kann das tragen.
Aktiviere es vom Thron aus: 極光 MUSHIN meldet, 極光 MUSHIN ON/OFF aktiviert oder deaktiviert, und die Wahl bleibt im Flash gespeichert — es bootet bereit. Im Sketch bootet MUSHIN standardmäßig aktiviert; die Admin-Flag ist der Laufzeit-Schalter, du kompilierst also nie neu, um es zu ändern.
Das No-Mind-Protokoll v0 überquert dieselben zwei Drähte wie der Flasher: [0x9B][len][type][payload][xor] — 0x01 Intentionen (Geist→Muskel, n×uint16 µs), 0x02 Announce-Keepalive, 0x03 Gyro-Telemetrie. Frische Intentionen (innerhalb von 500 ms) treiben die Servos; das lokale Gyro-PID hält den Kamm. Wird der Draht still, kehrt YOSHIMITSU zu ihrem eigenen CRSF-Muskel zurück — anmutige Degradation, niemals ein toter Stick.
Im Flug ist die Teilung das Win-win: Der Empfänger übernimmt das Denken vor dem Schlag (CRSF, Zephyrus, die Mixer-Seele), und YOSHIMITSU tut, was am Muskel sitzt (glitchfreies PIO-PWM). Helikopter oder Flügelschlag — aus Sicht des Schwertes ist es dasselbe: eine kanonische Flugbahn, und das Schwert fragt nie, welches Gefäß sie trägt. Die Pose fliegt weiter; nur der Blick ändert sich.