无人机遥控器
目前用于无人机遥控器主流的无线电频率是 2.4G ,这样的无线电波的波长更长,可以通信的距离较远,普通 2.4G 遥控器与接收机的通信距离在空旷的地方大概在 1km 以内。2.4GHz 无线技术如今已经成为了无线产品的主流传输技术。所谓的 2.4GHz 所指的是一个工作频段 2400M-2483M 范围,这个频段是全世界免申请使用。
常见的 Wifi ,BlueTooth ,ZigBee 都是使用的 2.4G 频率段。Wifi ,BlueTooth ,Zigbee 都是基于 2.4GHz 的,只不过他们采用的协议不同,导致其传输速率不同,所以运用的范围就不同。同样是采用 2.4G 频率作为载波,但不同的通讯协议衍生出的通讯方式会有着天壤之别;仅仅在传输数据量上,就有着从 1M 每秒到 100M 每秒的差别。
因为无线电波在传输过程中可能受到干扰或是数据丢失等等问题,当接收机无法接收到发射器的数据时,通常会进入保护状态,也就是仍旧向无人机发送控制信号,此时的信号就是接收机收到遥控器发射器最后一次的有效数据。这样因为信号丢失而发送的保护数数据通常叫做 failsafe 数据。
遥控器与无人机的通信协议有多种,常见协议如下:
- PWM(Pulse Width Modulation):需在接收机上接上全部 PWM 输出通道,每一个通道都要接一组线,解析程序需要根据每一个东到的 PWM 高电平时长计算通道数值;
- PPM(Pulse Position Modulation):按固定周期发发送所有通道 PWM 脉宽的数据格式,一组接线,一个周期内发送所有通道的 PWM 值,解析程序需要自行区分每一个通道的 PWM 时长;
- SBUS(Serial Bus):每11个 bit 表示一个通道数值的协议,串口通信,但是 SBUS 的接收机通常是反向电平,连接到无人机时需要接电平反向器,大部分支持 SBUS 的飞控已经集成了反向器;
- XBUS:常规通信协议,支持18个通道,数据包较大,串口通信有两种模式,可以在遥控器的配置选项中配置,接收机无需做特殊配置;
通常操控无人机进行移动的必要通道有:
- 俯仰
- 航向
- 油门
- 滚转
1. PWM
接收机的每个通道均接出一根线用于 PWM 输出,飞控通过采集并解析这些 PWM 信号以获取控制信息,
在使用 STM32 时,可以将 GPIO 设置为 PWM 采集模式,并通过采集寄存器来读取当前 PWM 的周期与 PWM 占空比。
飞控对 PWM 信号处理的具体方法:
- 检测引脚由低电平变为高电平的时刻,并记录当前时间 t0 ,表示高电平开始;
- 检测引脚由高电平变为低电平的时刻,并记录当前时间 t1 ,表示高电平结束;
- 继续检测引脚由低电平变为高电平的时刻,并记录当前时间 t2 ,表示一个 PWM 周期结束;
- 计算高电平时长 = t1 - t0;
- 计算整个 PWM 周期 = t2 - t0;
- 计算 PWM 占空比 = 高电平时长 / PWM周期;
2. PPM
一旦通道数量变多,采集多个通道的 PWM 使得资源十分浪费,因此使用 PPM 编码,即在通过一路连接在一个周期内传输多个 PWM 信号,PPM 的频率通常是 50 Hz,周期长度 20 ms,如下图:
高电平电压一般在 4.8-6V ,信号周期 24ms ,单个脉冲宽度 0.4 ms, 脉冲间距 0.9ms-2.1ms;
3. SBUS
此协议是一种串口通信协议,采用 100k 的波特率,数据位点 8bits,停止位点 2bits,偶校验,但采用的反向电平传输,所以在接收端需要增加一个高低电平反向器进行电平反转,反向器可以按如下方法设计:
但大部分飞控已经集成了反向器,包括我们所使用的 PIXHAWK。
同时Nuttx支持自定义的波特率,可以通过对设备节点的配置实现波特率的设定,在 PIXHAWK IO上,S-BUS总线的设备节点为 /dev/ttyS2 ,所以可以编写一个程序对这个串口节点的波特率进行配置,
1 | void sbus_config(void) |
设置好波特率后,就可以对标准文件设备进行读取,通过 read() 函数来读取串口中的数据,
SBUS在传输过程中有两种不同的传输模式:
- 高速模式:数据发送间隔时间 7ms;
- 低速(模拟)模式:数据发送间隔时间 14ms;
S-BUS协议数据格式如下:
起始字节 0x0F | Flag字节说明 |
---|---|
数据1 | bit0 = n / a |
数据2 | bit1 = n / a |
…… | bit2 = n / a |
…… | bit3 = n / a |
数据21 | bit4 = 故障安全激活(0x10) |
数据22 | bit5 = 帧丢失,接收器上的等效红色LED(0x20) |
标志字节 | bit6 = ch18 = 数字通道(0x40) |
终止字节 0x00 | bit7 = ch17 = 数字通道(0x80) |
S-BUS 中数据 1~22 使用 11bits 来表示一个通道的数据 (0 - 2047)每个数据有 8bits 故可表示 16 个遥控器通道(8 × 22 = 11 × 16),
此外,遥控器返回的值与 PX4 飞控程序中有效通道值若不对应,需要进行转换;
S-BUS可以使用 UART 控制器来实现,故推荐使用此种方式进行设计。
参考网页: