| 项目 | 值 |
|---|---|
| 波特率 | 115200 |
| 数据位 | 8 |
| 停止位 | 1 |
| 校验 | 无 |
[0xAA] [0x55] [CMD] [LEN] [PAYLOAD x LEN] [CHK]
| 字段 | 长度 | 说明 |
|---|---|---|
| 帧头 | 2 字节 | 固定 0xAA 0x55 |
| CMD | 1 字节 | 命令/响应字 |
| LEN | 1 字节 | Payload 长度(字节数,可为 0) |
| PAYLOAD | LEN 字节 | 数据内容 |
| CHK | 1 字节 | XOR 校验:CMD ^ LEN ^ PAYLOAD[0] ^ ... ^ PAYLOAD[N-1] |
| 状态值 | 状态名 | 蓝灯 | 说明 |
|---|---|---|---|
| 0x00 | UNINIT | 灭 | 上电初始状态 |
| 0x01 | IDLE | 常亮 | 初始化完成 |
| 0x02 | READY | 慢闪 500ms | 配置完成 |
| 0x03 | RUNNING | 快闪 100ms | 电机运行中 |
| 0x04 | SYS_ERROR | 双闪 | 系统错误 |
- Payload:无(LEN = 0)
- 作用:复位编码器计数、停止双路电机,进入 IDLE 状态
- 响应:ACK(0x01)
- 前置状态:任意
示例
AA 55 01 00 01
- Payload(4 字节):
| 字节 | 含义 | 类型 |
|---|---|---|
| [0:1] | PPR(每转脉冲数) | uint16 大端 |
| [2:3] | PWM 频率(Hz) | uint16 大端 |
- 作用:更新编码器 PPR 和 PWM 频率,重新初始化驱动引脚,进入 READY 状态
- 响应:ACK(0x02) 或 NACK
- 前置状态:必须为 IDLE
常用 PPR 值
| 减速比 | PPR |
|---|---|
| 1:48 | 2496 |
| 1:90 | 4680 |
示例(PPR=2496, PWM_FREQ=20000)
AA 55 02 04 09 C0 4E 20 CHK
CHK = 0x02^0x04^0x09^0xC0^0x4E^0x20 = 0xEB
完整帧: AA 55 02 04 09 C0 4E 20 EB
- Payload(3 字节):
| 字节 | 含义 | 类型 |
|---|---|---|
| [0] | 电机 ID(0=M1, 1=M2) | uint8 |
| [1:2] | 速度(-255~255,负数反转) | int16 大端 |
- 作用:设置指定电机的 PWM 速度和方向,进入 RUNNING 状态
- 响应:ACK(0x10) 或 NACK
- 前置状态:READY 或 RUNNING
示例(M1 正转 200)
AA 55 10 03 00 00 C8 CHK
CHK = 0x10^0x03^0x00^0x00^0xC8 = 0xDB
完整帧: AA 55 10 03 00 00 C8 DB
示例(M2 反转 150)
速度 -150 = 0xFF6A
AA 55 10 03 01 FF 6A CHK
CHK = 0x10^0x03^0x01^0xFF^0x6A = 0x77
完整帧: AA 55 10 03 01 FF 6A 77
- Payload(1 字节):电机 ID(0=M1, 1=M2)
- 作用:两路 PWM 均置 0,电机自由滑行
- 响应:ACK(0x11) 或 NACK
- 前置状态:READY 或 RUNNING
示例(停 M1)
AA 55 11 01 00 10
- Payload(1 字节):电机 ID(0=M1, 1=M2)
- 作用:两路 PWM 均置 255,电机短接制动
- 响应:ACK(0x12) 或 NACK
- 前置状态:READY 或 RUNNING
示例(刹 M2)
AA 55 12 01 01 12
- Payload(4 字节):
| 字节 | 含义 | 类型 |
|---|---|---|
| [0:1] | M1 速度(-255~255) | int16 大端 |
| [2:3] | M2 速度(-255~255) | int16 大端 |
- 作用:一条指令同时设置两个电机的 PWM 速度和方向,进入 RUNNING 状态
- 响应:ACK(0x13) 或 NACK
- 前置状态:READY 或 RUNNING
示例(M1=200, M2=-150)
速度 200 = 0x00C8,-150 = 0xFF6A
AA 55 13 04 00 C8 FF 6A CHK
CHK = 0x13^0x04^0x00^0xC8^0xFF^0x6A = 0xD4
完整帧: AA 55 13 04 00 C8 FF 6A D4
- Payload(1 字节):电机 ID(0=M1, 1=M2, 2=双路同时返回)
- 响应:一条或两条 RPM_DATA(0x90)
- 前置状态:IDLE 及以上
示例(查询双路)
AA 55 20 01 02 23
- Payload:无(LEN = 0)
- 响应:STATUS(0x91)
- 前置状态:任意
示例
AA 55 21 00 21
- Payload:无(LEN = 0)
- 作用:停止双路电机,回到 UNINIT 状态
- 响应:ACK(0xFF)
- 前置状态:任意
示例
AA 55 FF 00 FF
- Payload(1 字节):被响应的命令字
示例(响应 INIT)
AA 55 80 01 01 80
- Payload(2 字节):
| 字节 | 含义 |
|---|---|
| [0] | 被响应的命令字 |
| [1] | 错误码 |
错误码表
| 错误码 | 含义 |
|---|---|
| 0x01 | 当前状态不允许该命令 |
| 0x02 | 校验错误 |
| 0x03 | 参数非法(长度/范围/ID错误) |
| 0x04 | 未知命令 |
- Payload(3 字节):
| 字节 | 含义 | 类型 |
|---|---|---|
| [0] | 电机 ID(0 或 1) | uint8 |
| [1:2] | 转速 RPM(正=正转,负=反转) | int16 大端 |
示例(M1 = 185 RPM)
AA 55 90 03 00 00 B9 CHK
- Payload(5 字节):
| 字节 | 含义 | 类型 |
|---|---|---|
| [0] | 系统状态值 | uint8 |
| [1:2] | M1 转速 RPM | int16 大端 |
| [3:4] | M2 转速 RPM | int16 大端 |
主机 ESP32
|--- INIT (0x01) ----------->|
|<-- ACK (0x01) -------------| 蓝灯常亮
|--- CONFIG (0x02) |
| PPR=2496, FREQ=20000 -->|
|<-- ACK (0x02) -------------| 蓝灯慢闪
|--- SET_SPEED (0x10) |
| M1, +200 -------------->|
|<-- ACK (0x10) -------------| 蓝灯快闪
|--- GET_RPM (0x20) M1=0 --->|
|<-- RPM_DATA (0x90) --------|
| GPIO | 功能 |
|---|---|
| GPIO3 | M1 IN2 (DRV8833 AIN2) |
| GPIO4 | M1 IN1 (DRV8833 AIN1) |
| GPIO5 | M1 编码器 A 相 |
| GPIO6 | M1 编码器 B 相 |
| GPIO1 | M2 IN1 |
| GPIO2 | M2 IN2 |
| GPIO7 | M2 编码器 A 相 |
| GPIO10 | M2 编码器 B 相 |
| GPIO8 | 板载蓝色 LED |
| GPIO20 | UART RX (USB-CDC) |
| GPIO21 | UART TX (USB-CDC) |