R3关节舵机协议
- 当前版本V1.0.0
- 修改时间2020-12-16
一、通信要求
主机和舵机之间采用串口进行通讯。
采用波特率为115200、数据位为8、停止位为1、无奇偶校验位、无硬件流控通讯模式。
二、协议要求
数据包的帧组成结构说明
每帧数据由数据头+ID+长度+数据+校验组成 每帧长度限制最大为64byte
| 帧头(固定) | ID | 数据长度 | 数据 | 校验 |
|---|---|---|---|---|
| 0xFC 0x55 | 0xxx | 0xxx | ... | 0xxx |
| 1. 数据头由固定的0xfc 0x55组成,标志帧起始位置 | ||||
| 2. ID 占用一个字节,用来识别是哪一个设备的命令,注意ID>=0xE0为特殊用途(0xE0标识此帧为广播帧,全部设备都将接收此包) | ||||
| 3. 数据的长度不含帧头、ID、长度、校验所占字节,最大值为59 | ||||
| 4. 数据部份最大为59字节 | ||||
| 5. 校验占一个字节计算ID、长度和数据的各个字节的和然后取低8位数据 |
例帧:
0xfc,0x55,0x01,0x03,0x01,0x02,0x03,0x0a
fc 55 01 03 01 02 03 0a
各关节舵机ID表
| ID | 功能描述 |
|---|---|
| 0x01 | 左边肩膀X轴舵机 |
| 0x02 | 左边肘部X轴舵机 |
| 0x03 | 左边肩膀Y轴舵机 |
| 0x04 | 左边肘部Y轴舵机 |
| 0x05 | 头部左右摇头舵机 |
| 0x81 | 右边肩膀X轴舵机 |
| 0x82 | 右边肘部X轴舵机 |
| 0x83 | 右边肩膀Y轴舵机 |
| 0x84 | 右边肘部Y轴舵机 |
| 0x85 | 头部上下点头舵机 |
- 接口通过 HTTP POST JSON 方法发送
- 接口支持 HTTP
- 接口返回数据格式为 JSON 格式
舵机的私有协议
- 舵机的私有协议的内容仅仅包含在上面帧的数据部份里面(类型+参数)
- 由下表结构组成
| 类型 | 参数 | 参数长度 | 功能 |
|---|---|---|---|
| 0x00 | 状态1+状态2+(地址+N数据) | 2+(1+N) | 应答包 |
| 0x01 | 无 | 0 | 查询状态(PING) |
| 0x02 | 地址+长度 | 2 | 读控制表 |
| 0x03 | 地址+N数据 | 1+N | 写控制表 |
| 0x04 | 地址+N数据 | 1+N | 异步写控制表 |
| 0x05 | 无 | 0 | 异步写执行 |
| 0x06 | 无 | 0 | 复位控制表到初始值 |
| 0x88 | 地址+长度L+(设备1ID+L数据+…+设置NID+L数据) | 2+(1+L)*N | 同步写指令 |
1. 应答包0x00:
当舵机接收到的是广播(id:0xe0)命令时舵机不返回应答包。当接收到自身命令包时将返回应答包。
2. 查询状态0x01
舵机接收到查询命令时返回对应状态命令
01舵机的实例帧(返回当前的状态为00 00)
指令帧:FC 55 01 01 01 03
返回帧:FC 55 01 03 00 00 00 04
3. 读控制表 0x02
舵机接收到读控制表的命令返回对应地址开始的对应长度的内容
01舵机的实例帧(读取03开始的2个字节 返回当前的状态为00 00 地址03开始的数据为 01 02)
指令帧:FC 55 01 03 02 03 02 0B
返回帧:FC 55 01 06 00 00 00 03 01 02 0D
4. 写控制表 0x03
舵机接收到写控制表的命令时将对应的数据写入对应地址的表中,返回应答包
01舵机的实例帧(写入A1开始的1个字节01 启动执行自动校准 返回当前的状态为00 00 )
指令帧:FC 55 01 03 03 A1 01 A9
返回帧:FC 55 01 03 00 00 00 04
5. 异步写控制表0x04
此功能跟写控制表类似,只是写进去后舵机不会马上执行,直到接收到异步写执行命令后才会执行,异步可写的寄存器范围是0x50-0x7f。
6. 异步写执行命令0x05
此命令用来激活异步写控制表的命令,当需要对多个舵机发送命令时可以直接用广播(ID:0xE0)来发送,此时不会有应答包,否则返回应答包
7. 复位控制表到初始值0x06
此命令用来复位控制表到初始值舵机状态也会相应归位到初始状态
8. 同步写指令 0x88
此命令可以同时给多个舵机发送控制命令,写入数据 地址和长度需要保持相同,执行的动作也是相同。此命令需要用广播(ID:0xE0)的方式发送,效率比各异步写执行高,此命令可以操作的范围为0x50-0x7f
01 02 03舵机的实例帧(写入50开始的4个字节
01舵机:01 02 03 04
02舵机:02 03 04 05
03舵机:03 04 05 06
)
指令帧:FC 55 E0 12 88 50 04 01 01 02 03 04 02 02 03 04 05 03 03 04 05 06 FE
返回帧:无
舵机的控制表
| 地址 | 读/写 | 初始值 | 功能说明 | 其它 |
|---|---|---|---|---|
| 0x00 | -- | -- | -- | 保存FLASH |
| 0x01 | -- | -- | -- | 保存FLASH |
| 0x02 | -- | -- | -- | 保存FLASH |
| 0x03 | 读 | -- | 固件版本高8位 | 保存FLASH |
| 0x04 | 读 | -- | 固件版本低8位 | 保存FLASH |
| 0x05 | 设备ID高8位 | 保存FLASH | ||
| 0x08 | ||||
| 0x06 | 设备ID低8位 | 保存FLASH | ||
| 0x82 | ||||
| … | 读 | 保存FLASH | ||
| 0x10 | 读 | 预留 | 保存FLASH | |
| … | 读 | 预留 | 保存FLASH | |
| 0x1f | 读 | 预留 | 保存FLASH | |
| 0x20 | 读/写 | -- | ID | 保存FLASH |
| 0x21 | 读/写 | 0x09 | 波特率 | 保存FLASH 0—1200 1—2400 2—4800 3—9600 4—14400 5—19200 6—38400 7—56000 8—57600 9—115200 10—128000 |
| 0x22 | 读/写 | 0xff | 低点位置对应AD值高8位 | 保存FLASH |
| 0x23 | 读/写 | 0xff | 低点位置对应AD值低8位 | 保存FLASH |
| 0x24 | 读/写 | 0xff | 高点位置对应AD值高8位 | 保存FLASH |
| 0x25 | 读/写 | 0xff | 高点位置对应AD值低8位 | 保存FLASH |
| 0x26 | 读/写 | 0 | 低点位置对应角度高8位 | 保存FLASH 默认0-4096 |
| 0x27 | 读/写 | 0 | 低点位置对应角度低8位 | 保存FLASH |
| 0x28 | 读/写 | 0x10 | 高点位置对应角度高8位 | 保存FLASH |
| 0x29 | 读/写 | 0x00 | 高点位置对应角度低8位 | 保存FLASH |
| 0x2a | 读/写 | 0x00 | 角度误差范围高8位 | 保存FLASH 默认10 |
| 0x2b | 读/写 | 0x0a | 角度误差范围低8位 | 保存FLASH |
| 0x2c | 读/写 | 0xff | 校整运行速度高8位 | 保存FLASH 此速度是设置的PWM的占宽比 |
| 0x2d | 读/写 | 0xff | 校整运行速度低8位 | 保存FLASH |
| … | 读/写 | 保存FLASH | ||
| 0x30 | 读/写 | 0x00 | 马达最小速度 | 保存FLASH 单位:每100MS计数 |
| 0x31 | 读/写 | 0x00 | 马达最大速度 | 保存FLASH 单位:每100MS计数 |
| 0x32 | 读/写 | 0x00 | 马达启动速度 | 保存FLASH 单位:每100MS计数 |
| 0x33 | 读/写 | 0x00 | 马达启动速度最大偏移值 | 保存FLASH 单位:每100MS计数 |
| 0x34 | 读/写 | 0x00 | 马达加速行程占比 | 保存FLASH |
| 0x35 | 读/写 | 0x00 | 马达减速行程占比 | 保存FLASH |
| 0x36 | 读/写 | 0x00 | 位置堵转偏移范围 | 保存FLASH 超过指定的时间(800MS)位置反馈电压值变化值连续不超过偏移范围时认为堵转 |
| 0x37 | 读/写 | 0x00 | 校准的时候顶点预留的角度 | 保存FLASH |
| 0x38 | 读/写 | 0x00 | 主动上报偏差的角度 | 保存FLASH |
| 0x39 | 读/写 | 0x00 | 主动上报最短时间差ms | 保存FLASH |
| … | 读/写 | 保存FLASH | ||
| 0x4f | 读/写 | 保存FLASH | ||
| 0x50 | 读/写 | 预留 | ||
| … | 读/写 | 预留 | 保存FLASH | |
| 0x5f | 读/写 | 预留 | 保存FLASH | |
| 0x60 | 读 | -- | 当前位置高8位 | RAM |
| 0x61 | 读 | -- | 当前位置低8位 | RAM |
| 0x62 | 读 | -- | 当前位置ADC(经过滤波算法后)高8位 | RAM |
| 0x63 | 读 | -- | 当前位置ADC(经过滤波算法后)低8位 | RAM |
| 0x64 | 读 | -- | 当前实际ADC高8位 | RAM |
| 0x65 | 读 | -- | 当前实际ADC低8位 | RAM |
| … | ||||
| 0x7a | 读 | 0 | FLASH是否保存有寄存器表 | RAM 0:未保存 1:保存 |
| 0x7b | 读 | 0 | 运行状态高8位 | RAM bit[0]:0--马达正常 1--马达异常 bit[1]:0--角度传感器正常 1--角度传感器异常 |
| 0x7c | 读 | 0 | 运行状态低8位 | RAM bit[0]:0--未堵转 1--堵转 bit[1]: 0--未达目标角度 1--已达目标角度 bit[3-2]:00—释放 01—正转 10—反转 11—刹车 |
| … | RAM | |||
| 0x7f | 读 | RAM | ||
| 0x80 | 读 | -- | 预留 | |
| … | 读 | -- | 预留 | RAM |
| 0x8f | 读 | -- | 预留 | RAM |
| 0x90 | 读/写 | 0xff | 目标位置高8位 | RAM |
| 0x91 | 读/写 | 0xff | 目标位置低8位 | RAM |
| 0x92 | 读/写 | 0xff | 运行时间高8位 | RAM |
| 0x93 | 读/写 | 0xff | 运行时间低8位 | RAM |
| 0x94 | 读/写 | 0xff | 运行速度高8位 | RAM |
| 0x95 | 读/写 | 0xff | 运行速度低8位 | RAM |
| 0x96 | 读/写 | 0 | 运行控制位0 | RAM bit[0]: 渐进式启停 |
| 0x97 | 读/写 | 0 | 运行控制位1 | RAM bit[0]: 启动自动测试 |
| 0x98 | 读/写 | 0 | 动作运行控制 | RAM 0: 停止 1:正转 2:返转 3:刹车 |
| 0x99 | 读/写 | 0xff | 动作运行时间高8位 | RAM |
| 0x9a | 读/写 | 0xff | 动作运行时间低8位 | RAM |
| 0x9b | 读/写 | 0 | 运动加持力高8位 | RAM 有效值是-4096~4096 正值表示正向加持,负值是反向加持。 假设PWM的定时器计数值 是1850设置值是50则PWM值是正向的50*1850/4096=22 此加持力只针对某个设定的位置后起作用。 如果重新设置不同的位置,则加持力自动清除。 |
| 0x9c | 读/写 | 0 | 运动加持力低8位 | RAM |
| … | RAM | |||
| 0xa0 | 读/写 | 0 | 异步写执行标志 | RAM |
| 0xa1 | 读/写 | 0 | 启动自动校准标志 | RAM |
| … | 读/写 | RAM | ||
| 0xae | 读/写 | 0 | 调试信息输出等级 | RAM 0:不输出 1:错误等级 2:警告等级 3:通知等级 4:信息等级 5:调试等级 |
| 0xaf | 读/写 | -- | 调试信息标志 | RAM |
| 0xb0 | 读/写 | -- | 预留 | RAM |
| … | 读/写 | -- | 预留 | RAM |
| 0xbf | 读/写 | -- | 预留 | RAM |
| 0xf0 | 读 | 打印固件的编译日期时间 |
其它特殊的功能
- 肩膀控制板控制命令表,控制板马达0位置控制的是肩膀X关节所以对应的马达ID需要为0x01或者0x81 仅右肩膀才有用:
| 地址 | 读/写 | 初始值 | 功能说明 | 其它 |
|---|---|---|---|---|
| 0x8b | 读 | -- | 电容感应按键 | RAM 对应位为1表示有感应到 仅右肩膀0x81才有用 bit0: 左肩触模PB7 bit1: 右肩触模PB8 bit2: 肚子触模PB6 bit3: 屁股触模PB3 |
| … | 读 | -- | 预留 | RAM |
| 0x8f | 读 | -- | 预留 | RAM |
| 0xb0 | 读/写 | -- | 整个手臂电源控制 | RAM 仅左肩膀0x01才有功能 |
| … | 读/写 | -- | 预留 | RAM |
| 0xba | 读/写 | 0 | 私有功能控制 | RAM 仅右肩膀0x81才有功能 bit0:预留 bit1:电容感应按键使能 |
| 0xbb | 读/写 | 0 | 私有功能控制 | RAM bit0:手臂是否需要反作用保持动作位置 |
| … | 读/写 | -- | 预留 | RAM |
| 0xbf | 读/写 | -- | 预留 | RAM |
- 手肘控制板控制命令表,控制板马达0位置控制的是肩膀Y关节所以对应的马达ID需要为0x03或者0x83:
| 地址 | 读/写 | 初始值 | 功能说明 | 其它 |
|---|---|---|---|---|
| 0x8b | 读 | -- | 电容感应按键 | RAM 对应位为1表示有感应到 bit0: 手臂按键 |
| … | 读 | -- | 预留 | RAM |
| 0x8f | 读 | -- | 预留 | RAM |
| 0xb0 | 读/写 | -- | 预留 | RAM |
| … | 读/写 | -- | 预留 | RAM |
| 0xba | 读/写 | 0 | 私有功能控制 | RAM bit0:预留 bit1:电容感应按键使能 |
| … | 读/写 | -- | 预留 | RAM |
| 0xbf | 读/写 | -- | 预留 | RAM |
- 手指控制板控制命令表:
| 地址 | 读/写 | 初始值 | 功能说明 | 其它 |
|---|---|---|---|---|
| 0x80 | 读 | -- | 手撑运动状态 | RAM 0—释放 1—锁止 2—握紧 3—展开 |
| 0x81 | 读 | -- | 手撑所在位置 | RAM 0、1—未知 2—完全握紧 4—完全展开 |
| … | 读 | -- | 预留 | RAM |
| 0x8a | 读 | -- | 近距离感应 | RAM 对应位为1表示有感应到 bit0:左位置检测 bit1:中位置检测 bit2:右位置检测 |
| 0x8b | 读 | -- | 电容感应按键 | RAM 对应位为1表示有感应到 bit0: 手背按键 bit1:手掌按键 |
| … | 读 | -- | 预留 | RAM |
| 0x8f | 读 | -- | 预留 | RAM |
| 0xb0 | 读/写 | -- | 手撑运动控制 | RAM 0—释放 1—锁止 2—握紧 3—展开 |
| 0xb1 | 读/写 | -- | 手撑运动时间高8位 | RAM 单位ms |
| 0xb2 | 读/写 | -- | 手撑运动时间低8位 | RAM 单位ms |
| … | 读/写 | -- | 预留 | RAM |
| 0xba | 读/写 | 0 | 私有功能控制 | RAM bit0:近距离感应使能 bit1:电容感应按键使能 |
| … | 读/写 | -- | 预留 | RAM |
| 0xbf | 读/写 | -- | 预留 | RAM |