跳转至

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),速度为浮点数。

参考材料

完整协议说明

代码实现

202409130000