解读 65 · 设 ID、改波特率、校零位:一次只接一只
解读对象:
microduck-replica/rl-series/scripts/hl2915_bench.py(744 行)cmd_set_id/cmd_set_baud/cmd_cal三组命令
需要的前置:解读 59(整机 15 个 ID 怎么排)· 解读 63(六课之后做什么)
散件期的三件事:给每只舵机一个身份、一个通信速度、一个零位。脚本用三组命令覆盖,三组命令里藏着同一条纪律——一次只接一只。
1. set-id:为什么必须一次只接一只
原因写在出厂值里:所有 HL-2915 出厂都是 ID 1(docs/新手学习文档.md §12.1)。两只同接在总线上,set-id --new-id 2 的写指令两只都收到——双双改名,总线上出现两个 2,从此 PING 谁都是撞车。cmd_set_id 的流程是标准三步:unlock()(写 55=0 解锁 EPROM)→ 写 5 号寄存器 → 用新 ID 发 PING 验证:"✔ 新 ID 有应答 / ✗ 新 ID 无应答,回旧 ID 重试"。范围 0–253(254 是广播,不可用)。命令打印的提示就是解读 59的伏笔:"装上整机前,把每只舵机按 model.rs 的关节 ID 表设好并贴标签"。
2. set-baud:写的是档位,验的是重连
BAUD_INDEX = {1000000: 0, 500000: 1, 250000: 2, 128000: 3, 115200: 4, 76800: 5, 57600: 6, 38400: 7}——寄存器 6 号存的是档位号,不是波特率数值,--new-baud 只接受这八档。写完命令只说了一半:"已写入档位 N。用 --baud <新值> 重连验证。"改通信参数的最后一步永远是用新参数再通一次——"写成功"和"能通信"是两回事。台架排障里还有对照用法:拷机丢包时,"把波特率降到 500k/115200 对照(set-baud)"。
3. cal:两种标零的安全差别
cal 不带参数只读:打印当前位置和 31 号"位置校正"(±2047 步,BIT11=方向)。真正标零有两个选项,安全级别完全不同:
cal --set-zero-here(推荐):算新校正 = 旧校正 + (2048 − 当前位置),写 31 号。纯软件偏移——舵机不动、随时可逆。docstring 的"把当前物理位置标定为中位 2048"指它。cal --rezero-2048(危险):写 40=128,固件把当前位置校正为 2048——docstring 里三个字加叹号:"会动!"扭矩会输出一次动作,且改的是固件侧基准。这类写入改变固件侧基准,只应在舵机空载、未装配或已知安全位姿下做。
另有 --volt-max 14.0:写 14 号 = 140,12V 供电前放开过压保护。命令自己总结的时序也值得抄:"40 写 128 和 31 号校正都会改变零位,装配后再标,标完记录进构建日志。"还有一条容易忘:多圈圈数疑似掉电不保存(待实测)——上电前机器人要摆在已知姿态。
你带走的收获
- "一次只接一只"不是谨慎,是协议事实:出厂同 ID 的设备同总线,写指令无法定向。
- 写完必须验证:set-id 用新 ID 发 PING,set-baud 用新波特率重连——"写成功"≠"能通信"。
- 标零分两级:软件偏移(31 号,可逆)优先;固件重基准(40=128)是会动的危险操作。
- 会动的命令要有位姿前置条件:空载、未装、已知安全位姿。
- ID 与零位是装配期资产:贴标签 + 构建日志;散件期不做,整机期两倍返工。