RoboMaster电控入门(2)DR16&DT7接收与解码

套件介绍

Robomaster中遥控机器人的手段是固定的,只能使用大疆提供的DR16&DT7套件进行操控数据的发送和接受。这个套件的手册可以在Robomaster的官网上下载到,里面有详细的说明,以及官方给的解码demo。

https://www.robomaster.com/zh-CN/products/components/detail/122

操控数据可以通过DT7遥控器直接发送,也可以将遥控器通过数据线连接到电脑上,然后打开Robomaster客户端操作界面,遥控器会将客户端内的键鼠操作发送给接收器。

使用DT7&DR16套件前需要保证接收机和遥控器之间已经成功配对。

DR16上的LED指示灯一般有三种状态:红灯常亮,绿灯闪烁,绿灯常亮,对应的状态如下:

指示灯状态 对应状态
红灯常亮 未检测到遥控器
绿灯闪烁 检测到遥控器,但未配对
绿灯常亮 已与遥控器配对

配对方法为打开需要配对的遥控器和接收机,长按对频按键10s左右,然后松开。

套件参数如下,通信距离足足可以达到1km,实际使用中也确实很稳,DJI还是牛逼的。但是需要注意的是DT7遥控器很不耐摔,天线也容易断,切记要保护好。

DBUS协议

接收机与接收机之间采用DBUS协议进行通信,这个DBUS协议和常用的SBUS协议应该是一样的东西,不知道为什么要改个名。

信号电平为TTL电平,但是和UART是反相的,需要过一个反相器再输入到单片机的串口上进行接收。这个反相器可以自己搭,一个三极管加两个电阻就可以了。

接收时对照着参数表进行串口的参数设置。

当然也可以直接连接Robomaster的开发板上专门留给DR16接收机的接口,一般是串口1,直接将接收机上引出的线对应连接即可,接口内置了反相器。DBUS与UART之间电平标准为反相关系,所以不能随意连接到其他串口。

数据帧解析

查看代码
 /**
  * @brief          遥控器协议解析
  * @param[in]      sbus_buf: 原生数据指针
  * @param[out]     rc_ctrl: 遥控器数据指
  * @retval         none
  */
static void sbus_to_rc(volatile const uint8_t *sbus_buf, RC_ctrl_t *rc_ctrl)
{
    if (sbus_buf == NULL || rc_ctrl == NULL)
    {
        return;
    }

    rc_ctrl->rc.ch[0] = (sbus_buf[0] | (sbus_buf[1] << 8)) & 0x07ff;        //!< Channel 0
    rc_ctrl->rc.ch[1] = ((sbus_buf[1] >> 3) | (sbus_buf[2] << 5)) & 0x07ff; //!< Channel 1
    rc_ctrl->rc.ch[2] = ((sbus_buf[2] >> 6) | (sbus_buf[3] << 2) |          //!< Channel 2
                         (sbus_buf[4] << 10)) &0x07ff;
    rc_ctrl->rc.ch[3] = ((sbus_buf[4] >> 1) | (sbus_buf[5] << 7)) & 0x07ff; //!< Channel 3
    rc_ctrl->rc.s[0] = ((sbus_buf[5] >> 4) & 0x0003);                  //!< Switch left
    rc_ctrl->rc.s[1] = ((sbus_buf[5] >> 4) & 0x000C) >> 2;                  //!< Switch right
    rc_ctrl->mouse.x = sbus_buf[6] | (sbus_buf[7] << 8);                    //!< Mouse X axis
    rc_ctrl->mouse.y = sbus_buf[8] | (sbus_buf[9] << 8);                    //!< Mouse Y axis
    rc_ctrl->mouse.z = sbus_buf[10] | (sbus_buf[11] << 8);                  //!< Mouse Z axis
    rc_ctrl->mouse.press_l = sbus_buf[12];                                  //!< Mouse Left Is Press ?
    rc_ctrl->mouse.press_r = sbus_buf[13];                                  //!< Mouse Right Is Press ?
    rc_ctrl->key.v = sbus_buf[14] | (sbus_buf[15] << 8);                    //!< KeyBoard value
    rc_ctrl->rc.ch[4] = sbus_buf[16] | (sbus_buf[17] << 8);                 //NULL
    rc_ctrl->rc.ch[0] -= RC_CH_VALUE_OFFSET;
    rc_ctrl->rc.ch[1] -= RC_CH_VALUE_OFFSET;
    rc_ctrl->rc.ch[2] -= RC_CH_VALUE_OFFSET;
    rc_ctrl->rc.ch[3] -= RC_CH_VALUE_OFFSET;
    rc_ctrl->rc.ch[4] -= RC_CH_VALUE_OFFSET;
}

 

posted @ 2025-01-02 17:30  希墨&*  阅读(394)  评论(0)    收藏  举报