🧪 新教程持续更新中 · 从机械臂到传感器,跟着教程从零搭建
跳到主要内容

PWM 舵机协议、命令与标定 ​

本页覆盖 PWM 固件的串口协议、命令、校准和参数精调。接线见 PWM 接线,烧录见 PWM 快速上手,桌面/网页控制见 PWM 桌面上位机 / PWM 网页控制。

以下命令在仓库的 AmazingHand-PWM/ 目录下执行。固件源码:firmware/AmazingHand_Serial/。

1. 命令与手势一览 ​

前 11 行为手势命令,其余为直驱、选边、重复、停止和链路测试命令。

手势/命令命令说明
石头0x01猜拳:全指握拳
剪刀0x02猜拳:食指+中指伸出呈 V 字
布0x03猜拳:全指张开
真棒0x04拇指竖起,其余握拳
嘲讽10x05摇食指("不不不")
嘲讽20x06无名指伸展晃动(替代小拇指)
张开0x07全指张开
握拳0x08全指闭合
OK0x09OK 手势
捏合0x0A捏合手势
指向0x0C食指伸出做"指"动作
直驱0xF0直接控制 8 路舵机角度
设左右手0xF1切换左手/右手模式
重复0xFE重复执行上一次手势
停止0xFF立即终止当前手势
NOP0x00链路测试

注:命令 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含义说明
0x00OK命令已接受,开始执行
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 01BB 01 00 01 → BB 01 10 11全指握拳
剪刀AA 02 00 02BB 02 00 02 → BB 02 10 12食指+中指伸出
布AA 03 00 03BB 03 00 03 → BB 03 10 13全指张开
真棒AA 04 00 04BB 04 00 04 → BB 04 10 14拇指竖起
嘲讽1AA 05 00 05BB 05 00 05 → BB 05 10 15摇食指(约 2.5s)
嘲讽2AA 06 00 06BB 06 00 06 → BB 06 10 16无名指晃动(约 2.5s)
张开AA 07 00 07BB 07 00 07 → BB 07 10 17全指张开
握拳AA 08 00 08BB 08 00 08 → BB 08 10 18全指闭合
OKAA 09 00 09BB 09 00 09 → BB 09 10 19OK 手势
捏合AA 0A 00 0ABB 0A 00 0A → BB 0A 10 1A捏合手势
指向AA 0C 00 0CBB 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 F2

4.4 控制命令 ​

命令HEX 帧说明
NOPAA 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 参数含义 ​

c
// 例:石头手势
#define ROCK_IDX_OFF1    70    // 食指关节1 偏移量
#define ROCK_IDX_OFF2   -70    // 食指关节2 偏移量
  • 正值 = 弯曲握紧,负值 = 伸展打开
  • 每根手指 2 个偏移量,相对 middle_pos(默认 90°)
  • 差动结构:两舵机并排、轴心共线;同向旋转产生左右侧摆,反向旋转产生屈伸;两个偏移角之和对应侧摆,之差对应屈伸。

5.3 调参步骤 ​

  1. 找到对应手势的 #define 宏
  2. 修改数值(增大 → 幅度更大;减小 → 幅度更小)
  3. 重新编译烧录,用上位机测试效果
  4. 反复微调直到动作自然

6. 常见问题 ​

Q1: 上位机连不上串口? ​

  1. 确认 ESP32 已通过 Type-C 连接电脑
  2. 检查设备管理器中的 COM 口号是否与 GUI 选择一致
  3. 确认波特率 115200
  4. 断开其他占用串口的软件

Q2: 发送命令没反应? ​

  1. 先发 AA 00 00 00(NOP),应收到 BB 00 00 00
  2. 确认固件已烧录且目标芯片是 ESP32-S3
  3. 检查接线(GND 是否共地)

Q3: 手势动作幅度不对或方向反了? ​

进入手势参数精调(见 第 5 节)调整对应宏。

Q4: 左右手模式影响哪些手势? ​

石头/剪刀/真棒/OK/捏合等含拇指的手势,切换左右手后拇指镜像方向。

Q5: 手指卡住、伸不出来? ​

所有收缩类手势执行前会自动"先全手展开再收拢",避免手指被上一手势挡住。若仍卡住,检查机械装配或减小收缩幅度。

相关页面 ​