简易机器人遥控器设计(兼容 RM 遥控器)

本篇摘自Epoch战队知识库,作者:Junshuo

Github 仓库:NUC-Epoch-Robotics/Epoch-Remote-Controller: Epoch 机器人遥控器 第一代 (github.com)

使用 & 维护

  • 操作手必须熟知遥控器 & 机器人电控逻辑。

  • 使用时戴好背带,四维摇杆较重,晃动会导致摇杆移动,可能误操作。

  • 尽量避免灰尘进入遥控器,灰尘会损伤电位器,导致摇杆漂移。

方案选择

成品航模/车模遥控器

  • 稳定

  • 开箱即用,开发简单

  • 不可定制

  • 通道有限,且无拓展性,不能确保满足之后每一届的题目

软件方案

  • 使用 Android 手机/平板遥控

  • 灵活,拓展性强

  • 方便显示图形化信息

  • 优雅

  • 开发难度大,实验室没有移动端上位机开发相关基础

  • 物理层选择有限,只能使用 WiFi / Bluetooth

  • 操控手感差,不适合半自动/全手动模式

硬件方案

  • 开发简单,是我们擅长的领域

  • 操控手感好

  • 可拓展性好,可以根据操作手需求定制

  • 物理层可选择范围广

  • 前期版本可能没有成品和软件方案稳定

  • 不方便显示图形化信息

其他:

软硬结合(Qt + 树莓派):开发难度大

Robomaster 遥控器接电脑控制:不够优雅,RC赛场打RM,有点逆天

硬件选型

主控

选择 STM32F103R8 ,原因如下:

  • 对计算性能要求不高

  • I/O 数量够用,能满足遥控器的拓展性

  • 有 ADC

  • 开发简单或有开发基础

  • 价格不贵

通信模块

规则规定的三种通信协协议使用的频段均为 2.4GHz 。具体使用了什么协议,组委会也不会去检查,只要在 2.4GHz ISM公共频段即可。

作者选择E34-2G4D20D nRF24L01芯片2.4G无线串口模块-lora无线网关技术-亿佰特无线通信模块,该模块有以下优点:

  1. 模块软硬件封装完善,不需要关心无线通信,当成串口开发即可

  2. 可靠性和传输速率比较好

  3. 支持不间断传输,不限制包长

摇杆

摇杆有【航模摇杆】、【游戏手柄摇杆】、【四维摇杆】,

  • 航模摇杆:适合精准控制(如底盘移动),尺寸大。拆机的航模遥感普遍电位器不太行,需要自己更换电位器。从淘宝买60度10kΩ的摇杆电位器就行。

  • 游戏手柄摇杆:适合不需要很精准的控制,尺寸小。电位器也不太行

  • 四维摇杆:有三个电位器,可以一个摇杆控制平移+旋转。X、Y轴电位器可调,Z轴电位器比较漂,电位器不可拆卸更换。价格较贵。

软件设计

摇杆通道采集

很常规的 ADC 配置。

通道数据处理

  1. 将 02048 的数据映射到 3641864

  2. 滤波

  3. 限幅

控制帧结构

设计思路:在满足控制需求(通道数量)的前提下,为了方便移植、减少开发成本,作者采用和 Robomaster 遥控器相似的18字节控制帧结构。

通道0~3、S1、S2、按键(8个)、保留字段(其实是通道4-左上角拨轮)与 Robomaster 遥控控制帧完全相同。

只有两个电位器旋钮不一样,占用的是 RM 遥控器的鼠标X、Y轴。

其余的为保留字段,暂时没用上。

控制帧打包的C语言实现

以前 4 个通道为例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
void remote_control_packup(uint16_t* ch, uint8_t* buff)
{
if (ch == NULL || buff == NULL)
{
return;
}

buff[0] = ch[0] & 0xFF; // 通道0低8位
buff[1] = ((ch[0] >> 8) & 0x07) | ((ch[1] << 3) & 0xF8); // 通道0高3位 + 通道1低5位
buff[2] = ((ch[1] >> 5) & 0x3F) | ((ch[2] << 6) & 0xC0); // 通道1高6位 + 通道2低2位
buff[3] = (ch[2] >> 2) & 0xFF; // 通道2中间8位
buff[4] = ((ch[2] >> 10) & 0x01) | ((ch[3] << 1) & 0xFE); // 通道2高1位 + 通道3低7位
buff[5] = ((ch[3] >> 7) & 0x0F) | (0x00 & 0xF0); // 通道3高4位 + 4位填充
buff[6] = 0x00; // 填充字节
buff[7] = 0x00; // 填充字节
buff[8] = 0x00; // 填充字节
buff[9] = 0x00; // 填充字节
buff[10] = 0x00; // 填充字节
buff[11] = 0x00; // 填充字节
buff[12] = 0x00; // 填充字节
buff[13] = 0x00; // 填充字节
buff[14] = 0x00; // 填充字节
buff[15] = 0x00; // 填充字节
buff[16] = 0x00; // 填充字节
buff[17] = 0x00; // 填充字节

}

验证:ch为通道原始的11位数据,packed为打包后的数据.

0x7ff = 0b0111 1111 1111

注:下图仅示意,红色数字标错了

无线通信模块 E34-2G4D20D 配置

使用 Ebyte 公司的上位机即可配置参数,参数配置如下:

需要注意:

  • 收发需要设置成相同的模块地址频率信道

  • 半双工模式(M0=0, M1=0)波特率最大支持到 115200,全双工波特率最大支持 115200/2

  • 低波特率(9600)在高速收发(也不高,大概 10Hz)的时候会有问题,接收端数据会错位

  • 波特率在 115200 时,控制频率在 200Hz 测试没有问题

使用串口 DMA 发送也会导致接收端数据错位,没有找到原因。

接收端

由于使用了和 RM 遥控器一样的控制帧,只需要改一下目前主控程序里遥控器(DBUS)的串口号和对应的波特率即可。

功能布局

一共7个电位器、2个钮子开关、8个按键。