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(最轻,无板载按钮)任何原生 USB 的 ESP32-S3,使用标准 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 通路是一条纯透明桥(不解析行),因此 esptool 的二进制 SLIP 流量原样穿过。完整源码: 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——转换器架势——以 420 000 baud 在 UART 上读取 CRSF,以 172–1811 通道范围映射出的 988–2012 µs 窗口驱动舵机,并以 500 ms 失控保护居中。格挡即 CRC 校验:损坏的帧在碰到舵机之前即被丢弃。转换器与通道无关——舵机是 SERVO_PIN_1..8CHANNEL_TO_SERVO 表决定哪个 CRSF 通道供给哪只;通道的含义属于混控器/内核,从不属于板子。

对于陀螺稳定的扑翼机,使用 MANJI_DRAGONFLY——同样的转换器加上 Zephyrus 链接:GYRO_SDA/GYRO_SCL 上的可选 MPU6050 将偏航速率修正送入冠羽舵机。未接陀螺仪时,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 mm 焊盘上——别扭,而且每次固件更新都要重新焊接或重新夹线。

方案:让 ESP32-S3 成为刷写器。一个 GPIO 将接收机的 BOOT 焊盘拉低;一个小型 P-MOSFET 在软件控制下切换接收机的 3.3 V 电源轨;USB 口变成串口。按下 S3 上的一个按钮,它便执行那套精确的通断电之舞,把 ESP8285 送入其 ROM 引导加载程序——然后 esptool 直接穿过桥接写入。无需 FTDI,无需探针,无需反复焊接:把接收机焊盘一次焊到一条短线尾上,永远复用。

零件清单:

零件 典型型号 成本
ESP32-S3 微型板(原生 USB) Waveshare ESP32-S3-Tiny / -Micro / -Nano 约 6 美元
P 沟道逻辑电平 MOSFET AO3401(SOT-23),小型转接板 约 1 美元
电阻 10 kΩ(栅极上拉) <0.10 美元
杜邦线 / 线尾 + 热缩管 约 1 美元
ELRS 接收机,焊盘一次焊上线尾 EP2 / EP1 / EPW6(SX1280 + ESP8285) 约 12 美元起

桥接适用于任何引出 TX、RX、3V3、GND 与 BOOT 焊盘的 ESP8285/SX1280 ELRS 接收机—— 硬件表 中*具体板子*的绝大多数。它当然也能刷写 S3 自己:BOOT 按钮 + USB 就是那里所需的全部。

烧录夹具接线

在 S3 断电时接好治具。MOSFET 切换接收机的 3.3 V 电源轨:源极 → S3 3V3,漏极 → EP2 3V3,栅极 → S3 GPIO10,经 10 kΩ 上拉到 3V3(栅极高 = MOSFET 关断)。GPIO9 驱动 BOOT 焊盘。

EP2 / RX 焊盘 ESP32-S3 引脚 功能
BOOT (RX GPIO0) GPIO9 Boot 保持线(低 = 进入引导加载程序)
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 baud)。要进入刷写模式,双击 S3 的 BOOT 按钮(或通过 USB 串口输入 FLEA)。随后草图会:

  1. 拉低 GPIO9(BOOT 焊盘生效),
  2. 关断 MOSFET 120 ms(接收机断电),
  3. 重新打开并等待 900 ms(接收机在其引导加载程序内上电),
  4. 释放 GPIO9——RX 此时坐在 ROM 引导加载程序中,等待 esptool,
  5. 恢复 USB↔UART 直通,让 esptool 能与之对话。

由于桥接无法驱动经典的 DTR/RTS 自动复位线,刷写时务必使用 --before no_reset——上面的通断电之舞就是复位。刷写后,单击 BOOT 再次给接收机通断电,使其启动新固件;双击只会重新进入刷写模式。

通过 S3 烧录 PteronautOS

构建固件(或取得发行版),然后对 S3 的 USB 串口运行 esptool。在 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 MB、40 MHz)与出厂 ESP8285 ELRS 目标一致——绝不要用 qio 或更大的容量。刷写后,同一个 USB 口显示接收机的启动日志:以 115 200 baud 打开,留意 PteronautOS 横幅,以及发射机绑定后的 CRSF 链路消息。桥接还兼任实时遥测的现场控制台。

验证与首飞

一旦刷写完成,同一个接收机就能起飞——不留 FTDI。

RP2040-Tiny 袖珍版构建

优先选 Waveshare RP2040-Tiny(约 5 美元)——或其孪生板 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 baud
CRSF TX(未用,为完整而接线) GPIO0 (UART0 TX) 交叉:TX → RX
桥接 RX ← 接收机 TX GPIO9 (UART1 RX) 115 200 baud
桥接 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 V 电源轨
状态 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 全知(+ 接收机的 ELRS 调试字节原样透传)。極光 MUTE 让它沉默;極光 CRSF 打印 16 通道卷轴,極光 SCORE 展开街机 HIGHSCORE 账本 — 良好的 CRSF 帧、失控保护事件、桥接字节与运行时长。JIGUANG 从不夺取架势: 传说被讲述时,CRSF、舵机和桥接依然服从姿态。

在 MEDITATION 中,海绵头是 JIGUANG 的王座 — 而王座有守卫: 每条管理员命令都以控制台提示符 極光 开头。从 USB 串口的天国,它应答 極光 STATUS極光 CRSF極光 SCORE極光 POSE極光 DOC(作弊码目录)和 極光 SETUP(冥想向导,引导关键设置而不是一堵 define 之墙)。架势切换保持开放 — KINCHOMANJIFLEAMEDITATIONNSSBACKPOSE n。姿态像古老的冥想停顿一样节省能量,浪人坐等被刷写。esptool 的 SLIP 字节一呼唤,王座立刻让位给透明刷写桥,直到 MEDITATION 再次进入。当 YOSHI_RGB 处于 3 级时,说书人还会披上极光: jiguang(ms) 画出一轮缓慢的全光谱色环,把每种架势的颜色织进同一口气。

MUSHIN 無心 — 肌肉记忆作弊码

MUSHIN(無心,“无心”)是英雄功能 — 无执,先于思想出手的剑。在剑道中,无心是放下自身的心: 所见与所行之间不留间隙。PteronautOS 是 — 它规划翼波,并通过桥发送舵机意图。YOSHIMITSU 不执着于计划: 它用本地的 Zephyrus 陀螺仪 PID 在肌肉处回应,舵机在下一次思绪抓住之前就已移动。双核,一击 — 没有其他 ELRS-PWM 板能穿得上它。

从王座武装它: 極光 MUSHIN 报告状态,極光 MUSHIN ON/OFF 武装或解除,选择持久保存在 flash 中 — 开机即就绪。在草图中,MUSHIN 默认开机武装;管理员标志是运行时开关,所以你永远不用为了改它而重新编译。

无心协议 v0 与刷写器共用同样的两根线: [0x9B][len][type][payload][xor]0x01 意图(灵→肌肉,n×uint16 µs)、0x02 通告保活、0x03 陀螺仪遥测。新鲜的意图(500 ms 内)驱动舵机;本地陀螺仪 PID 稳住冠羽。若线路沉默,YOSHIMITSU 回到自己的 CRSF 肌肉 — 优雅降级,永不成为死杆。

飞行中,分工是双赢: 接收机在出手之前思考(CRSF、Zephyrus、混控之魂),而 YOSHIMITSU 做的是肌肉处的工作(无毛刺的 PIO PWM)。直升机还是扑翼 — 从剑的视角看都一样: 一条规范轨迹,而剑从不问自己承载的是哪艘船。姿态继续飞行;改变的只是样貌。