ELRS信号收发
ELRS介绍
ExpressLRS(简称 ELRS)是一个开源的、高性能的无线电控制(RC)链路系统。它主要用于遥控模型(如无人机、固定翼飞机、遥控车等),旨在提供长距离、低延迟、高刷新率和高抗干扰性的无线连接。
核心特点:
- 开源: 固件代码完全开放,由社区驱动开发和维护。
- 高性能: 相较于许多传统 RC 协议,ELRS 提供更低的延迟(可达毫秒级)和更高的数据包刷新率(可达 1000Hz)。
- 远距离: 基于 Semtech 的 LoRa(远距离)物理层调制技术(以及 2.4GHz 上的 FLRC),即使在较低功率下也能实现数公里甚至数十公里的控制距离。
- 高抗干扰: 结合了 LoRa/FLRC 调制和跳频技术(FHSS),在复杂的无线环境中具有更好的鲁棒性。
- 成本效益: 通常基于 ESP32、ESP8285 或 STM32 等低成本微控制器和 Semtech SX127x (868/915MHz) 或 SX128x (2.4GHz) 射频芯片构建。
- 丰富功能: 支持完整的遥测回传、动态发射功率调整、无线固件更新等。
ELRS 实现原理
ELRS 的实现依赖于硬件(射频芯片+MCU)和软件(ELRS 固件)的结合。其核心原理可以概括为以下几点:
- 物理层调制 (PHY):
- 主要使用 LoRa 调制:这是一种扩频调制技术,通过牺牲一部分数据传输速率来换取极高的接收灵敏度(意味着可以接收到非常微弱的信号)和抗干扰能力,从而实现远距离通信。
- 在 2.4GHz 频段,ELRS 也支持 FLRC (Fast Long Range Communication) 调制,它能在保持较好距离和抗干扰性的同时,提供比 LoRa 更高的数据速率和更低的延迟。固件会根据配置(如数据包速率)智能选择使用 LoRa 还是 FLRC。
- 数据链路层:
- 定制协议: ELRS 定义了自己的数据包结构,针对 RC 控制信号(通道数据)和遥测数据进行了优化,力求高效和低延迟。
- 跳频扩频 (FHSS): 为了进一步抵抗干扰和提高链路的鲁棒性,ELRS 在多个预设的信道之间快速切换频率进行通信。发射机和接收机使用同步的跳频序列。
- 绑定机制: 发射机(TX)和接收机(RX)通过一个用户设定的“绑定短语”(Binding Phrase)进行安全配对。只有拥有相同绑定短语的设备才能建立连接,防止被其他设备控制。
- 同步: 发射机和接收机需要精确同步它们的时钟和跳频序列才能成功通信。
- 软件固件:
- ELRS 固件运行在发射机和接收机模块的 MCU 上。
- 发射端 (TX): 固件从遥控器(通过串行端口如 CRSF 协议)读取用户的控制输入,将其打包成 ELRS 格式,控制 SX12xx 芯片进行调制、跳频并发射。同时接收来自接收机的遥测数据并传回遥控器显示。
- 接收端 (RX): 固件控制 SX12xx 芯片接收信号,进行解调和跳频同步。接收到有效数据包后,解包并将控制数据通过串行端口(通常是 CRSF 协议)发送给飞控或其他伺服设备。同时,它可以从飞控收集遥测数据,打包并发回给发射机。
CRSF协议介绍
什么是 CRSF 协议?
CRSF (Crossfire Protocol) 是由 Team BlackSheep (TBS) 公司为其 Crossfire 远程无线电控制 (RC) 系统开发的一种双向串行通信协议。它主要用于在 RC 发射机(或其射频模块)与 RC 接收机(或飞行控制器)之间传输控制信号和遥测数据。
由于其高效、低延迟和强大的功能集,CRSF 已成为现代 RC 系统(包括 ExpressLRS、Tracer 等)和飞行控制器固件(如 Betaflight, INAV, ArduPilot)中广泛采用的事实标准。
主要特点
- 双向通信: 支持从发射机到接收机/飞控的 RC 通道数据传输,以及从接收机/飞控到发射机的遥测数据(如信号强度、电池电压、GPS 等)回传。
- 串行传输: 通常通过 UART (通用异步收发传输器) 接口进行通信,物理连接简单。
- 高效率: 采用紧凑的二进制数据帧格式,减少了传输开销。
- 低延迟: 设计目标之一就是最小化控制链路的延迟。
- 高数据包速率: 支持较高的更新频率,以匹配 ELRS 等高性能 RC 链路。
- 可扩展性: 协议定义了多种帧类型,可以传输各种遥测信息,并支持设备发现、配置等高级功能。
- 广泛支持: 被众多开源和商业 RC 产品及飞控固件支持。
通信流程
CRSF 通信是主从式的,通常:
- 发射机/TX 模块 -> 接收机/飞控:
- 发送 RC 通道数据(包含摇杆、开关等位置信息)。
- 发送设备查询 (Ping) 消息。
- 发送配置命令。
- 接收机/飞控 -> 发射机/TX 模块:
- 响应设备查询,发送设备信息。
- 主动发送遥测数据帧,如:
- 链路统计信息 (RSSI, LQ, SNR)
- 电池传感器信息 (电压, 电流, 容量)
- GPS 位置信息
- 姿态信息
- 飞行模式
- 等等…
帧结构
CRSF 使用二进制帧格式,其基本结构如下:
1 | <Device Address> <Frame Length> <Frame Type> <Payload> <CRC8> |
- Device Address (1 byte): 帧的目标或来源设备地址(同步字节)。常见地址:
0xC8
: 飞行控制器 (Flight Controller)0xEA
: 无线电发射机 (Radio Transmitter)0xEE
: 接收机 (Receiver)0xEF
: TBS Core PNP Pro- … 其他地址用于不同设备
- Frame Length (1 byte):
Frame Type
+Payload
+CRC8
的总字节数。最大长度通常限制在 62 字节(总帧长 64 字节)。 - Frame Type (1 byte): 定义了 Payload 中包含的数据类型。
- Payload (Variable length): 实际的数据内容,其结构由
Frame Type
决定。 - CRC8 (1 byte): 循环冗余校验码,用于校验从
Frame Type
开始到Payload
结束的数据完整性。通常使用 CRC-8-DVB-S2 多项式 (0xD5)。
常见帧类型示例
0x16
:CRSF_FRAMETYPE_RC_CHANNELS_PACKED
- 包含压缩的 RC 通道数据(通常是 16 个通道,每个通道 11 位)。这是从发射机到接收机/飞控最核心的数据帧。0x14
:CRSF_FRAMETYPE_LINK_STATISTICS
- 包含链路统计信息,如上行/下行 RSSI、LQ (链路质量)、SNR (信噪比) 等。0x08
:CRSF_FRAMETYPE_BATTERY_SENSOR
- 包含电池信息,如电压 (mV)、电流 (cA)、已用容量 (mAh)。0x02
:CRSF_FRAMETYPE_GPS
- 包含 GPS 信息,如经度、纬度、地速、高度、卫星数等。0x28
:CRSF_FRAMETYPE_DEVICE_PING
- 设备查询帧。0x29
:CRSF_FRAMETYPE_DEVICE_INFO
- 设备信息响应帧,包含设备名称、硬件/软件版本等。0x07
:CRSF_FRAMETYPE_ATTITUDE
- 包含姿态信息(俯仰、滚转、偏航角)。
物理层 (UART)
- 接口: 标准 UART (TX, RX 引脚)。
- 电平: 通常为 3.3V TTL 电平。
- 参数: 8 数据位, 无校验位, 1 停止位 (8N1)。
- 波特率: 常见的波特率包括 115200 bps, 400000 bps, 420000 bps 等。ELRS 通常使用较高的波特率(如 400k 或更高)以匹配其高数据包速率。发射机和接收机/飞控必须配置为使用相同的波特率。
硬件设计
发射端和接收端的硬件设计在核心连接上类似,主要区别在于与外部设备(遥控器或飞控)的接口。
2.1. 通用硬件要求 (TX 和 RX)
- 主控 MCU 选择:
- 推荐: ESP32 系列 (因其性能、成本和 ELRS 社区广泛支持)。STM32 系列 (如 STM32F1, F4 等) 也是可选方案。
- 要求:
- 高速 SPI 接口 (数据手册建议 <= 10MHz, CPOL=0, CPHA=0)。
- 足够的 GPIO 引脚用于连接模块的控制线 (NSS, RST, BUSY, DIO1, DIO2, DIO3, TXEN, RXEN)。
- 至少一个 UART 接口用于与遥控器/飞控通信 (通常使用 CRSF 协议) 或用于调试/烧录。
- 足够的 Flash 和 RAM 以运行 ELRS 固件。
- VG2392S240X0M2 模块与 MCU 连接:
- 电源 (VCC, GND):
- 提供稳定的 3.1V 至 3.6V 电源,典型值为 3.3V (手册 Page 4)。
- 强烈建议使用低噪声 LDO 为模块供电 (手册 Page 8)。
- 在模块 VCC 引脚附近放置滤波电容,如 100nF 和 10uF (手册 Page 7 电路图示例)。
- 确保良好的接地,将模块的 GND 引脚 (Pin 2, 15) 连接到 MCU 的地。
- SPI 接口:
- MCU
MOSI
-> 模块MOSI
(Pin 6) - MCU
MISO
<- 模块MISO
(Pin 7) - MCU
SCK
-> 模块SCK
(Pin 4) - MCU
NSS
-> 模块NSS
(Pin 3)
- MCU
- 控制引脚:
- MCU
GPIO
-> 模块RST
(Pin 8, 低电平有效复位) - MCU
GPIO
<- 模块BUSY
(Pin 9, 高电平表示模块忙) - MCU
GPIO
(中断输入) <- 模块DIO1
(Pin 10, 用于 TxDone, RxDone 等中断) - MCU
GPIO
<-> 模块DIO2
(Pin 11, 可配置功能,ELRS 可能用于天线切换或其他) - MCU
GPIO
<-> 模块DIO3
(Pin 12, 可配置功能)
- MCU
- PA/LNA 控制 (关键):
- MCU
GPIO
-> 模块TXEN
(Pin 13, 发射使能,高电平有效) - MCU
GPIO
-> 模块RXEN
(Pin 14, 接收使能,高电平有效) - 注意: ELRS 固件必须根据当前操作(发射、接收、空闲/休眠)精确控制这两个引脚的电平 (逻辑见手册 Page 13)。
- MCU
- 电源 (VCC, GND):
- 天线:
- 选择: 模块提供三种天线连接方式:板载 PCB 天线 (默认)、IPEX-1 座、邮票孔半孔 (手册 Page 5)。
- 跳线电阻: 如果不使用默认的板载 PCB 天线,需要根据手册 Page 9 的图示修改模块内部的 0 欧姆跳线电阻,将信号路径切换到 IPEX 座或邮票孔 ANT 引脚 (Pin 1)。
- 外部天线: 若使用外部天线 (通过 IPEX 或邮票孔),需选择 2.4GHz 频段、50 欧姆阻抗的天线。
- RF 走线 (若使用邮票孔): 从模块 ANT 引脚 (Pin 1) 到天线连接器的 PCB 走线应尽可能短、直,保持 50 欧姆特性阻抗。遵循手册 Page 9-10 的 RF 走线和拐弯建议。避免直角拐弯,推荐圆弧或 45 度角。
- 布局: 确保天线(尤其是板载 PCB 天线)远离金属外壳、电池、大型元器件和 PCB 接地铜皮覆盖区域,以保证辐射效率 (手册 Page 11)。
2.2. 发射端 (TX) 特定设计
- 与遥控器接口: 通常通过 UART 连接到遥控器主板,使用 CRSF 协议传输通道数据和接收遥测数据。
- 用户接口 (可选): 可添加按钮用于绑定或功能切换,添加 LED 指示灯显示电源、连接状态、遥测状态等。
2.3. 接收端 (RX) 特定设计
- 与飞控接口: 通常通过 UART 连接到飞控,使用 CRSF 协议发送控制指令和接收遥测数据请求。
- 用户接口 (可选): 可添加 LED 指示灯显示电源、连接状态、绑定状态等。
软件设计
软件设计的核心是配置和编译适用于该硬件组合的 ELRS 固件。
- 获取固件:
- 使用官方 ExpressLRS Configurator 工具,这是最简单的方式。
- 或者从 ExpressLRS GitHub 仓库 (https://github.com/ExpressLRS/ExpressLRS) 获取源码,使用 PlatformIO 进行编译。
- 硬件目标 (Target) 配置:
- 关键步骤: 需要在 ELRS Configurator 或 PlatformIO 环境中选择或定义一个硬件目标,该目标必须与您使用的 MCU 以及 VG2392S240X0M2 模块的引脚连接相匹配。
- PA/LNA 控制: 由于此模块带有外部 PA/LNA,必须选择一个支持
TXEN
和RXEN
引脚控制的 ELRS 硬件目标配置。如果官方没有完全匹配的预设目标,您可能需要:- 查找基于相同 MCU 且使用类似 PA/LNA 控制方式 (如 RadioMaster Ranger Micro 2.4GHz 等) 的目标作为参考。
- 或者,在 PlatformIO 中创建自定义硬件布局 (Hardware Layout),在对应的
.ini
文件或user_defines.txt
/hardware.h
中正确定义RADIO_TXEN_PIN
和RADIO_RXEN_PIN
所连接的 MCU GPIO 引脚号。
- 引脚定义: 确保配置文件中定义的 SPI (MOSI, MISO, SCK, NSS)、RST、BUSY、DIO1 (IRQ) 引脚与硬件连接一致。DIO2/DIO3 根据 ELRS 目标是否使用它们来决定是否需要定义。
- 关键固件配置参数:
- Regulatory Domain: 选择
ISM_2400
。 - Binding Phrase: 为 TX 和 RX 设置相同的绑定短语。
- TX/RX Role: 分别为发射端和接收端固件选择
TX
或RX
。 - Radio Output Power (重要!):
- 模块手册 (Page 4, 12) 指出,当 SX1281 内部输出设置为 0dBm 时,模块最终输出可达 27dBm。
- 因此,在 ELRS 固件配置中,不能直接设置目标输出功率为 27dBm。您需要配置 ELRS,使其驱动 SX1281 芯片输出较低的功率(例如 0dBm 或根据实际 PA 增益计算得出的值)。
- 具体的配置方式依赖于所选的 ELRS 硬件目标。通常在硬件配置文件 (
hardware.h
或类似文件) 中会有功率相关的定义,需要确保这些定义与模块的 PA 增益相匹配,以避免损坏 PA 或输出功率超标。务必仔细查阅所选 ELRS 目标关于功率设置的说明,或在自定义目标时正确设置功率表。 手册建议 SX1281 输出不要超过 5dBm (Page 12)。
- Packet Rate / Telemetry Ratio: 根据需求选择合适的速率和遥测比率。
- Regulatory Domain: 选择
- 编译与烧录:
- 使用 ELRS Configurator 或 PlatformIO 编译固件。
- 通过 USB 转串口工具或其他烧录方式将编译好的固件分别烧录到 TX 和 RX 模块的 MCU 中。