无人机遥控器协议
凉凉不冷 Lv4

无人机遥控器

目前用于无人机遥控器主流的无线电频率是 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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
void sbus_config(void)
{
int sbus_fd = open("/dev/ttyS2", O_RDWR | O_NONBLOCK);
if(subs_fd < 0)
{
return;
}
struct termios t;
// set baud rate 100k
tcgetattr(sbus_fd, &t);
cfsetspeed(&t, 100000);
t.c_cflag |= (CSTOPB | PARENB);
tcsetattr(sbus_fd, TCSANOW, &t);

}

设置好波特率后,就可以对标准文件设备进行读取,通过 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 控制器来实现,故推荐使用此种方式进行设计。

参考网页:

  1. 一天精通无人机:初级篇系列第 9 讲:遥控器 - 知乎 (zhihu.com)
  2. 无人机中级篇:第十一讲:遥控器PWM与PPM协议 - 知乎 (zhihu.com)
  3. 无人机中级篇:第十讲:遥控器协议S-BUS - 知乎 (zhihu.com)
  4. 介绍PWM、PPM、S-BUS这三者的区别-CSDN博客
  5. Futaba S-BUS controlled by mbed | Mbed
 Comments