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-консоль — канонический переключатель на обеих платах — KINCHO → MANJI → FLEA → MEDITATION → NSS → BACK → POSE <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 библиотеки — или подложи новый релиз — и твой скетч остаётся нетронутым. Обновление прошивки — это никогда не перепайка и никогда не перенастройка.
src/Yoshimitsu.h— всё ядро: стойки, CRSF, MUSHIN, JIGUANG, мост прошивальщика.src/Yoshimitsu_Loadout.h— стартовый лоадаут: каждый дефолт (пины, тайминги, уровни гейтов) как значения*_DEFAULT.library.properties— манифест библиотеки Arduino (версия, архитектуры).examples/Yoshimitsu_Default/— расслабленный скетч; переопредели что угодно, объявив это до include.
KINCHO — Конвертер CRSF→PWM
KINCHO — стойка-преобразователь — читает CRSF на 420 000 бод на UART, ведёт сервы окном 988–2012 мкс, отображённым из диапазона каналов 172–1811, и центрирует их при фейлсейфе 500 мс. Парирование — это проверка CRC: повреждённый кадр отбрасывается, прежде чем когда-либо достигнет сервы. Преобразователь агностичен к каналу — сервы это SERVO_PIN_1..8, а таблица CHANNEL_TO_SERVO решает, какой канал CRSF питает каждую; смысл канала принадлежит микшеру/ядру, никогда — плате.
- ESP32-S3: RX TX → GPIO44, RX RX → GPIO43, общий GND, общая шина 5 В.
- RP2040-Tiny: RX TX → GPIO1 (UART0), общий GND.
Сервы:
SERVO_PIN_1..3(ещё три на S3) — переопределяются в блоке PIN MAP.
Для гиро-стабилизированного орнитоптера используй 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-сериалу). Затем скетч:
- прижимает GPIO9 к нулю (площадка BOOT активна),
- выключает MOSFET на 120 мс (приёмник обесточен),
- включает обратно и ждёт 900 мс (приёмник стартует внутри своего загрузчика),
- отпускает GPIO9 — RX теперь сидит в ROM-загрузчике, ожидая esptool,
- возобновляет сквозной 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. Мост заодно служит полевой консолью живой телеметрии.
Проверка и первый полёт
- FLEA должен переключить питание RX и оставить его в ожидании — 3,3 В проседают на ~120 мс.
esptool сообщает
Chip is ESP8285и завершает строкойHash of data verified.- Журнал загрузки показывает баннер PteronautOS и, при включённом радио, сообщение установления связи.
- Пошевели стики: сервы следуют плавно; выключи радио: крылья центрируются на 1500 мкс за секунду.
- Если RX никак не входит в загрузчик, проверь полярность площадки BOOT (активный низкий) и переключение MOSFET вольтметровым тестом выше.
После прошивки тот же приёмник летает — никакого FTDI позади.
Карманная сборка RP2040-Tiny
Предпочти Waveshare RP2040-Tiny (~5 USD) — или его близнеца, RP2040-Zero, с точно той же распиновкой. Все шесть стоек работают на RP2040 вообще без читаемой кнопки: тапы BOOT/RESET адаптера лишь управляют BOOTSEL/RUN, поэтому YOSHIMITSU-RP2040 ведётся через USB-последовательный порт плюс бескнопочный счётчик тапов RESET.
FLEA— уронить приёмник в его ROM-загрузчик (танец цикла питания MOSFET), затем мост USB ↔ UART для esptool.KINCHO/MANJI/NSS/BACK/MEDITATION— сменить стойку.POSE <n>— перейти к стойке по номеру.STATUS— вывести активную карту выводов и отчёт самотеста.HELP— перечислить все команды.- Быстрые тапы RESET (в пределах ~2 с, считаются во флеш-EEPROM против AON RTC) продвигают стойку: 1 = MANJI → 2 = NSS → 3 = BACK → 4 = MEDITATION → 5 = KINCHO.
Чтобы прошить сам 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 ( |
GPIO2 | PWM — канал через |
Серва 2 ( |
GPIO3 | PWM |
Серва 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 без глитчей). Вертолёт или машущий полёт — с точки зрения меча это одно и то же: каноническая траектория, и меч никогда не спрашивает, какой сосуд она несёт. Поза продолжает лететь; меняется только взгляд.