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;
}

浙公网安备 33010602011771号