跳转至

UART总线伺服舵机通信协议

版本历史

版本号 发布日期 主要变更
v1.0.25 2025-02-21 添加全新功能 同步命令 / 三种停止指令 / 数据监控 / 异步命令 ,详情见14131110 详细介绍
v1.0.21 2024-07-03 优化文档描述

1. 串口通信配置

参数名称(en) 参数名称(cn) 参数数值 备注
baudrate 波特率 115200 舵机支持多种波特率,参见<参数>波特率选项
parity 奇偶校验
stopbits 停止位 1
bytesize 字节长度 8

2. 数据类型说明

通讯协议里用到的数据类型 (字节大小,取值范围)

数据类型 数据名称(en) 数据名称(cn) 字节长度 最小值 最大值
uint8_t byte 字节 1 0 255
uint16_t unsigned short 无符号短整型 2 0 65535
int16_t signed short 有符号短整数 2 -32768 32767
uint32_t unsigned long 无符号长整数 4 0 4294967295
int32_t signed long 有符号长整数 4 -2147483648 2147483647
uint8_t[n] byte array 变长字节数组 n

注意事项:

  • 舵机通讯协议里面使用的字节序为 小端字节序,例如一个 uint16_t的数值 4660,它的十六进制表示为 0x1234。在发送/接收时,低位字节在前,高位字节在后,即以 0x34 0x12形式发送。

计算机电路先处理低位字节,效率比较高,所以在大部分的MCU里面(例如STM32),默认字节序也是小端字节序。

拓展阅读: 理解字节序 大端字节序和小端字节序

3. 舵机控制指令

支持20种舵机控制指令。其中9种为通用指令,余下11种指令仅限于 磁编码系列舵机

通用指令

指令ID 指令名称(EN) 指令名称(CN) 备注
1 PING 通讯检测 检查舵机是否在线
2 RESET_USER_DATA 自定义参数重置 重新将用户参数设置为默认值
3 READ_DATA 参数&状态数据读取 单个读取参数&状态数据
4 WRITE_DATA 自定义参数写入 单个写入舵机参数
8 MOVE_ON_ANGLE_MODE(ROTATE) 角度模式控制-设置舵机角度 设置舵机旋转的目标角度,时间间隔,执行功率
9 MOVE_ON_DAMPING_MODE(DAMPING) 阻尼模式控制 阻尼模式,设置舵机保持的功率
10 READ_ANGLE 读取舵机角度
11 MOVE_ON_ANGLE_MODE_EX_BY_INTERVAL 角度模式控制-指定时间 带加减速控制的角度模式,
设置加减速时间,时间间隔,目标角度,执行功率
12 MOVE_ON_ANGLE_MODE_EX_BY_VELOCITY 角度模式控制-指定速度 带加减速控制的角度模式,
设置加减速时间,目标速度,目标角度,执行功率

特定指令,仅限于磁编码系列舵机

指令ID 指令名称(EN) 指令名称(CN) 备注
13 MOVE_ON_MULTI_TURN_ANGLE_MODE(ROTATE) 多圈角度控制 设置舵机旋转的目标角度,时间间隔,执行功率
14 MOVE_ON_MULTI_TURN_ANGLE_MODE_EX_BY_INTERVAL 多圈角度控制-指定时间 带加减速控制的多圈角度模式,
设置加减速时间,时间间隔,目标角度,执行功率
15 MOVE_ON_MULTI_TURN_ANGLE_MODE_EX_BY_VELOCITY 多圈角度控制-指定速度 带加减速控制的多圈角度模式,
设置加减速时间,目标速度,目标角度,执行功率
16 READ_MULTI_TURN_ANGLE 多圈角度读取
17 RESET_MULTI_TURN_ANGLE 清除当前圈数 清除后角度范围为[-180,180]
18 BEGIN_ASYNC 异步写入指令
19 END_ASYNC 异步执行指令
22 SERVO_MONITOR 数据监控 批量读取工作状态数据
23 SET_ORIGIN_POINT 原点设置 设置当前角度位置为原点(0°)
24 STOP_ON_CONTROL_MODE 停止指令 停止后可选择进入锁定、失锁、阻尼三种状态
25 SYNC_COMMAND 同步指令

注意事项:

  1. 发送控制指令之前,请确保串联在一起的舵机每个舵机的ID号都不一样。

4. 数据包

4.1 请求数据包

字节序号 数据类型 字段名称 字段功能描述 字节长度
0 uint8_t 0x12 请求头标识 1
1 uint8_t 0x4C 请求头标识 1
2 uint8_t cmd_id 舵机控制指令ID,详情见 舵机指令 1
3 uint8_t n 数据包内容的字节长度 1
[4,4+n-1] uint8_t[n] content 数据包的內容部分,变长 n
4+n uint8_t checksum 数据包的校验和。计算方法:对之前所有的字节数据求和
(0号到4+N-1号字节),然后跟256取余
1

4.2 响应数据包

请求数据包跟响应数据包数据结构的唯一区别就在于前两个字节的标识符。

字节序号 数据类型 字段名称 字段功能描述 字节长度
0 uint8_t 0x05 响应头标识 1
1 uint8_t 0x1C 响应头标识 1
2 uint8_t cmd_id 舵机控制指令ID,详情见 舵机指令 1
3 uint8_t n 数据包内容的字节长度 1
[4,4+n-1] uint8_t[n] content 数据包的內容部分 n
4+n uint8_t checksum 数据包的校验和。计算方法:对之前所有的字节数据求和
(0号到4+N-1号字节),然后跟256取余
1

注意事项:

  1. 封包内容的第一个字节,往往是舵机的ID号,舵机的ID号取值范围为[0, 254] ,255是舵机广播地址。
  2. 字节序号是从0开始算的。
  3. 请求包的 cmd_id 跟响应包的 cmd_id 一致。
  4. 响应数据的接收流程。

如果你需要自己写舵机的通讯协议,可参考的响应数据包获取流程如下:

响应数据包数据读取伪代码

  1. 读取帧头:读取数据帧 0x05 0x1c 如果不匹配就继续向下读,直到匹配。
  2. 读取控制指令 cmd_id:读入下一个字节赋值给 cmd_id,检查ID是否在[1, 10]之间。
  3. 读取字节长度 n :读入下一个字节赋值给 n
  4. 读取数据包的内容 content:读入后续的连续 n个字节,赋值给 content
  5. 读取校验和 checksum :读取一个字节,赋值给 checksum,并验证 checksum 是否正确。
  6. 数据包的样例可以参阅#5.1. <指令>舵机通讯检测#7.1<指令>设置舵机角度 等。

5. 舵机通讯检测

5.1 <指令>舵机通讯检测

指令ID 指令名称(EN) 指令名称(CN) 备注
1 PING 舵机通讯检测 检查舵机是否在线

检查舵机是否在线,就需要用到PING指令。PING数据包的内容部分是舵机的ID。

如果ID号的舵机存在且在线,串口舵机在接收到PING指令时,会发送一个响应包。如果ID号的舵机不存在或者掉线,就不会有舵机发送响应数据包。在系统实现时,可以设置一个最大等待时间 timeout , 如果等待超过 timeout ms 就认为该ID号的舵机不在线。

5.1.1 请求包内容格式

字节序号 数据类型 字段名称 字段功能描述 字节长度
4 uint8_t servo_id 舵机ID 1

5.1.2 响应包内容格式

字节序号 数据类型 字段名称 字段功能描述 字节长度
4 uint8_t servo_id 舵机ID 1

5.1.3 数据包示例

ping一下3号舵机

请求数据包

0x12 0x4c 0x01 0x01 0x03 0x63

功能描述 检查一下3号舵机是否在线。

这就需要 PING(舵机通讯检测)一下编号为3的串口舵机。

  • PING指令对应的指令ID cmd_id = 0x01
  • 数据包的内容因为只有舵机的ID servo_id = 0x03,所以数据包内容的字节长度 n = 0x01
  • 计算校验和 checksum = (0x12 + 0x4c + 0x01 + 0x01 + 0x03)%256 = 99 = 0x63

接下来分析一下回传数据,假设舵机存在并在线,返回的字节数据为

0x05 0x1c 0x01 0x01 0x03 0x26
  • 0x05 0x1c : 响应头标识符
  • 0x01: cmd_id 这个包是PING指令的响应数据包
  • 0x01: n 响应数据包内容的长度是1
  • 0x03: servo_id 舵机的ID是 3
  • 0x26: checksum 校验和

我们拿到响应数据之后,要通过计算校验和 checksum判断响应数据包的合法性。

(0x05 + 0x1c + 0x01 + 0x01 + 0x03)%256 = 38 = 0x26

校验和相等, 所以响应包的数据为合法。

6. 舵机参数

舵机参数整体上分为用户只读参数(舵机型号,舵机状态等)和用户自定义参数两大类。

6.1. 舵机参数设置/修改

6.1.1. <指令>用户自定义参数重置

指令ID 指令名称(EN) 指令名称(CN) 备注
2 RESET_USER_DATA 用户自定义参数重置 重新将用户参数设置为默认值
请求包内容格式
字节序号 数据类型 字段名称 字段功能描述 字节长度
4 uint8_t servo_id 舵机ID 1
响应包内容格式
字节序号 数据类型 字段名称 字段功能描述 字节长度
4 uint8_t servo_id 舵机ID 1
5 uint8_t result 重置结果(0重置失败, 1 重置成功) 1

6.1.2. <指令>参数&数据读取

指令ID 指令名称(EN) 指令名称(CN) 备注
3 READ_DATA 舵机参数&状态数据读取 单个读取
请求包内容格式
字节序号 数据类型 字段名称 字段功能描述 字节长度
4 uint8_t servo_id 舵机ID 1
5 uint8_t data_id 舵机参数的ID , 定义参见舵机只读参数列表舵机用户自定义参数列表 1
响应包内容格式
字节序号 数据类型 字段名称 字段功能描述 字节长度
4 uint8_t servo_id 舵机ID 1
5 uint8_t data_id 舵机参数的ID 1
[6,6+ n -1] uint8_t[n] data 舵机参数的取值 n

6.1.3. <指令>用户自定义参数写入

指令ID 指令名称(EN) 指令名称(CN) 备注
4 WRITE_DATA 用户自定义参数写入 单个写入舵机参数
请求包内容格式
字节序号 数据类型 字段名称 字段功能描述 字节长度
4 uint8_t servo_id 舵机ID 1
5 uint8_t data_id 舵机参数的ID,定义参见舵机用户自定义参数列表 1
[6,6+n-1] uint8_t[n] data 舵机参数的取值 n
响应包内容格式
字节序号 数据类型 字段名称 字段功能描述 字节长度
4 uint8_t servo_id 舵机ID 1
5 uint8_t data_id 舵机参数的ID 1
6 uint8_t result 参数设置结果: (0写入失败, 1 写入成功) 1

6.2. 舵机只读参数

舵机只读参数是指用户只能读取不能写入的数值。只读参数包括舵机当前的电气状态,舵机工作状态以及舵机的自身信息。

6.2.1. 舵机只读参数列表

data_id 参数名称(en) 参数名称(cn) 字节类型 字节长度 单位 备注
1 voltage 舵机电压 uint16_t 2 mV
2 current 舵机电流 uint16_t 2 mA
3 power 舵机动率 uint16_t 2 mW
4 temprature 舵机温度 uint16_t 2 ADC
5 servo_status 舵机工作状态 uint8_t 1
6 servo_type 舵机型号 uint16_t 2
7 firmware_version 舵机固件版本 uint16_t 2
8 serial_number 舵机序列号 uint32_t 4

注意事项:

  1. 舵机序列号(serial_number)并不是舵机ID,它是舵机的唯一识别符。
  2. 部分字段会在后文做详细介绍。
  3. 温度输出值与实际温度需要做转换,如下为转换公式(本文其他有关温度值转换内容同如下)
NTC温度传感器参数 R_UP = 10000
上拉电阻值(接VCC侧) R25 = 10000
25℃标称电阻值 B = 3435
B值(热敏指数,单位K)
T0 = 273.15 绝对零度(单位:K)

Steinhart-Hart方程温度计算:
[正算] 已知目标温度To,求ADC值:Rt = R25 * math.exp(B * (1/(T0 + To) - 1/(T0 + 25))) adc_val = Rt * 4096 / (Rt + R_UP)
[反算] 已知ADC采样值,求实际温度: Rt = R_UP * adc_val / (4096 - adc_val) To = 1/(math.log(Rt/R25)/B + 1/(T0 + 25)) - T0
温度(℃) ADC 温度(℃) ADC 温度(℃) ADC
50 1191 60 941 70 741
51 1164 61 918 71 723
52 1137 62 897 72 706
53 1110 63 876 73 689
54 1085 64 855 74 673
55 1059 65 835 75 657
56 1034 66 815 76 642
57 1010 67 796 77 627
58 986 68 777 78 612
59 963 69 759 79 598
  • 以上为50-79℃ 温度/ADC参照表

6.2.2. <参数>舵机工作状态

data_id 参数名称(en) 参数名称(cn) 字节类型 字节长度 单位 备注
5 servo_status 舵机工作状态 uint8_t 1

6.3. 舵机用户自定义参数

6.3.1. 舵机用户自定义参数列表

data_id 参数名称(en) 参数名称(cn) 字节类型 字节长度 单位 备注
33 response_switch 指令响应开关 uint8_t 1 具体介绍
34 servo_id 舵机ID uint8_t 1 具体介绍
36 baudrate 波特率选项 uint8_t 1 具体介绍
37 stall_protect_mode 堵转保护开关 uint8_t 1 具体介绍
38 stall_power_limit 堵转功率上限 uint16_t 2 mW
39 over_volt_low 保护电压下限 uint16_t 2 mV
40 over_volt_high 保护电压上限 uint16_t 2 mV
41 over_temprature 保护温度 uint16_t 2 ADC
42 over_power 功率保护值 uint16_t 2 mW
43 over_current 电流保护值 uint16_t 2 mA
46 po_lock_switch 舵机上电锁力开关 uint8_t 1 具体介绍
48 angle_limit_switch 角度限制开关 uint8_t 1 具体介绍
49 soft_start_switch 上电缓启动开关 uint8_t 1 具体介绍
50 soft_start_time 上电缓启动时间 uint16_t 2 ms
51 angle_limit_high 舵机角度上限 int16_t 2 0.1度
52 angle_limit_low 舵机角度下限 int16_t 2 0.1度

注意事项:

  1. 舵机用户自定义参数列表里面的参数均可读可写。
  2. data_id 只是参数的ID号,并不是寄存器地址。
  3. 角度的单位是 0.1度 ,例如角度值90.5度,转换为0.1度的意思就是将角度原数值乘10,90.5 * 10 = 905
  4. 部分字段会在后文做详细介绍。
  5. 用户自定义区块的总的字节数为 32 ,批量读写指令操作的就是这部分数据。
  6. 推荐通过上位机软件进行用户参数设置。

6.3.2. <参数>响应开关

此项设置同时具备两个功能,用于控制在轮式模式与角度控制模式下,舵机指令是否可以中断(interruptable),以及是否产生反馈数据。

data_id 参数名称(en) 参数名称(cn) 字节类型 字节长度 单位 默认值
33 response_switch 响应开关 uint8_t 1 0x00
序号 模式
0x00 舵机控制指令执行可以被中断,新的指令覆盖旧的指令,无反馈数据。
0x01 舵机控制指令不可以被中断,指令执行结束之后发送反馈数据。

注意事项:

  1. 部分舵机指令,是否有返回数据是可选的。响应开关里面定义的是否有反馈数据指的就是这部分的指令。并不是所有的指令都没有反馈数据。
  2. 当设置为 0x01的时候,新的指令添加到等候队列里,等候队列的长度是1,需要自己在程序里面维护一个队列。当新的控制指令超出了缓冲区的大小后,新添加的指令被忽略。

6.3.3. <参数>舵机ID

舵机的ID号,取值范围是[0, 254]

data_id 参数名称(en) 参数名称(cn) 字节类型 字节长度 单位 默认值
34 servo_id 舵机ID uint8_t 1 0x00

注意事项:

  1. 舵机的ID号初始默认设置为 0
  2. 相同ID号的舵机不能串联在一起,串联的舵机每一个都需要独立分配ID。(注:相同ID的舵机串联可能会引起上位机卡死,使用时请注意。
  3. 可以通过舵机上位机修改舵机ID号,修改ID号的时候, 一次就连一个舵机。
  4. 0xFF=255 号为广播地址,不能赋值给舵机。

6.3.4. <参数>波特率选项

串口通讯的波特率选项,取值范围 [0x01,0x08]

data_id 参数名称(en) 参数名称(cn) 字节类型 字节长度 单位 默认值
36 baudrate 波特率选项 uint8_t 1 0x05
波特率选项 波特率
0x01 9600
0x02 19200
0x03 38400
0x04 57600
0x05 115200
0x06 250000
0x07 500000
0x08 1000000

注意事项:

  1. 波特率设置时即生效。
  2. 默认波特率为115200。
  3. 这里是波特率选项,而不是波特率的实际的数值。

6.3.5. <参数>舵机堵转保护开关

这里的舵机堵转保护开关指的是当发生舵机堵转时,用什么样的策略来应对。

data_id 参数名称(en) 参数名称(cn) 字节类型 字节长度 单位 默认值
37 stall_protect_mode 舵机堵转保护开关 uint8_t 1 0x00
序号 模式
0x00 将舵机功率降低到功率上限
0x01 释放舵机锁力(舵机卸力)

注意事项:

  1. 释放舵机锁力 的意思是,不再驱动舵机维持在一个特定的角度,此时可以自由转动舵机的主轴。

6.3.6. <参数>舵机上电锁力开关

data_id 参数名称(en) 参数名称(cn) 字节类型 字节长度 单位 默认值
46 po_lock_switch 舵机上电锁力开关 uint8_t 1 0x00
序号 模式
0x00 上电舵机释放锁力
0x01 上电舵机保持锁力

注意事项:

  1. 上电舵机保持锁力 的意思是,舵机上电时,读取舵机当前所在的角度,并让舵机维持在这一角度。
  2. 释放舵机锁力 的意思是,不再驱动舵机维持在一个特定的角度,此时可以自由转动舵机的主轴。

6.3.7. <参数>角度限制开关

只有打开角度限制开关,舵机角度限制相关的参数才会有效。

data_id 参数名称(en) 参数名称(cn) 字节类型 字节长度 单位 默认值
48 angle_limit_switch 角度限制开关 uint8_t 1 0x01
序号 模式
0x00 关闭角度限制
0x01 开启角度限制

注意事项:

建议在主控上做舵机角度约束。

6.3.8. <参数>上电缓启动开关

舵机在刚开始上电时,执行第一个角度控制指令时,选择是否开启缓慢执行模式。

举例来讲,机械臂刚开始上电时,需要旋转到初始位置,假如原先设定的执行周期是 100ms,开启这个模式之后,执行周期会被修改为 上电首次执行时间

data_id 参数名称(en) 参数名称(cn) 字节类型 字节长度 单位 默认值
49 soft_start_switch 上电缓启动开关 uint8_t 1 0x00
序号 模式
0x00 关闭上电缓启动
0x01 开启上电缓启动

7. 单圈角度控制

7.1. <指令>设置舵机角度

指令ID 指令名称(EN) 指令名称(CN) 备注
8 MOVE_ON_ANGLE_MODE(ROTATE) 设置舵机角度 设置舵机旋转的目标角度与时间间隔

7.1.1 请求包内容格式

字节序号 数据类型 字段名称 字段功能描述 字节长度
4 uint8_t servo_id 舵机ID 1
[5,6] int16_t angle 舵机角度,数值正负代表方向( 单位0.1度,举例 angle=900 就等于90度) 2
[7,8] uint16_t interval 到达目标角度的时间 (单位ms) 2
[9,10] uint16_t power 执行功率(单位mW) 如果power=0或者大于功率保持值,按照功率保持值操作 2

7.1.2 响应包内容格式(可选)

字节序号 数据类型 字段名称 字段功能描述 字节长度
4 uint8_t servo_id 舵机ID 1
5 uint8_t result 设置结果(0:失败,1:成功) 1

注意事项:

  1. 默认没有响应包,只有打开 响应开关 的时候,才会有响应包。
  2. 打开 响应开关 后,舵机在旋转到目标角度后,才会发送响应包。
  3. 在通讯时,字节顺序使用的是 小端字节序 。要注意两个字节的数据,例如角度 angle = 900 = 0x0384,在发送时就变成了 0x84 0x03

7.1.3数据包示例

设置2号舵机在500ms内,旋转到90度

请求数据包

0x12 0x4c 0x08 0x07 0x02 0x84 0x03 0xf4 0x01 0x00 0x00 0xeb
  • 角度模式控制-设置舵机角度的指令 cmd_id = 0x08
  • 舵机ID servo_id = 2 = 0x02
  • 舵机的目标角度为90度,但是 angle的单位是 0.1度,所以 angle = 900= 0x84 0x03
  • 时间间隔 interval=500 = 0xf4 0x01
  • 执行功率一般设置为0 power=0x00 0x00
  • 字节长度 n= 1+2+2+2 = 7 = 0x07
  • 校验和 checksum= (0x12 + 0x4c + 0x08 + 0x07 + 0x02 + 0x84 + 0x03 + 0x0F4 + 0x01 + 0x00 + 0x00)%256 = 235 =0xEB

7.2. <指令>单圈角度读取

指令ID 指令名称(EN) 指令名称(CN) 备注
10 READ_ANGLE 读取舵机角度

7.2.1. 请求包内容格式

字节序号 数据类型 字段名称 字段功能描述 字节长度
4 uint8_t servo_id 舵机ID 1

7.2.2. 响应包内容格式

字节序号 数据类型 字段名称 字段功能描述 字节长度
4 uint8_t servo_id 舵机ID 1
[5,6] int16_t angle 舵机角度,数值正负代表方向( 单位0.1度,举例 angle=900 就等于90度) 2

7.2.3. 数据包示例

查询舵机 0x00 的角度

请求数据包

0x12 0x4c 0x0a 0x01 0x00 0x69

响应数据包

0x05 0x1c 0x0a 0x03 0x00 0x86 0x03 0xb7

0x86 0x03是当前的舵机角度,解包后是902,转换为角度制就是90.2度。

7.3. <指令>舵机角度控制-指定时间

指令ID 指令名称(EN) 指令名称(CN) 备注
11 MOVE_ON_ANGLE_MODE_EX_BY_INTERVAL 舵机角度控制-指定时间

7.3.1 请求包内容格式

字节序号 数据类型 字段名称 字段功能描述 字节长度
4 uint8_t servo_id 舵机ID 1
[5,6] int16_t angle 舵机角度,数值正负代表方向( 单位0.1度,举例 angle=900 就等于90度) 2
[7,8] uint16_t interval 到达目标角度的时间 (单位ms) 2
[9,10] uint16_t accInterval 单位:ms,启动时加速段的时间 2
[11,12] uint16_t decInterval 单位:ms,运动到接近目标的减速段时间 2
[13,14] uint16_t power 执行功率(单位mW) 如果power=0或者大于功率保持值,按照功率保持值操作 2

7.3.2 响应包内容格式(可选)

字节序号 数据类型 字段名称 字段功能描述 字节长度
4 uint8_t servo_id 舵机ID 1
5 uint8_t result 设置结果(0:失败,1:成功) 1

7.3.3 数据包示例

设置0号舵机 600ms旋转到90度,其中加速时间 100ms,减速时间 100ms

请求数据包

0x12 0x4c 0x0b 0x0b 0x00 0x84 0x03 0x58 0x02 0x64 0x00 0x64 0x00 0x00 0x00 0x1d
  • 角度模式控制-舵机角度控制-指定时间 cmd_id = 0x0b
  • 舵机ID servo_id = 0 = 0x00
  • 舵机的目标角度为90度,但是 angle的单位是 0.1度,所以 angle = 900= 0x84 0x03
  • 时间间隔 interval= 600 = 0x58 0x02
  • 加速段的时间 accInterval = 100 = 0x64 0x00
  • 减速段时间的时间 decInterval = 100 = 0x64 0x00
  • 执行功率一般设置为0 power=0x00 0x00
  • 字节长度 n = 1+2+2+2+2+2 = 11 = 0x0b
  • 校验和 checksum = (0x12 + 0x4c + 0x0b + 0x0b + 0x00 + 0x84 + 0x03 + 0x58 + 0x02 + 0x64 + 0x00 + 0x64 + 0x00 + 0x00 + 0x00)%256 = 29 = 0x1d

7.4. <指令>舵机角度控制-指定速度

指令ID 指令名称(EN) 指令名称(CN) 备注
12 MOVE_ON_ANGLE_MODE_EX_BY_VELOCITY 舵机角度控制-指定速度

7.4.1 请求包内容格式

字节序号 数据类型 字段名称 字段功能描述 字节长度
4 uint8_t servo_id 舵机ID 1
[5,6] int16_t angle 舵机角度,数值正负代表方向( 单位0.1度,举例 angle=900 就等于90度) 2
[7,8] uint16_t targetVelocity 目标速度 2
[9,10] uint16_t accInterval 单位:ms,启动时加速段的时间 2
[11,12] uint16_t decInterval 单位:ms,运动到接近目标的减速段时间 2
[13,14] uint16_t power 执行功率(单位mW) 2

7.4.2 响应包内容格式(可选)

字节序号 数据类型 字段名称 字段功能描述 字节长度
4 uint8_t servo_id 舵机ID 1
5 uint8_t result 设置结果(0:失败,1:成功) 1

7.4.3. 数据包示例

设置0号舵机以目标速度200°/s旋转到90度,其中加速时间100ms,减速时间100ms

请求数据包

0x12 0x4c 0x0c 0x0b 0x00 0x84 0x03 0xd0 0x07 0x64 0x00 0x64 0x00 0x00 0x00 0x9b
  • 角度模式控制-舵机角度控制-指定时间 cmd_id = 0x0c
  • 舵机ID servo_id = 0 = 0x00
  • 舵机的目标角度为90度,但是 angle的单位是 0.1度,所以 angle = 900= 0x84 0x03
  • 目标速度,单位是 0.1°/s,所以 targetVelocity = 2000 = 0xd0 0x07
  • 加速段的时间 accInterval = 100 = 0x64 0x00
  • 减速段时间的时间 decInterval = 100 = 0x64 0x00
  • 执行功率一般设置为0 power=0x00 0x00
  • 字节长度 n = 1+2+2+2+2+2 = 11 = 0x0b
  • 校验和 checksum = (0x12 + 0x4c + 0x0c + 0x0b + 0x00 + 0x84 + 0x03 + 0xd0 + 0x07 + 0x64 + 0x00 + 0x64 + 0x00 + 0x00 + 0x00)%256 = 155 = 0x9b

8. 阻尼模式

8.1. <指令> 阻尼模式控制

指令ID 指令名称(EN) 指令名称(CN) 备注
9 MOVE_ON_DAMPING_MODE(DAMPING) 阻尼模式控制 阻尼模式,设置舵机保持的功率

8.1.1. 请求包内容格式

字节序号 数据类型 字段名称 字段功能描述 字节长度
4 uint8_t servo_id 舵机ID 1
[5,6] uint16_t power 执行功率(单位mW) 2

servo_id

如果设置 servo_id = 0xFF (广播地址) ,则所有的舵机都会被设置为阻尼模式。

power

如果保持功率 power设置为0,或者大于功率上限,则按照功率上限处理。

功率上限的设定请参阅 舵机用户自定义参数列表

8.1.2. 响应包内容格式(可选)

字节序号 数据类型 字段名称 字段功能描述 字节长度
4 uint8_t servo_id 舵机ID 1
5 uint8_t result 设置结果(0:失败,1:成功) 1

注意事项:

  1. 默认没有响应包,只有打开 响应开关 的时候,才会有响应包。
  2. 打开 响应开关 后,舵机在旋转到目标角度之后,才会发送响应包。

8.1.3. 数据包示例

设置0号舵机的阻尼模式的保持功率为500mW

请求数据包

0x12 0x4c 0x09 0x03 0x00 0xf4 0x01 0x5f 

9. 多圈角度控制

注:仅适用于磁编码舵机

9.1. <指令>设置舵机角度

指令ID 指令名称(EN) 指令名称(CN) 备注
13 MOVE_ON_MULTI_TURN_ANGLE_MODE(ROTATE) 多圈角度模式控制-设置舵机角度

9.1.1 请求包内容格式

字节序号 数据类型 字段名称 字段功能描述 字节长度
4 uint8_t servo_id 舵机ID 1
[5,8] int16_t angle 舵机角度,数值正负代表方向(单位0.1度),数值范围:-3686400~3686400 4
[9,12] uint16_t interval 到达目标角度的时间 (单位ms),最大值为 4096000 4
[13,14] uint16_t power 执行功率(单位mW), 如果power=0或者大于功率保持值,按照功率保持值操作 2

9.1.2 响应包内容格式(可选)

字节序号 数据类型 字段名称 字段功能描述 字节长度
4 uint8_t servo_id 舵机ID 1
5 uint8_t result 设置结果(0:失败,1:成功) 1

9.1.3 数据包示例

设置0号舵机在5000ms内,旋转到400度

请求数据包

0x12 0x4c 0x0d 0x0b 0x00 0xa0 0x0f 0x00 0x00 0x88 0x13 0x00 0x00 0x00 0x00 0xc0
  • 角度模式控制-设置舵机角度的指令 cmd_id = 0x0d
  • 舵机ID servo_id = 0 = 0x00
  • 舵机的目标角度为400度,但是 angle的单位是 0.1度,所以 angle = 4000= 0xa0 0x0f 0x00 0x00
  • 时间间隔 interval=5000 = 0x88 0x13 0x00 0x00
  • 执行功率一般设置为0 power = 0x00 0x00
  • 字节长度 n= 1 + 4 + 4 + 2 = 11 = 0x0b
  • 校验和 checksum= (0x12 + 0x4c + 0x0d + 0x0b + 0x00 + 0xa0 + 0x0f + 0x00 + 0x00 + 0x88 + 0x13 + 0x00 + 0x00 0x00 + 0x00)%256 = 192 =0xc0

9.2. <指令>多圈角度控制-指定时间

指令ID 指令名称(EN) 指令名称(CN) 备注
14 MOVE_ON_MULTI_TURN_ANGLE_MODE_EX_BY_INTERVAL 多圈角度控制-指定时间

9.2.1 请求包内容格式

字节序号 数据类型 字段名称 字段功能描述 字节长度
4 uint8_t servo_id 舵机ID 1
[5,8] int16_t angle 舵机角度,数值范围:-3686400~3686400 4
[9,12] uint16_t interval 到达目标角度的时间 (单位ms),最大值为 4096000 4
[12,13] uint16_t accInterval 单位:ms,启动时加速段的时间 2
[14,15] uint16_t decInterval 单位:ms,运动到接近目标的减速段时间 2
[13,14] uint16_t power 执行功率(单位mW) 2

9.2.2 响应包内容格式(可选)

字节序号 数据类型 字段名称 字段功能描述 字节长度
4 uint8_t servo_id 舵机ID 1
5 uint8_t result 设置结果(0:失败,1:成功) 1

9.2.3. 数据包示例

设置0号舵机1200ms旋转到600度,其中加速时间100ms,减速时间100ms

请求数据包

0x12 0x4c 0x0e 0x0f 0x00 0x70 0x17 0x00 0x00 0xb0 0x04 0x00 0x00 0x64 0x00 0x64 0x00 0x00 0x00 0x7e
  • 多圈角度控制-指定时间 cmd_id = 0x0e
  • 舵机ID servo_id = 0 = 0x00
  • 舵机的目标角度为600度,但是 angle的单位是 0.1度,所以 angle = 6000= 0x70 0x17 0x00 0x00
  • 时间间隔 interval= 1200 = 0xb0 0x04 0x00 0x00
  • 加速段的时间 accInterval = 100 = 0x64 0x00
  • 减速段时间的时间 decInterval = 100 = 0x64 0x00
  • 执行功率一般设置为0 power=0x00 0x00
  • 字节长度 n = 1+4+4+2+2+2 = 15 = 0x0f
  • 校验和 checksum = (0x12 + 0x4c + 0x0e + 0x0f + 0x00 + 0x70 + 0x17 + 0x00 + 0x00 + 0xb0 + 0x04 + 0x00 + 0x00 + 0x64 + 0x00 + 0x64 + 0x00 + 0x00 + 0x00)%256 = 126 = 0x7e

9.3. <指令>多圈角度控制-指定速度

指令ID 指令名称(EN) 指令名称(CN) 备注
15 MOVE_ON_MULTI_TURN_ANGLE_MODE_EX_BY_VELOCITY 多圈角度控制-指定速度

9.3.1 请求包内容格式

字节序号 数据类型 字段名称 字段功能描述 字节长度
4 uint8_t servo_id 舵机ID 1
[5,8] int16_t angle 舵机角度,数值范围:-3686400~3686400 4
[9,10] uint16_t targetVelocity 目标速度 2
[11,12] uint16_t accInterval 单位:ms,启动时加速段的时间 2
[13,14] uint16_t decInterval 单位:ms,运动到接近目标的减速段时间 2
[15,16] uint16_t power 执行功率(单位mW) 2

9.3.2 响应包内容格式(可选)

字节序号 数据类型 字段名称 字段功能描述 字节长度
4 uint8_t servo_id 舵机ID 1
5 uint8_t result 设置结果(0:失败,1:成功) 1

9.3.3. 数据包示例

设置0号舵机以目标速度200°/s旋转到600度,其中加速时间100ms,减速时间100ms

请求数据包

0x12 0x4c 0x0f 0x0d 0x00 0x70 0x17 0x00 0x00 0xd0 0x07 0x64 0x00 0x64 0x00 0x00 0x00 0xa0
  • 多圈角度控制-指定时间 cmd_id = 0x0f
  • 舵机ID servo_id = 0 = 0x00
  • 舵机的目标角度为600度,但是 angle的单位是 0.1度,所以 angle = 6000= 0x70 0x17 0x00 0x00
  • 目标速度,单位是 0.1°/s,所以 targetVelocity = 2000 = 0xd0 0x07
  • 加速段的时间 accInterval = 100 = 0x64 0x00
  • 减速段时间的时间 decInterval = 100 = 0x64 0x00
  • 执行功率一般设置为0 power=0x00 0x00
  • 字节长度 n = 1+4+2+2+2+2 = 13 = 0x0d
  • 校验和 checksum = (0x12 + 0x4c + 0x0f + 0x0d + 0x00 + 0x70 + 0x17 + 0x00 + 0x00 + 0xd0 + 0x07 + 0x64 + 0x00 + 0x64 + 0x00 + 0x00 + 0x00)%256 = 160 = 0xa0

9.4. <指令>多圈角度读取

指令ID 指令名称(EN) 指令名称(CN) 备注
16 READ_MULTI_TURN_ANGLE 读取多圈角度

9.4.1. 请求包内容格式

字节序号 数据类型 字段名称 字段功能描述 字节长度
4 uint8_t servo_id 舵机ID 1

9.4.2. 响应包内容格式

字节序号 数据类型 字段名称 字段功能描述 字节长度
4 uint8_t servo_id 舵机ID 1
[5,8] int16_t angle 舵机角度,数值正负代表方向( 单位0.1度,举例 angle=900 就等于90度) 4
[9,10] uint16_t turn 转动圈数 2

9.4.3. 数据包示例

查询舵机 0x00 的角度

请求数据包

0x12 0x4c 0x10 0x01 0x00 0x6f

响应数据包

0x05 0x1c 0x10 0x07 0x00 0x23 0x13 0x00 0x00 0x01 0x00 0x6f 

0x23 0x13 0x00 0x00是当前的舵机角度,解包后是4899,转换为角度制就是489.9度。

0x01 0x00是当前圈数,解包后是1,即为1圈。

9.5. <指令>清除当前圈数

指令ID 指令名称(EN) 指令名称(CN) 备注
17 RESET_MULTI_TURN_ANGLE 清除当前圈数

9.5.1 请求包内容格式

字节序号 数据类型 字段名称 字段功能描述 字节长度
4 uint8_t servo_id 舵机ID 1

9.5.2 响应包内容格式(可选)

字节序号 数据类型 字段名称 字段功能描述 字节长度
4 uint8_t servo_id 舵机ID 1
5 uint8_t result 设置结果(0:失败,1:成功) 1

注意事项:

重设多圈命令必须在舵机释放状态有效(即不在角度控制下)。

9.5.3. 数据包示例

重设0号舵机圈数

请求数据包

0x12 0x4c 0x11 0x01 0x00 0x70
  • 重设多圈角度 cmd_id = 0x11
  • 舵机ID servo_id = 0 = 0x00
  • 字节长度 n = 1 = 0x01
  • 校验和 checksum = (0x12 + 0x4c + 0x11 + 0x01 + 0x00)%256 = 112 = 0x70

10. 异步指令

10.1. <指令>异步写入指令

注:仅适用于无刷磁编码舵机V316及之后的版本

本指令发送后,在线的舵机将对下一个收到的指令进行缓存;收到 异步执行指令 后,立即执行。详细规则如下:

  1. 对在线所有舵机生效,接收本指令后开启缓存区。
  2. 可缓存指令如下:
数据包编号 数据包命名 功能
8 MoveOnAngleMode(Rotate) 角度模式控制
11 MoveOnAngleModeExByInterval 角度模式控制(基于加减速时间)
12 MoveOnAngleModeExByVelocity 角度模式控制(基于目标速度)
13 MoveOnMultiTurnAngleMode(Rotate) 多圈角度模式控制
14 MoveOnMultiTurnAngleModeExByInterval 多圈角度模式控制(基于加减速时间)
15 MoveOnMultiTurnAngleModeExByVelocity 多圈角度模式控制(基于目标速度)
  1. 缓冲区仅允许暂存 单条指令 ,在收到 异步执行指令 终止异步操作指令前,若接收到其他指令,将作为常规指令立即执行。
  2. 舵机接收 异步执行指令 后,立即执行缓冲区内指令并清空缓冲区。
  3. 若缓存区为空,则仅关闭缓存区,无其他动作。若缓冲区处于空闲状态,仅执行缓冲区关闭操作,不触发其他行为。
  4. 若参数 cancel非零 时,强制清空缓冲区且不执行指令,同时关闭缓冲区功能。
  5. 异步操作过程中发生断电,重新上电后缓冲区存储内容自动失效。
指令ID 指令名称(EN) 指令名称(CN) 备注
18 BeginAsync 异步写入指令

10.1.1. 请求包内容格式

字节序号 数据类型 字段名称 字段功能描述 字节长度
uint8_t 0

10.1.2. 响应包内容格式

10.2. <指令>异步执行指令

注:仅适用于无刷磁编码舵机V316及之后的版本

指令ID 指令名称(EN) 指令名称(CN) 备注
19 EndAsync 异步执行指令

10.2.1. 请求包内容格式

字节序号 数据类型 字段名称 字段功能描述 字节长度
4 uint8_t cancel 0:执行;1:取消 1

10.2.2. 响应包内容格式

10.2.4. 数据包示例

异步写入数据包(固定)

0x12 0x4c 0x12 0x00 0x70

请求数据包 例:2号舵机500ms旋转到90度

0x12 0x4c 0x08 0x07 0x02 0x84 0x03 0xf4 0x01 0x00 0x00 0xeb

异步执行数据包(固定)收到这条指令立刻执行请求数据包

0x12 0x4c 0x13 0x01 0x00 0x72

11. 数据监控

注:仅适用于无刷磁编码舵机V316及之后的版本

11.1. <指令>数据监控

指令ID 指令名称(EN) 指令名称(CN) 备注
22 ServoMonitor 数据监控

11.1.1. 请求包内容格式

字节序号 数据类型 字段名称 字段功能描述 字节长度
4 uint8_t servo_id 舵机ID (0xff为在线所有舵机) 1

11.1.2. 响应包内容格式

字节序号 数据类型 字段名称 字段功能描述 字节长度
4 uint8_t servo_id 舵机ID 1
[5,6] uint16_t voltage 舵机电压 2
[7,8] uint16_t current 舵机电流 2
[9,10] uint16_t power 舵机功率 2
[11,12] uint16_t temperature 舵机温度 2
13 uint8_t status 舵机状态 1
[14,17] int32_t angle 舵机角度,单位:0.1度 4
[18,19] int16_t turns 圈数 2

11.1.3. 数据包示例

请求数据包 例:获取0号舵机数据

0x12 0x4c 0x16 0x01 0x00 0x75

响应包

0x05 0x1c 0x16 0x10 0x00 0x83 0x1e 0x1e 0x00 0xea 0x00 0x2c 0x07 0x01 0xaf 0x0b 0x00 0x00 0x00 0x00 0xde
  • ID: 0x00 = 0
  • 电压:0x1E 0x83 = 7811 mV
  • 电流:0x00 0x1E = 30 mA
  • 功率:0x00 0xEA = 234 mW
  • 温度:0x07 0x2C = 1836 adc值
  • 状态:0x01 = 1
  • 角度:0x00 0x00 0x0B 0xAF = 2991 299.1度
  • 圈数:0x00 0x00 = 0

12. 原点设置

注:仅适用于无刷磁编码舵机V311及之后的版本

12.1. <指令>设置当前角度位置为原点

指令ID 指令名称(EN) 指令名称(CN) 备注
23 SetOriginPoint 设置当前舵机角度为原点

12.1.1. 请求包内容格式

字节序号 数据类型 字段名称 字段功能描述 字节长度
4 uint8_t servo_id 舵机ID 1
5 uint8_t reset 预设值,默认为0 1

12.1.2. 响应包内容格式

字节序号 数据类型 字段名称 字段功能描述 字节长度
4 uint8_t servo_id 舵机ID 1
5 uint8_t result 设置结果(0:失败,1:成功) 1

注意事项:

原点设置命令必须在舵机释放状态有效(即不在角度控制下)。

12.1.3. 数据包示例

设置1号舵机当前角度为原点

请求数据包

0x12 0x4c 0x17 0x02 0x01 0x00 0x78
  • 设置当前舵机角度为原点 cmd_id = 0x17
  • 字节长度 n = 1+1 = 0x02
  • 舵机ID servo_id = 1 = 0x01
  • 预设值 reset = 0 = 0x00
  • 校验和 checksum = (0x12 + 0x4c + 0x17 + 0x02 + 0x01 + 0x00)%256 = 120 = 0x78

13. 停止指令

仅适用于无刷磁编码舵机V316及之后的版本

13.1. <指令>停止指令

指令ID 指令名称(EN) 指令名称(CN) 备注
24 StopOnControlMode 停止指令

13.1.1 请求包内容格式

字节序号 数据类型 字段名称 字段功能描述 字节长度
4 uint8_t servo_id 舵机ID 1
5 uint8_t method 停止指令执行方式。
0x10-停止后卸力(失锁)
0x11-停止后保持锁力
0x12-停止后进入阻尼状态。
1
[6,7] uint16_t power 扭矩开关后功率单位:mW,
如果为0或大于功率保护值,
则按功率保护值操作。
2

13.1.2 响应包内容格式(可选)

字节序号 数据类型 字段名称 字段功能描述 字节长度
4 uint8_t servo_id 舵机ID 1
5 uint8_t result 设置结果(0:失败,1:成功) 1

注意事项:

默认没有响应包,只有打开 响应开关 的时候,才会有响应包。

13.1.3数据包示例

设置1号舵机停止后保持锁力 功率6000mW

请求数据包

0x12 0x4c 0x18 0x04 0x01 0x11 0x70 0x17 0x10

14. 同步指令

仅适用于无刷磁编码舵机V316及之后的版本

一条指令控制所有舵机动作,每个舵机执行自己对应ID的内容。

14.1. <指令>同步指令

指令ID 指令名称(EN) 指令名称(CN) 备注
25 SyncCommand 同步命令

14.1.1 请求包内容格式

字节序号 数据类型 字段名称 字段功能描述 字节长度
4 uint8_t id 命令编号 1
5 uint8_t length 命令内容长度%d 1
6 uint8_t count 舵机个数%n 1
[7,%n * %d+6] 资料区块 data 命令内容 %d*%n

支持的命令编号

命令编号。需要是有效指令,禁止在指令体中包含相同指令ID。

数据包编号 数据包命名 功能
8 MoveOnAngleMode(Rotate) 角度模式
11 MoveOnAngleModeExByInterval 角度模式(基于加减速时间)
12 MoveOnAngleModeExByVelocity 角度模式(基于目标速度)
13 MoveOnMultiTurnAngleMode(Rotate) 多圈角度控制
14 MoveOnMultiTurnAngleModeExByInterval 多圈角度控制(基于加减速时间)
15 MoveOnMultiTurnAngleModeExByVelocity 多圈角度控制(基于目标速度)
22 ServoMonitor 舵机数据监控

14.1.2 响应包内容格式

14.1.3数据包示例

请求数据包

0x12 0x4c 0x19 0x17 0x08 0x07 0x02 0x01 0x2c 0x01 0xe8 0x03 0x00 0x00 0x02 0x58 0x02 0xd0 0x07 0x00 0x00  0xE5
  • 内容长度:17
  • 舵机数据监命令ID:8
  • 舵机数据监命令长度:7
  • 舵机总数:02
  • 舵机1,舵机2 指令 :

01 2C 01 E8 03 00 00 ==> ID1 (0x01),角度 (300 , 0x012C) , 时间 (1000 , 0x03E8) , 功率( 0 , 0x0000) 

02 58 02 D0 07 00 00 ==> ID2 (0x02),角度 (600 , 0x0258) , 时间 (2000 , 0x07D0) , 功率( 0 , 0x0000) 
- 校验和 : E5