DEEP 53 · 第六辑 · 舵机与执行器 · LEARN NOTES

收进学习手册 · 2026-09-11 · duck.whatled.com

解读 53 · 舵机协议:Dynamixel 与 Feetech 寄存器

解读对象:microduck-replica/docs/硬件规格速查.md + microduck-replica/docs/硬件方案逆向.md §「飞特 STS/SCS 协议对照」,交叉引用 duck-control/src/bus.rs
需要的前置:第一辑解读 01(duck-control bus.rs 逐文件)· 解读 59

换舵机最吓人的说法是"协议全变了"。把两张协议表并排放,会发现物理层完全同构,真正变的是包格式和出厂默认值。

物理层:一模一样

Dynamixel XL330 和飞特 STS/SCS/HL 都是单线半双工 TTL、3 线(GND-VCC-DATA)、1 Mbps。官方运行时 bus.rs 里搜不到任何方向控制 GPIO——方向切换由 HAT 上的硬件自动方向电路完成;飞特路线换成转接板即可,通信层不用重写(Open Duck Mini 用的 rustypot.feetech 与 XL330 的 rustypot 是同一个库的不同协议模块,波特率同为 1 Mbps)。

包格式:三处不同

Dynamixel V2(XL330) 飞特 STS/SCS
包头 FF FF FD 00 FF FF
校验 CRC-16 ~sum(取反和)
批量读 sync read(官方实际用的) sync read 0x82

一个关键更正(硬件方案逆向 §专节):Protocol V2 有更快的 fast sync read(0x8A,应答拼成一个包),但 Microduck 没有用——全库检索零命中,bus.rs 调的是普通 sync_read_raw_data。所以两边的应答机制相同:一条指令包出去,每个设备各回一个独立状态包。

出厂默认值:反直觉的一局

duck-control/src/model.rs:84-86 原文:XL330 出厂 return_delay_time = 250,即 500 µs 转向延迟/设备,16 台设备一 tick 白吃 8 ms——40% 的 20 ms 预算。官方必须写 0 消掉。而飞特 STS 内存表第 7 号 Return Delay 默认就是 0(备注 "Not functional on STS")——飞特天然没有这笔开销。飞特侧该调的是第 8 号 Response Level:默认 1(所有命令都应答),改成 0 后只有 read/ping 回包。出厂默认值是给通用场景的,高频控制回路必须自己调。

代码侧长什么样

bus.rs 把协议细节收敛成三个常量:主循环 READ_ADDR = 124、READ_LEN = 12(15 舵机 + IMU 板 ID 200 在同一次 sync_read 里读回);慢速遥测 SLOW_READ_ADDR = 144、SLOW_READ_LEN = 3(电压+温度,寄存器 144–146)。设备列表 ids = [IMU_DXL_ID, JOINT_IDS…] 即 [200, 20..24, 30..34, 10..14]。换飞特时,改的只是这一层控制器,上层 RobotIo 接口不动(训练参数调整指南 §11.3)。

寄存器编号两边各有各的表:Dynamixel 波特率在 EEPROM baud_rate = 3(=1 Mbps)、ID 在寄存器 3;飞特 ID 范围 0–253(寄存器 5)、波特率寄存器 6(0 = 1M)。HD-1910 出厂即 1 Mbps、ID 1,信号电平高 2–5 V / 低 0–0.45 V(规格书 7-3/7-4,经硬件方案逆向转述)。

你带走的收获

延伸

什么鸭 WHATDUCK · 复刻学习笔记 ← 全部手册 · 首页