小米CyberGear微电机串口控制指令驱动

Ref: GitHub - Tony607/Cybergear: 小米微电机Cybergear上手开发

0 写在前面

官方使用说明:

关节电机采用CAN通信方式,通信线有两根,通过can转USB工具与调试器相连,调试器需要提前安装ch340驱动,默认工作在AT模式。

需要注意的是,我们是根据特定的can转USB工具开发的调试器,因此需要用我们推荐的串口工具来进行调试器调试,如果想要移植到其他调试器平台可以参照说明书的第三章进行开发。

can转USB工具推荐使用YourCee的USB-CAN模块,对应串口协议的帧头为41 54,帧尾为0D 0A。

本文采用的是YourCee的USB-CAN模块利用AT指令与两台CyberGear进行通信。

0.0 驱动器通信协议及使用说明:

电机通信为 CAN 2.0 通信接口,波特率 1Mbps,采用扩展帧格式,如下所示:

数据域29 位 ID8Byte 数据区
大小bit28~bit24bit23~8bit7~0Byte0~Byte7
描述通信类型数据区 2目标地址数据区 1

电机支持的控制模式包括:

  • 运控模式:给定电机运控 5 个参数;
  • 电流模式:给定电机指定的 Iq 电流;
  • 速度模式:给定电机指定的运行速度;
  • 位置模式:给定电机指定的位置,电机将运行到该指定的位置。

注意:数据区采用的是单精度(32位),右高字节。换算工具

0.1 通信协议类型说明

0.1.1 获取设备 ID (通信类型 0)获取设备的 ID 和 64 位 MCU 唯一标识符

数据域29 位 ID8Byte 数据区
大小bit28~bit24bit23~8bit7~0Byte0~Byte7
描述0bit15~8:用来标识主机CAN_ID目标电机CAN_ID0

应答帧:

数据域29 位 ID8Byte 数据区
大小bit28~bit24bit23~8bit7~0Byte0~Byte7
描述0目标电机 CAN_ID0XFE64 位 MCU 唯一标识符

0.1.2 运控模式电机控制指令 (通信类型 1)用来向电机发送控制指令

数据域29 位 ID8Byte 数据区
大小bit28~bit24bit23~8bit7~0Byte0~Byte7
描述1

Byte2:力矩

[0~65535]对应(-12Nm~12Nm)

目标电机CAN_ID

Byte0~1: 目标角度

[0~65535]对应(-4π~4π)
Byte2~3: 目标角速度

[0~65535]对应(-30rad/s~30rad/s)
Byte4~5: Kp

[0~65535]对应(0.0~500.0)
Byte6~7: Kd

[0~65535]对应(0.0~5.0)

应答帧:应答电机反馈帧(见通信类型 2)

0.1.3 电机反馈数据 (通信类型 2) 用来向主机反馈电机运行状态

数据域29 位 ID8Byte 数据区
大小bit28~bit24bit23~8bit7~0Byte0~Byte7
描述2bit8~bit15:当前电机 CAN ID
bit21~16:故障信息(0无1 有)
bit21: 未标定
bit20: HALL 编码故障
bit19: 磁编码故障
bit18: 过温
bit17: 过流
bit16: 欠压故障
bit22~23:模式状态
0 : Reset 模式[复位]
1 : Cali 模式[标定]
2 : Motor 模式[运行]
目标电机CAN_ID

Byte0~1: 目标角度

[0~65535]对应(-4π~4π)
Byte2~3: 目标角速度

[0~65535]对应(-30rad/s~30rad/s)
Byte4~5: 当前力矩

[0~65535]对应(-12Nm~12Nm)
Byte6~7: 当前温度:Temp(摄氏度)*10

0.1.4 电机使能运行 (通信类型 3

数据域29 位 ID8Byte 数据区
大小bit28~bit24bit23~8bit7~0Byte0~Byte7
描述3bit15~8:用来标识主CAN_ID目标电机CAN_ID

应答帧:应答电机反馈帧(见通信类型 2)

0.1.5 电机停止运行 (通信类型 4

数据域29 位 ID8Byte 数据区
大小bit28~bit24bit23~8bit7~0Byte0~Byte7
描述4bit15~8:用来标识主CAN_ID目标电机CAN_ID正常运行时,data 区需清0;
Byte[0]=1 时:清故障。

应答帧:应答电机反馈帧(见通信类型 2)

0.1.6 设置电机机械零位(通信类型 6)会把当前电机位置设为机械零位(掉电丢失)

数据域29 位 ID8Byte 数据区
大小bit28~bit24bit23~8bit7~0Byte0~Byte7
描述6bit15~8:用来标识主CAN_ID目标电机CAN_IDByte[0]=1

应答帧:应答电机反馈帧(见通信类型 2)

0.1.7 设置电机 CAN_ID(通信类型 7)更改当前电机 CAN_ID , 立即生效。

数据域29 位 ID8Byte 数据区
大小bit28~bit24bit23~8bit7~0Byte0~Byte7
描述7bit15~8:用来标识主 CAN_ID
Bit16~23: 预设置 CAN_ID
目标电机CAN_ID

应答帧:应答电机广播帧(见通信类型 0)

0.1.8 单个参数读取(通信类型 17

数据域29 位 ID8Byte 数据区
大小bit28~bit24bit23~8bit7~0Byte0~Byte7
描述17bit15~8:用来标识主 CAN_ID目标电机CAN_IDByte0~1: index(表0.1.11)
Byte2~3: 00
Byte4~7: 00

应答帧:

数据域29 位 ID8Byte 数据区
大小bit28~bit24bit23~8bit7~0Byte0~Byte7
描述17bit15~8:用来标识主 CAN_ID目标电机CAN_IDByte0~1: index(表0.1.11)
Byte2~3: 00
Byte4~7: 参数数据,1字节数据在Byte4

0.1.9 单个参数写入(通信类型 18) (掉电丢失)

数据域29 位 ID8Byte 数据区
大小bit28~bit24bit23~8bit7~0Byte0~Byte7
描述18bit15~8:用来标识主 CAN_ID目标电机CAN_IDByte0~1: index(表0.1.11)
Byte2~3: 00
Byte4~7: 参数数据

应答帧:应答电机反馈帧(见通信类型 2)

0.1.10 故障反馈帧(通信类型 21

数据域29 位 ID8Byte 数据区
大小bit28~bit24bit23~8bit7~0Byte0~Byte7
描述21bit15~8:用来标识主 CAN_ID目标电机CAN_IDByte0~3: fault 值(非 0:有故障,0:正常)
bit16: A 相电流采样过流
bit15~bit8: 过载故障
bit7: 编码器未标定
bit5: C 相电流采样过流
bit4: B 相电流采样过流
bit3: 过压故障
bit2: 欠压故障
bit1: 驱动芯片故障
bit0: 电机过温故障,默认 80 度
Byte4~7: warning 值
bit0: 电机过温预警,默认 75 度

0.1.11 波特率修改(通信类型 22)(1.2.1.5 版本可修改,请参照文档流程谨慎修改,操作错误会出现无法连接电机、无法升级等问题)

数据域29 位 ID8Byte 数据区
大小bit28~bit24bit23~8bit7~0Byte0~Byte7
描述22bit15~8:用来标识主 CAN_ID目标电机CAN_IDByte0:电机波特率
1:1Mbps
2:500kbps
3:250kbps
4:125kbps

应答帧:应答电机广播帧(见通信类型 0)

0.1.12 可读写单个参数列表 (7019-7020 为 1.2.1.5 版本固件可读)

参数
index
参数名称描述类型

单位/说明

R/W
读写

权限

0x7005run_mode0: 运控模式
1: 位置模式
2: 速度模式
3: 电流模式
uint81W/R
0x7006iq_ref电流模式 Iq 指令float4-23~23AW/R
0x700Aspd_ref转速模式转速指令float4-30~30rad/sW/R
0x700Blimit_torque转矩限制float40~12NmW/R
0x7010cur_kp电流的 Kpfloat4默认值 0.125W/R
0x7011cur_ki电流的 Kifloat4默认值 0.0158W/R
0x7014cur_filt_gain电流滤波系数filt_gainfloat40~1.0,默认值0.1W/R
0x7016loc_ref位置模式角度指令float4radW/R
0x7017limit_spd位置模式速度限制float40~30rad/sW/R
0x7018limit_cur速度位置模式电流限制float40~23AW/R
0x7019mechPos负载端计圈机械角度float4radR
0x701Aiqfiq 滤波值float4-23~23AR
0x701BmechVel负载端转速float4-30~30rad/sR
0x701CVBUS母线电压float4VR
0x701Drotation圈数int162圈数W/R
0x701Eloc_kp位置的 Kpfloat4默认值 30W/R
0x701Fspd_kp速度的 Kpfloat4默认值 1W/R
0x7020spd_ki速度的 Kifloat4默认值 0.002W/R

0.2 控制模式使用说明

0.2.1 运控模式

电机上电后默认处于运控模式;3→1→2

  1. 发送电机使能运行帧(通信类型 3
  2. 发送运控模式电机控制指令(通信类型 1
  3. 收到电机反馈帧(通信类型 2

0.2.2 电流模式

18→3→18

  1. 发送电机模式参数写入命令(通信类型 18)设置 runmode 参数为 3
  2. 发送电机使能运行帧(通信类型 3
  3. 发送电机模式参数写入命令(通信类型 18)设置 iq_ref 参数为预设电流指令

0.2.3 速度模式

18→3→18→18

  1. 发送电机模式参数写入命令(通信类型 18)设置 runmode 参数为 2
  2. 发送电机使能运行帧(通信类型 3
  3. 发送电机模式参数写入命令(通信类型 18)设置 limit_cur 参数为预设最大电流指令
  4. 发送电机模式参数写入命令(通信类型 18)设置 spd_ref 参数为预设速度指令

0.2.4 位置模式

18→3→18→18

  1. 发送电机模式参数写入命令(通信类型 18)设置 runmode 参数为 1
  2. 发送电机使能运行帧(通信类型 3
  3. 发送电机模式参数写入命令(通信类型 18)设置 limit_spd 参数为预设最大速度指令
  4. 发送电机模式参数写入命令(通信类型 18)设置 loc_ref 参数为预设位置指令

0.2.5 停止运行

发送电机停止运行帧(通信类型 4

0.3 串口协议说明

以该指令为例:41 54 90 07 e8 0c 08 0a 70 00 00 00 00 80 3f 0d 0a

41 5490 07 e8 0c080a 70 00 00 00 00 80 3f0d 0a
帧头扩展帧canid数据位个数数据帧帧尾

0x41

A

0x54

T

ID(4字节)数据长度数据内容

0x0d

\r

0x0a

\n

usb转can模块会把canid左移3位,右边加100

扩展帧

hex9007e80c
bin1001 0000000001111110100000001100
去掉右边的1000001 0010000000001111110100000001
hex12 00FD01

18(dec)

通信类型

/主机id电机canid

数据帧

0a 7000000000803f

index=0x700a

转速模式转速指令

00

参考数据spd_ref=1rad/s

右高字节单精度

该指令意思为:通信类型 18 的单个参数写入,转速模式转速指令,参数为1rad/s

1 代码说明

import serial
import struct
import time

# Connect to the CAN bus with 1 Mbit/s bitrate
ser = serial.Serial('COM6', 921600, timeout=1)

# Enter "AT command mode"
ser.write(bytes.fromhex('41 54 2b 41 54 0d 0a'))

# 双电机给定速度运行,速度模式的通信类型:18-->3-->18-->18

# 通信类型18:发送电机模式参数写入命令,设置runmode=2
# 90 07 e8 0c-->12 00 FD 01(电机1的canid=1) 05 70 00 00 02 00 00 00-->0x7005的runmode=2
ser.write(bytes.fromhex('41 54 90 07 e8 0c 08 05 70 00 00 02 00 00 00 0d 0a'))
# 90 07 e8 14-->12 00 FD 02(电机2的canid=2) 05 70 00 00 02 00 00 00-->0x7005的runmode=2
ser.write(bytes.fromhex('41 54 90 07 e8 14 08 05 70 00 00 02 00 00 00 0d 0a'))

# 通信类型3:发送电机使能运行帧
# 18 07 e8 0c-->03 00 FD 01(canid1使能运行)
ser.write(bytes.fromhex('41 54 18 07 e8 0c 08 00 00 00 00 00 00 00 00 0d 0a'))
# 18 07 e8 14-->03 00 FD 02(canid2使能运行)
ser.write(bytes.fromhex('41 54 18 07 e8 14 08 00 00 00 00 00 00 00 00 0d 0a'))

# 通信类型18:发送电机模式参数写入命令,设置 limit_cur 参数为预设最大电流指令
# 90 07 e8 0c-->12 00 FD 01(canid1) 18 70 00 00 00 00 b8 41 0d 0a-->0x7018的limit_cur=23
ser.write(bytes.fromhex('41 54 90 07 e8 0c 08 18 70 00 00 00 00 b8 41 0d 0a'))
# 90 07 e8 14-->12 00 FD 02(canid2) 18 70 00 00 00 00 b8 41 0d 0a-->0x7018的limit_cur=23
ser.write(bytes.fromhex('41 54 90 07 e8 14 08 18 70 00 00 00 00 b8 41 0d 0a'))

#通信类型18:发送电机模式参数写入命令,设置 spd_ref 参数为预设速度指令
# 90 07 e8 0c-->12 00 FD 01(canid1) 0a 70 00 00 00 00 b8 41 0d 0a-->0x700a的spd_ref=5
ser.write(bytes.fromhex('41 54 90 07 e8 0c 08 0a 70 00 00 00 00 a0 40 0d 0a'))
# 90 07 e8 14-->12 00 FD 02(canid2) 0a 70 00 00 00 00 b8 41 0d 0a-->0x700a的spd_ref=5
ser.write(bytes.fromhex('41 54 90 07 e8 14 08 0a 70 00 00 00 00 a0 40 0d 0a'))

# 通信类型4:电机停止运行
# 20 07 e8 0c-->04 00 FD 01(canid1停止运行)
ser.write(bytes.fromhex('41 54 20 07 e8 0c 08 00 00 00 00 00 00 00 00 0d 0a'))
# 20 07 e8 14-->04 00 FD 02(canid2停止运行)
ser.write(bytes.fromhex('41 54 20 07 e8 14 08 00 00 00 00 00 00 00 00 0d 0a'))

# Close the serial port
ser.close()

评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值