解读 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,经硬件方案逆向转述)。
你带走的收获
- 换协议 ≠ 换物理层:TTL 半双工 1 Mbps 通用,变的只是包头/校验/指令码,适配层即可解决。
- 官方没用 fast sync read——"协议有更快的模式"和"这个项目用了它"是两回事,要以代码检索为准。
- Return Delay 是隐藏带宽杀手:16 台 × 500 µs = 8 ms,新舵机上电先查这类默认值。
- 好的通信设计把协议藏在常量后面:
READ_ADDR/READ_LEN一改,上层全不动。 - ID 空间、寄存器地址、默认波特率,换系列(SMS 走 RS485、SHC 走 CANopen)前必须重查手册。