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