PWM 舵机协议、命令与标定
本页覆盖 PWM 固件的串口协议、命令、校准和参数精调。接线见 PWM 接线,烧录见 PWM 快速上手,桌面/网页控制见 PWM 桌面上位机 / PWM 网页控制。
以下命令在仓库的
AmazingHand-PWM/目录下执行。固件源码:firmware/AmazingHand_Serial/。
1. 命令与手势一览
前 11 行为手势命令,其余为直驱、选边、重复、停止和链路测试命令。
| 手势/命令 | 命令 | 说明 |
|---|---|---|
| 石头 | 0x01 | 猜拳:全指握拳 |
| 剪刀 | 0x02 | 猜拳:食指+中指伸出呈 V 字 |
| 布 | 0x03 | 猜拳:全指张开 |
| 真棒 | 0x04 | 拇指竖起,其余握拳 |
| 嘲讽1 | 0x05 | 摇食指("不不不") |
| 嘲讽2 | 0x06 | 无名指伸展晃动(替代小拇指) |
| 张开 | 0x07 | 全指张开 |
| 握拳 | 0x08 | 全指闭合 |
| OK | 0x09 | OK 手势 |
| 捏合 | 0x0A | 捏合手势 |
| 指向 | 0x0C | 食指伸出做"指"动作 |
| 直驱 | 0xF0 | 直接控制 8 路舵机角度 |
| 设左右手 | 0xF1 | 切换左手/右手模式 |
| 重复 | 0xFE | 重复执行上一次手势 |
| 停止 | 0xFF | 立即终止当前手势 |
| NOP | 0x00 | 链路测试 |
注:命令 0x0B 已停用(原"拇指朝下"与"真棒"动作重复,已移除)。
2. 固件校准(可选,首次使用建议)
舵机中心位和脉宽需按实际机构校准,可直接在固件源码中修改:
- 编辑
components/hand_servo/hand_servo.c顶部的middle_pos[8]和min_pw/mid_pw/max_pw[8]。
校准后需重新编译烧录。
3. 串口通讯协议
3.1 物理层
| 参数 | 值 |
|---|---|
| 接口 | USB Serial (UART0) |
| 波特率 | 115200 |
| 数据位 | 8 |
| 校验位 | 无 (None) |
| 停止位 | 1 |
| 流控 | 无 |
3.2 帧格式
主机 → ESP32(命令帧)
┌────────┬────────┬──────────┬────────────────┬──────────┐
│ 0xAA │ CMD_ID │ DATA_LEN │ DATA[0 .. N-1] │ CHECKSUM │
│ 1 Byte │ 1 Byte │ 1 Byte │ N Bytes │ 1 Byte │
└────────┴────────┴──────────┴────────────────┴──────────┘
帧头 命令ID 数据长度 数据负载 校验和- 帧头: 固定
0xAA,标识一帧的开始 - CMD_ID: 命令编号(见 命令参考)
- DATA_LEN: 数据负载的字节数(0-8,超过 8 的帧无效)
- DATA: 数据负载,长度由 DATA_LEN 决定
- CHECKSUM:
CMD_ID ^ DATA_LEN ^ DATA[0] ^ ... ^ DATA[N-1](XOR 校验)
如果 DATA_LEN = 0,则 CHECKSUM = CMD_ID。
ESP32 → 主机(响应帧)
┌────────┬────────┬────────┬──────────┐
│ 0xBB │ CMD_ID │ STATUS │ CHECKSUM │
│ 1 Byte │ 1 Byte │ 1 Byte │ 1 Byte │
└────────┴────────┴────────┴──────────┘
帧头 命令ID 状态码 校验和- 帧头: 固定
0xBB - CMD_ID: 原始命令编号
- STATUS: 状态码(见下表)
- CHECKSUM:
CMD_ID ^ STATUS
状态码
| STATUS | 含义 | 说明 |
|---|---|---|
| 0x00 | OK | 命令已接受,开始执行 |
| 0x01 | 无效命令 | CMD_ID 不在命令表中 |
| 0x02 | 参数错误 | 数据长度或内容不正确 |
| 0x03 | 忙 | 手势执行中,暂不接受新命令 |
| 0x10 | 完成 | 手势执行完毕 |
3.3 通信时序
主机 ESP32
│ │
│──── [AA 01 00 01] ────────→│ 发送"石头"命令
│ │
│←─── [BB 01 00 01] ─────────│ ACK: 命令已接受
│ │
│ (执行手势中)
│ │
│←─── [BB 01 10 11] ─────────│ 完成: 手势执行完毕
│ │
│──── [AA 02 00 02] ────────→│ 发送"剪刀"命令
│ │
│←─── [BB 02 00 02] ─────────│ ACK
│ │3.4 停止手势 & 帧超时
- 发送
[AA FF 00 FF]可随时中断正在执行的手势 - ESP32 在 200ms 内未收完一帧会自动丢弃(防止丢字节导致永久失步)
- 校验和不匹配的帧会被静默丢弃,上位机应实现超时重发
3.5 左右手模式
默认右手模式。发送 [AA F1 01 02 F2] 切换左手,[AA F1 01 01 F1] 切回右手。左右手影响拇指的运动方向(石头/剪刀/真棒/OK/捏合等含拇指手势)。
4. 命令参考
4.1 手势命令(0x01–0x0A、0x0C)
这些命令无需数据负载 (DATA_LEN=0),ESP32 收到后立即执行对应手势。
| 命令 | HEX 帧 | 响应 | 说明 |
|---|---|---|---|
| 石头 | AA 01 00 01 | BB 01 00 01 → BB 01 10 11 | 全指握拳 |
| 剪刀 | AA 02 00 02 | BB 02 00 02 → BB 02 10 12 | 食指+中指伸出 |
| 布 | AA 03 00 03 | BB 03 00 03 → BB 03 10 13 | 全指张开 |
| 真棒 | AA 04 00 04 | BB 04 00 04 → BB 04 10 14 | 拇指竖起 |
| 嘲讽1 | AA 05 00 05 | BB 05 00 05 → BB 05 10 15 | 摇食指(约 2.5s) |
| 嘲讽2 | AA 06 00 06 | BB 06 00 06 → BB 06 10 16 | 无名指晃动(约 2.5s) |
| 张开 | AA 07 00 07 | BB 07 00 07 → BB 07 10 17 | 全指张开 |
| 握拳 | AA 08 00 08 | BB 08 00 08 → BB 08 10 18 | 全指闭合 |
| OK | AA 09 00 09 | BB 09 00 09 → BB 09 10 19 | OK 手势 |
| 捏合 | AA 0A 00 0A | BB 0A 00 0A → BB 0A 10 1A | 捏合手势 |
| 指向 | AA 0C 00 0C | BB 0C 00 0C → BB 0C 10 1C | 食指伸出做"指"动作 |
4.2 直驱命令 (0xF0)
直接控制 8 路舵机角度,8 字节数据分别对应舵机 1-8,每字节取值范围 0-180。
示例:全部舵机归中位(90°)
发送: AA F0 08 5A 5A 5A 5A 5A 5A 5A 5A F8
│ │ │ └── 8 个 0x5A (90°) ──┘ │
│ │ │ └── CHECKSUM
│ │ └── DATA_LEN = 8
│ └── CMD_DIRECT_DRIVE
└── 帧头校验和 = F0 ^ 08 ^ 5A ^ 5A ^ 5A ^ 5A ^ 5A ^ 5A ^ 5A ^ 5A = F8
8 个相同的 0x5A 两两 XOR 得 0x00,最终
0xF0 ^ 0x08 ^ 0x00 = 0xF8
示例:食指张开(舵机1=170°, 舵机2=10°),其余归中(90°)
发送: AA F0 08 AA 0A 5A 5A 5A 5A 5A 5A 58
└─170° └─10°4.3 设左右手 (0xF1)
1 字节数据:0x01 = 右手,0x02 = 左手。
设右手: AA F1 01 01 F1
设左手: AA F1 01 02 F24.4 控制命令
| 命令 | HEX 帧 | 说明 |
|---|---|---|
| NOP | AA 00 00 00 | 链路测试,立即返回 BB 00 00 00 |
| 重复 | AA FE 00 FE | 重复执行上一次手势 |
| 停止 | AA FF 00 FF | 立即终止当前手势 |
4.5 响应速查
收到无效命令时(以 0xFC 这个不存在的命令为例):
发送: AA FC 00 FC
响应: BB FC 01 FD (STATUS=0x01 无效命令)校验和验证:
FC ^ 00 = FC,响应FC ^ 01 = FD
5. 手势参数精调
5.1 参数位置
每个手势的角度偏移量用 #define 宏定义,无需改逻辑代码,只调数值。
- ESP-IDF 版:
components/hand_gestures/hand_gestures.c顶部"手势参数(用户可调)"区
5.2 参数含义
// 例:石头手势
#define ROCK_IDX_OFF1 70 // 食指关节1 偏移量
#define ROCK_IDX_OFF2 -70 // 食指关节2 偏移量- 正值 = 弯曲握紧,负值 = 伸展打开
- 每根手指 2 个偏移量,相对
middle_pos(默认 90°) - 差动结构:两舵机并排、轴心共线;同向旋转产生左右侧摆,反向旋转产生屈伸;两个偏移角之和对应侧摆,之差对应屈伸。
5.3 调参步骤
- 找到对应手势的
#define宏 - 修改数值(增大 → 幅度更大;减小 → 幅度更小)
- 重新编译烧录,用上位机测试效果
- 反复微调直到动作自然
6. 常见问题
Q1: 上位机连不上串口?
- 确认 ESP32 已通过 Type-C 连接电脑
- 检查设备管理器中的 COM 口号是否与 GUI 选择一致
- 确认波特率 115200
- 断开其他占用串口的软件
Q2: 发送命令没反应?
- 先发
AA 00 00 00(NOP),应收到BB 00 00 00 - 确认固件已烧录且目标芯片是 ESP32-S3
- 检查接线(GND 是否共地)
Q3: 手势动作幅度不对或方向反了?
进入手势参数精调(见 第 5 节)调整对应宏。
Q4: 左右手模式影响哪些手势?
石头/剪刀/真棒/OK/捏合等含拇指的手势,切换左右手后拇指镜像方向。
Q5: 手指卡住、伸不出来?
所有收缩类手势执行前会自动"先全手展开再收拢",避免手指被上一手势挡住。若仍卡住,检查机械装配或减小收缩幅度。

