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.ino компилируется для Waveshare RP2040-Tiny (самый лёгкий, без встроенной кнопки) и любого ESP32-S3 с нативным USB, на стандартных ядрах 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 — чисто прозрачный мост (без разбора строк), поэтому бинарный SLIP-трафик esptool проходит нетронутым. Полный исходник: 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 — стойка-преобразователь — читает CRSF на 420 000 бод на UART, ведёт сервы окном 988–2012 мкс, отображённым из диапазона каналов 172–1811, и центрирует их при фейлсейфе 500 мс. Парирование — это проверка CRC: повреждённый кадр отбрасывается, прежде чем когда-либо достигнет сервы. Преобразователь агностичен к каналу — сервы это SERVO_PIN_1..8, а таблица CHANNEL_TO_SERVO решает, какой канал CRSF питает каждую; смысл канала принадлежит микшеру/ядру, никогда — плате.

Для гиро-стабилизированного орнитоптера используй MANJI_DRAGONFLY — тот же преобразователь плюс связь Zephyrus: опциональный MPU6050 на GYRO_SDA/GYRO_SCL подаёт коррекцию скорости рыскания в серву гребня. Без подключённого гироскопа 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 мм, одновременно переключая питание приёмника — неудобно, и при каждом обновлении прошивки снова паять или цеплять зажимы.

Решение: пусть ESP32-S3 будет прошивальщиком. Один GPIO держит площадку BOOT приёмника в нуле; маленький P-MOSFET переключает шину 3,3 В приёмника под управлением ПО; порт 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 кОм (подтяжка затвора) <0,10 USD
Провода Dupont / хвостик + термоусадка ~1 USD
Приёмник ELRS, площадки однажды с хвостиком EP2 / EP1 / EPW6 (SX1280 + ESP8285) от ~12 USD

Мост работает с любым ELRS-приёмником ESP8285/SX1280, который выводит TX, RX, 3V3, GND и площадку BOOT, — подавляющее большинство *конкретных плат* в таблице оборудования . Он, конечно, прошивает и сам S3: кнопка BOOT + USB — всё, что там нужно.

Разводка для прошивки

Собирай стенд при обесточенном S3. MOSFET переключает шину 3,3 В приёмника: исток → S3 3V3, сток → EP2 3V3, затвор → S3 GPIO10 с подтяжкой 10 кОм к 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 бод). Чтобы войти в режим прошивки, дважды коснись кнопки BOOT на S3 (или набери FLEA по USB-сериалу). Затем скетч:

  1. прижимает GPIO9 к нулю (площадка BOOT активна),
  2. выключает MOSFET на 120 мс (приёмник обесточен),
  3. включает обратно и ждёт 900 мс (приёмник стартует внутри своего загрузчика),
  4. отпускает GPIO9 — RX теперь сидит в ROM-загрузчике, ожидая esptool,
  5. возобновляет сквозной USB↔UART, чтобы esptool мог говорить с ним.

Поскольку мост не может управлять классическими линиями авто-ресета DTR/RTS, всегда прошивай с --before no_reset — танец цикла питания выше и есть ресет. После прошивки одиночный тап BOOT снова переключает питание приёмника, чтобы он загрузил новую прошивку; двойной тап лишь снова войдёт в режим прошивки.

Прошивка PteronautOS через S3

Собери прошивку (или скачай релиз), затем запусти esptool против USB-последовательного порта S3. В 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 МБ, 40 МГц) соответствуют заводской цели ELRS ESP8285 — никогда не используй qio или больший размер. После прошивки тот же USB-порт показывает журнал загрузки приёмника: открой его на 115 200 бод и ищи баннер 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 бод
CRSF TX (не используется, разведён для полноты) GPIO0 (UART0 TX) Перекрёстно: TX → RX
Мост RX ← TX приёмника GPIO9 (UART1 RX) 115 200 бод
Мост 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 В
Статусный LED GPIO16 WS2812B

Полная карта выводов — редактируемый блок вверху sketches/yoshimitsu/yoshimitsu.ino: диапазоны и коллизии выводов проверяет POST при загрузке, а недопустимые номера UART отказываются собираться, вместо того чтобы безобразничать в воздухе.

YOSHI — всегда включённая аура поз

YOSHI («аврора») — это читкод, который всегда включён. YOSHI_RGB превращает единственный бортовой WS2812B в живое кольцо настроения: каждая стойка дышит своим цветом и ритмом, и ты читаешь мысли ронина через всю комнату без единого серийного байта. Цвет и узор мигания рассказывают историю — лишняя команда не нужна; стойка и есть читкод, свет — её эхо.

Стойка Аврора (цвет → ритм)
KINCHO медленное зелёное дыхание + резкая вспышка двойной парировки (удар CRC)
MANJI_DRAGONFLY цветовое колесо, крутящееся как роторы гироскопа (левитация)
FLEA неистовый нарастающий янтарный строб (подъём)
MEDITATION почти тёмный фиолетовый + один медленный удар сердца — готова быть прошитой
NSS резкая вспышка тройного тапа в синем (клинок в ножнах, темп вверх)
BACK_TURNED почти чёрный + один непредсказуемый багровый блик (зеркало — никогда не оглядывается)

RGB живёт на RP2040-Tiny (RGB_LED_PIN=16) за YOSHI_RGB; у 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 приёмника, переданные verbatim). 極光 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. Поза экономит энергию, как старая пауза медитации, и ронин сидит готовым к прошивке. В миг, когда позовёт SLIP-байт esptool, трон уступает прозрачному мосту прошивальщика и остаётся там, пока MEDITATION не вернётся. С YOSHI_RGB на уровне 3 рассказчик ещё и носит сияние: jiguang(ms) рисует медленное колесо полного спектра, сплетающее каждый цвет стойки в одно дыхание.

MUSHIN 無心 — чит-код мышечной памяти

MUSHIN (無心, «без мыслей») — геройская фича: непривязанность, меч, бьющий раньше мысли. В искусстве меча 無心 — это разум, отпускающий сам себя: между увиденным и сделанным не остаётся зазора. PteronautOS — это дух: он планирует волну крыла и шлёт серво-намерения через мост. YOSHIMITSU не цепляется за план — он отвечает у самой мышцы локальным гиро-PID Zephyrus, и сервы уже движутся, прежде чем следующая мысль успеет ухватиться. Два ядра, один удар — ни одна другая ELRS-PWM-плата не может это носить.

Взведи его с трона: 極光 MUSHIN докладывает, 極光 MUSHIN ON/OFF включает или выключает, и выбор сохраняется во флеш — он загружается готовым. В скетче MUSHIN по умолчанию загружается включённым; флаг администратора — переключатель рантайма, так что ты никогда не перекомпилируешь ради его смены.

Протокол v0 без-мыслия пересекает те же два провода, что и прошивальщик: [0x9B][len][type][payload][xor]0x01 намерения (дух→мышца, n×uint16 мкс), 0x02 keepalive-анонс, 0x03 телеметрия гироскопа. Свежие намерения (в пределах 500 мс) ведут сервы; локальный гиро-PID держит гребень. Если провод замолчит, YOSHIMITSU вернётся к собственной CRSF-мышце — изящная деградация, никогда не мёртвый стик.

В полёте разделение — это win-win: приёмник думает до удара (CRSF, Zephyrus, душа микшера), а YOSHIMITSU делает то, что живёт у мышцы (PIO-PWM без глитчей). Вертолёт или машущий полёт — с точки зрения меча это одно и то же: каноническая траектория, и меч никогда не спрашивает, какой сосуд она несёт. Поза продолжает лететь; меняется только взгляд.