OriginMan扩展版通讯协议说明
通讯协议
OriginMan扩展版的通信协议由16进制解析与表示,基本按照如下格式进行:
指令格式
帧头 | 功能码 | 数据长度 | 参数 | 校验 |
---|---|---|---|---|
0xAA 0x55 | (uint8_t)Function | (uint8_t)Length | Data | (uint8_t)CRC |
-
帧头:连续收到0xAA、0x55,表示有数据包到达。
-
功能码:用于标明一个信息帧的用途。
-
数据长度:参数个数值。
-
参数:除功能指令以外需要补充的控制信息。
-
校验:检验该数据是否正确,采用CRC校验方式(CRC计算Function、Length、Data的值,取低8位。
当前支持内容
PACKET_FUNC_SYS = 0
PACKET_FUNC_LED = 1 # LED控制
PACKET_FUNC_BUZZER = 2 # 蜂鸣器控制
PACKET_FUNC_MOTOR = 3 # 电机控制
PACKET_FUNC_PWM_SERVO = 4 # PWM舵机控制
PACKET_FUNC_BUS_SERVO = 5 # 总线舵机控制
PACKET_FUNC_KEY = 6 # 按键获取
PACKET_FUNC_IMU = 7 # IMU获取
PACKET_FUNC_GAMEPAD = 8 # 手柄获取
PACKET_FUNC_SBUS = 9 # 航模遥控获取
PACKET_FUNC_OLED = 10 # OLED 显示内容设置
PACKET_FUNC_RGB = 11 # 设置RGB颜色
PACKET_FUNC_NONE = 12
代码实现
def buf_write(self, func, data):
buf = [0xAA, 0x55, int(func)]
buf.append(len(data))
buf.extend(data)
buf.append(checksum_crc8(bytes(buf[2:])))
self.port.write(buf)
部分传感器数据格式介绍
LED
功能码: 0x01 (PACKET_FUNC_LED)
协议示例:0xAA 0x55 0x01 0x07 0x01 0x64 0x00 0x64 0x00 0x05 0x00 [CRC]
作用:控制LED闪烁5次(每次亮100ms,灭100ms)
代码实现:
def set_led(self, on_time, off_time, repeat=1, led_id=1):
on_time = int(on_time * 1000) # 转换为毫秒
off_time = int(off_time * 1000)
self.buf_write(PacketFunction.PACKET_FUNC_LED, struct.pack("<BHHH", led_id, on_time, off_time, repeat))
蜂鸣器
功能码: 0x02 (PACKET_FUNC_BUZZER)
协议示例:0xAA 0x55 0x02 0x08 0x60 0x09 0x64 0x00 0x84 0x03 0x01 0x00 [CRC]
作用:控制蜂鸣器频率2400Hz、响0.1s、停0.9s、重复1次
代码实现:
def set_buzzer(self, freq, on_time, off_time, repeat=1):
on_time = int(on_time * 1000)
off_time = int(off_time * 1000)
self.buf_write(PacketFunction.PACKET_FUNC_BUZZER, struct.pack("<HHHH", freq, on_time, off_time, repeat))
电机
功能码: 0x03 (PACKET_FUNC_MOTOR)
协议示例:0xAA 0x55 0x03 0x16 0x01 0x04 0x00 0x00 0x00 0x80 0xBF 0x01 0x00 0x00 0x80 0xBF 0x02 0x00 0x00 0x80 0xBF 0x03 0x00 0x00 0x80 0xBF
作用:控制4个电机以-1r/s转动
代码实现:
def set_motor_speed(self, speeds):
data = [0x01, len(speeds)]
for i in speeds:
data.extend(struct.pack("<Bf", int(i[0] - 1), float(i[1])))
self.buf_write(PacketFunction.PACKET_FUNC_MOTOR, data)
-
数据格式:开关状态(1字节)、电机数量(1字节)+ N组(电机ID 1字节 + 速度 4字节)。
-
电机ID从0开始(传入1转换为0),速度为浮点数。