跳到主要内容

舵机通信协议

1. 通信协议概要

根据舵机型号的不同,通信接口分别采用兼容高速通信的 TTL 电平方式或具有较强抗干扰能力的 RS485 通信方式。其中,SC 系列、ST 系列和 CF35-12 舵机采用 TTL 通信方式,RSBL 系列舵机采用 RS485 通信方式。通讯采用异步双工,发送与接收信号是异步处理。

控制器和舵机之间采用问答方式通信,控制器发出指令帧,舵机返回应答帧。

一个总线控制网络中允许有多个舵机,所以每个舵机都分配有一个网络内唯一的 ID 号。控制器发出的控制指令中包含 ID 信息,只有匹配上 ID 号的舵机才能完整接收这条指令,并返回应答信息。

通信方式为串行异步方式,一帧数据分为 1 位起始位,8 位数据位和 1 位停止位,无奇偶校验位,共 10 位。

内存表的部分参数采用两个字节的值域时,两个字节顺序根据舵机型号区分,电位器类型舵机为大端格式(高字节在前低字节在后),磁编码类型舵机为小端格式(低字节在前高字节在后)。ST 系列、RSBL 系列 和 CF35-12 舵机属于磁编码类型舵机,SC 系列舵机属于电位器类型舵机。每款舵机因功能略有不同,因此实际控制时请参照具体型号的内存表为准。

2. 指令帧

字头ID 号数据长度指令参数校验和
0xFF 0xFFIDLengthInstructionParameter1 ...Parameter NCheck Sum
  • 字头:连续收到两个 0xFF,表示有数据包到达。
  • ID 号:每个舵机都有一个 ID 号。ID 号范围 0~253,转换为十六进制 0x00~0xFD
  • 广播 ID:ID 号 254 为广播 ID,若控制器发出的 ID 号为 254(0xFE),所有的舵机均接收指令,除 PING 指令外其它指令均不返回应答信息(多个舵机连接在总线上不能使用广播 PING 指令)。
  • 数据长度:等于待发送的参数 N 加上 2,即“N+2”。
  • 指令:数据包操作功能码,详见 4 指令类型。
  • 参数:除指令另外需要补充的控制信息,参数最大支持双字节参数表示一个内存值,字节顺序参考通信协议概要(不同型号舵机字节顺序不一样)。
  • 校验和:校验和 Check Sum,计算方法如下:
    Check Sum = ~ (ID + Length + Instruction + Parameter1 + ... Parameter N) 若括号内的计算和超出 255,则取最低的一个字节,“~”表示取反。

3. 应答帧

字头ID 号数据长度状态码参数校验和
0xFF 0xFFIDLengthERRORParameter1 ...Parameter NCheck Sum

返回的应答帧包含舵机的当前状态 ERROR,若舵机当前工作状态不正常,会通过这个字节反映出来(各状态所代表意义详见内存表解析),若 ERROR 为 0,则舵机无报错信息。

4. 指令类型

指令功能参数长度
PING(查询)查询工作状态0x010
READ DATA(读)查询控制表里的数据0x022
WRITE DATA(写)往控制表里写入数据0x03不小于 2
REGWRITE DATA(异步写)类似于 WRITE DATA,但是控制字符写入后并不马上动作,直到 ACTION 指令到达0x04不小于 4
ACTION(执行异步写)触发 REG WRITE 写入的动作0x050
SYCNREAD DATA(同步读)用于同时查询多个舵机0x82不小于 3
SYCNWRITE DATA(同步写)用于同时控制多个舵机0x83不小于 2
RESET(状态重置)重置舵机状态(重置舵机圈数)0x0A0
注意

以下示例均以 ST 系列舵机为例,不同系列舵机的参数地址可能存在差异,请以对应型号的舵机内存表为准。

4.1 查询状态指令 PING

功能:读取舵机的工作状态
长度:0x02
指令:0x01
参数:无

PING 指令使用广播地址,舵机同样返回应答信息。

例 1:读取 ID 号为 1 的舵机的工作状态。
指令帧:FF FF 01 02 01 FB(按十六进制发送)

字头ID长度指令校验和
0xFF 0xFF0x010x020x010xFB

应答帧:FF FF 01 02 00 FC(十六进制显示)

字头ID长度状态校验和
0xFF 0xFF0x010x020x000xFC

4.2 读指令 READ DATA

功能:从舵机内存控制表里读出数据
长度:0x04
指令:0x02
参数 1:数据读出段的首地址
参数 2:读取数据的长度

例 2:读取 ID 为 1 的舵机的当前位置(低位字节在前,高位字节在后)。位置参数内存表地址为 0x38,连续二个字节。

指令帧:FF FF 01 04 02 38 02 BE(按十六进制发送)

字头ID长度指令参数校验和
0xFF 0xFF0x010x040x020x38 0x02(当前位置地址 读数据长度)0xBE

应答帧:FF FF 01 04 00 18 05 DD(十六进制显示)

字头ID长度状态参数校验和
0xFF 0xFF0x010x040x000x18 0x050xDD

读出两个字节数据分别是(小端结构):低位字节 L 0x18 高位字节 H 0x05,两个字节合成 16 位数据 0x0518,用十进制表示当前位置为 1304。

信息

如果是 SC 系列舵机,读出的两个字节数据为大端结构,高字节在前,低字节在后。

4.3 写指令 WRITE DATA

功能:写数据到舵机内存控制表
长度:N+2(N 为参数长度)
指令:0x03
参数 1:数据写入段的首地址
参数 2:写入第 1 个数据
参数 3:写入第 2 个数据
...
参数 N:写入第 n 个数据,N=n+1

例 3:使用广播 ID(0xFE)把任意编号舵机的 ID 设置为 1。在内存表里保存 ID 号的地址为 5。
指令帧:FF FF FE 04 03 05 01 F4(按十六进制发送)

字头ID长度指令参数校验和
0xFF 0xFF0x010x040x030x05 0x01(ID 地址 新 ID 值)0xF4

因为采用广播 ID 发送指令,所以不会有数据返回。另外内存表 EPROM 具有保护锁开关,修改 ID 前需要把它关掉(置 0),不然示例 ID 号掉电将不保存。详细操作请查阅具体舵机型号的内存表或操作手册。

例 4:控制 ID1 舵机以 1000 步/秒的速度转动到 2048 的位置。内存表目标位置的首地址为 0x2A,所以在地址 0x2A 处开始写入连续六个字节数据。

位置数据 0x0800 (2048)
预留数据 0x0000 (0)
速度数据 0x03E8 (1000)

指令帧:FF FF 01 09 03 2A 00 08 00 00 E8 03 D5(按十六进制发送)

字头ID长度指令参数校验和
0xFF 0xFF0x010x090x030x2A(首地址)0x00 0x08(位置)0x00 0x00(预留)0xE8 0x03(速度)0xD5

应答帧:FF FF 01 02 00 FC(十六进制显示)

字头ID长度状态校验和
0xFF 0xFF0x010x020x000xFC

返回工作状态为 0,表示舵机正确无错接收到指令并已开始执行。发送指令包的 ID 使用非广播 ID(0xFE),所以指令接收完成后舵机将返回状态包。

4.4 异步写指令 REG WRITE

REG WRITE 指令相似于 WRITE DATA,只是执行的时间不同。当收到 REG WRITE 指令帧时,把收到的数据储存在缓冲区备用,并把异步写标志寄存器置 1。当收到 ACTION 指令后,储存的指令最终被执行。

长度:N+2(N 为参数长度)
指令:0x04
参数 1:数据要写入区的首地址
参数 2:写入的第 1 个数据
参数 3:写入的第 2 个数据
参数 N:写入的第 n 个数据,N=n+1

例 5:控制 ID1 到 ID10 舵机以 1000 每秒的速度转动到 2048 的位置。

ID异步写指令帧应答帧
ID 1FF FF 01 09 04 2A 00 08 00 00 E8 03 D4FF FF 01 02 00 FC
ID 2FF FF 02 09 04 2A 00 08 00 00 E8 03 D3FF FF 02 02 00 FA
ID 3FF FF 03 09 04 2A 00 08 00 00 E8 03 D2FF FF 03 02 00 FA
ID 4FF FF 04 09 04 2A 00 08 00 00 E8 03 D1FF FF 04 02 00 F9
ID 5FF FF 05 09 04 2A 00 08 00 00 E8 03 D0FF FF 05 02 00 F8
ID 6FF FF 06 09 04 2A 00 08 00 00 E8 03 CFFF FF 06 02 00 F7
ID 7FF FF 07 09 04 2A 00 08 00 00 E8 03 CEFF FF 07 02 00 F6
ID 8FF FF 08 09 04 2A 00 08 00 00 E8 03 CDFF FF 08 02 00 F5
ID 9FF FF 09 09 04 2A 00 08 00 00 E8 03 CCFF FF 09 02 00 F4
ID10FF FF 0A 09 04 2A 00 08 00 00 E8 03 CBFF FF 0A 02 00 F3

4.5 执行异步写指令 ACTION

功能:触发 REG WRITE 指令
长度:0x02
指令:0x05
参数:无

  1. ACTION 指令在同时控制多个舵机时非常有用。
  2. 在控制多个舵机时,使用 ACTION 指令可以使第一个和最后一个舵机同时执行各自的动作,中间无延时。
  3. 对多个舵机发送 ACTION 指令时,要用到广播 ID(0xFE)因此,发送此指令不会有数据帧返回。

例 6:控制 ID1 到 ID10 舵机以 1000 每秒的速度转动到 2048 的位置的异步写指令发完后,需要执行异步写指令。


指令帧:FF FF FE 02 05 FA
应答帧:无

4.6 同步写指令 SYNC WRITE

功能:用于同时控制多个舵机。
ID:0xFE
长度:(L+1)*n+4(L:发给每个舵机的数据长度,n:舵机的个数)
指令:0x83
参数 1:写入数据的首地址
参数 2:写入的数据的长度 (L)
参数 3:第 1 个舵机的 ID 号
参数 4:写入第 1 个舵机的第 1 个数据
参数 5:写入第 1 个舵机的第 2 个数据
...
参数 L+3:写入第 1 个舵机的第 L 个数据
参数 L+4:第 2 个舵机的 ID 号
参数 L+5:写入第 2 个舵机的第 1 个数据
参数 L+6:写入第 2 个舵机的第 2 个数据
...
参数 2L+4:写入第 2 个舵机的第 L 个数据
...

不同于 REG WRITE+ACTION 指令的是实时性比它更高,一条 SYNC WRITE 指令可一次修改多个舵机的控制表内容,而 REG WRITE+ACTION 指令是分步做到的。尽管如此,使用 SYNC WRITE 指令时,写入的数据长度和保存数据的首地址必须相同。

例 7:对 ID1-ID4 共 4 个舵机首地址 0x2A 写入位置 0x0800、预留 0x0000 和速度 0x03E8(低位字节在前,高位字节在后)。
指令帧:FF FF FE 20 83 2A 06 01 00 08 00 00 E8 03 02 00 08 00 00 E8 03 03 00 08 00 00 E8 03 04 00 08 00 00 E8 03 58(按十六进制发送)


字头:FF FF
ID:FE
有效数据长度:20
指令:83
参数:
2A 06(首地址 数据长度)
01 00 08 00 00 E8 03(ID1 舵机指令)
02 00 08 00 00 E8 03(ID2 舵机指令)
03 00 08 00 00 E8 03(ID3 舵机指令)
04 00 08 00 00 E8 03(ID4 舵机指令)
校验和:58

4.7 同步读指令 SYNC READ

功能:用于同时查询多个舵机。
ID:0xFE
长度:n+4(n 为舵机个数)
指令:0x82
参数 1:读数据的首地址
参数 2:读数据的长度
参数 3:第 1 个舵机的 ID 号
参数 4:第 2 个舵机的 ID 号
...
参数 N:第 n 个舵机的 ID 号,N=n+2

一条 SYNC READ 指令可一次查询多个舵机的控制表内容,同步读指令中指定了需要查询舵机的 ID,舵机返回应答包顺序按指令包中 ID 顺序返回,使用 SYNC READ 指令时,所有查询的数据长度和数据的首地址必须相同(此指令针对部分串行总线舵机开放)。

信息

SC 系列舵机不支持同步读

例 8:查询 ID1-ID2 共 2 个舵机的当前位置、当前速度、当前负载、当前电压、当前温度(首地址 0x38,共 8 字数据,低位字节在前,高位字节在后)。

指令帧:FF FF FE 06 82 38 08 01 02 36

字头ID长度指令参数校验和
0xFF 0xFF0xFE0x060x820x38 0x08 0x01 0x02(数据首地址 数据长度 ID01 ID02)0x36

应答帧:


ID01 舵机:FF FF 01 0A 00 00 08 00 00 00 79 1E 55
ID02 舵机:FF FF 02 0A 00 FF 07 00 00 00 77 23 53

4.8 状态重置指令 RESET

功能:重置舵机状态(重置舵机圈数)
长度:0x02
指令:0x0A
参数:无

例 9:复位舵机,ID 号为 01。


指令帧:FF FF 01 02 0A F2(按十六进制发送)
应答帧:FF FF 01 02 00 FC(十六进制显示)