DEEP 63 · 第七辑 · 换装 HL-2915 全流程 · LEARN NOTES

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

解读 63 · hl2915_bench.py:单舵机台架六课逐课解读

解读对象:microduck-replica/rl-series/scripts/hl2915_bench.py(744 行,唯一依赖 pyserial)
需要的前置:解读 60(同风格的 testbench)· 解读 53(飞特帧格式)

744 行、一个文件、六节课——这是"控制工程师第一天怎么摸一颗新舵机"的通用方法论。协议层只有三个函数:packet()(FF FF + ID/LEN/指令 + 取反和)、parse()(容忍串口里残留的 0xFF 填充,校验不过就滑动)、Bus.transact()(发一收一,0.1s 超时并计数)。

1. 课 1–2:确认"它在,且读数可信"

lesson1() 体检:先 PING(指令 0x01),失败就打印排障三要素——线序(1=GND 2=Vcc 3=Signal)、电压(要 9-14V)、波特率(默认 1Mbps);通了再 bus.read(sid, 0, 17) 读出厂快照 17 字节:固件版本(0 号)、ID(5)、波特率档位(6,0=1M)、返回延时(7)、应答级别(8)、行程限制(9/11)、温度上限(13)、电压窗(14/15)。若 14 号 <140 直接警告:12V 供电会立刻过压保护。telemetry() 是全脚本的公共件:读 56 号起 14 字节,一次拿回 pos/speed/load/volt(0.1V)/temp/status/moving/current(×6.5mA)。lesson2() 遥测流:每 0.02s 一读(50Hz),统计丢包率、电压最低、温度最高;有丢包先查共地与线长,再降波特率对照。

2. 课 3–4:从"会动"到"敢开机"

lesson3() 闭环小步幅:±100 步(≈±8.8°),41 号加速度写 10、48 号扭矩限制写 500(50% 堵转),速度 300 步/s。move_to() 与协议手册例 4 同构:42 号起连写 位置(2B)+时间(2B)+速度(2B) 六字节。每步读回实际位置,误差判据 DEAD_ZONE_STEPS + 2(26/27 号不灵敏区出厂 1 步,DEAD_ZONE_STEPS = 3 再留余量)。注释点破意图:"绝对编码器不该有'无人知晓'"。

lesson4() 拷机:50Hz 连发(--minutes 10 默认十分钟),每 5s 在 ±200 步间摆动;温度 ≥70°C 立即停;PASS 判据写死为丢包率 <0.001 且温度 <65°C。main() 里 sys.exit(lesson4(...)) 把结论变成进程退出码——验收可以进脚本、进 CI。

3. 课 5–6:从一只到一队,从动作到数据

lesson5 --ids 1,2 双舵机:一条 sync_read(0x82 广播 0xFE)同时收两只 14 字节遥测(各舵机按 ID 顺序逐个回独立应答包),一条 sync_write(0x83,广播不应答)让两只反向摆动 ±100 步、速度 300 步/s。注释:"真机 50Hz 控制环就是这两个指令的形状(15 只舵机一次收发),先用 2 只把它跑通"——对照 duck-control/src/bus.rs 的 READ_ADDR = 124,形状一致。误差判据写的是 DEAD_ZONE_STEPS + 4;教程 §2 的验收口径更严:"读数误差 ≤4 步"。

lesson6 阶跃录制:--kp/--kd 写 21/22 号(P/D 增益,EPROM,先 unlock() 写 55=0;EPROM 有擦写寿命,测完自动还原,--keep 才保留);阶跃默认 --steps 200(≈17.6°),速度写 0(全速,越陡越接近真阶跃),41 号加速度默认 50(×100 步/s²)。record_phase() 50Hz 逐行落 CSV——丢包也记时间格(数值留空),"拟合时看得到空洞在哪,而不是曲线被悄悄拉直";step_metrics() 算超调/稳态误差/整定时间/峰速/峰值电流;unique_path() 保证扫 kp 时出一串文件一个不少。up/back 两向稳态误差之差 ≈ 回差佐证。这批 (P, D, 超调, 稳态误差, 整定) 记录,就是阶段 F 填 microduck_constants.py 的原料。

你带走的收获

延伸

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