Control Link Architecture: ExpressLRS and MAVLink
CRITICAL In the ArduPilot ecosystem, the radio link is not just for control sticks; it is a bidirectional data pipeline for MAVLink telemetry. This fundamentally changes the requirements compared to a racing drone. A system that is "solid" for a racer (who only needs 50Hz telemetry for battery voltage) may be completely unusable for an autonomous operator trying to upload a mission.
1. Modulation Physics: LoRa vs. FSK
To understand why ExpressLRS (ELRS) has taken over the world, we must look at the modulation layer.
1.1 FSK (Frequency Shift Keying)
- The Legacy: Used by FrSky, Spektrum, and Futaba.
- The Mechanism: The radio shifts the frequency slightly up or down to represent a 1 or a 0.
- The Limitation: FSK requires a Positive Signal-to-Noise Ratio (SNR). The signal must be louder than the background noise. If the signal drops below the noise floor, the receiver can no longer distinguish the frequency shift.
- The Result: Reliable, but range is limited by power output. 100mW gets you ~2km.
1.2 LoRa (Chirp Spread Spectrum)
- The Modern Standard: Used by ExpressLRS and Crossfire.
- The Mechanism: LoRa encodes data into "Chirps"—sweeping frequency variations that rise or fall over time.

- The Coding Gain: The receiver is not listening for volume; it is matching a pattern. It's like hearing a specific whistle in a crowded stadium. Even if the whistle is quieter than the crowd (Negative SNR), the human brain (or LoRa chip) can pick out the rising pitch.
- The Sensitivity: LoRa can demodulate signals down to -20dB SNR. It can hear a whisper in a hurricane.
- The Result: 100mW gets you 10km+.
2. The Bandwidth Bottleneck: MAVLink Integration
ArduPilot uses the MAVLink protocol to talk to the Ground Station (Mission Planner / QGC). MAVLink is "heavy." It sends parameter lists, mission waypoints, and status text.
2.1 The 900MHz Trap
Many long-range pilots instinctively buy 900MHz ELRS hardware.
- The Physics: Lower frequency (900MHz) penetrates obstacles better than 2.4GHz.
- The Trade-off: The 900MHz band is narrow. To fit within regulatory limits and maintain range, ELRS 900MHz typically runs at low packet rates (50Hz - 200Hz).
- The Calculation: At 50Hz packet rate, the available bandwidth for telemetry is often less than 50 bytes per second.
- The User Experience: You connect Mission Planner. It says "Getting Params 1 of 800". You wait. And wait. It takes 5 minutes to download the parameters. The map updates once every 3 seconds. It is safe to fly, but agonizing to configure.
2.2 The Solution: 2.4GHz High-Speed
- The Physics: 2.4GHz has massive spectral bandwidth. ELRS can run at 333Hz, 500Hz, or even 1000Hz (F1000).
- The Calculation: At F1000 mode (1000Hz), ELRS has enough "air time" to slot in over 4000 bits per second of telemetry data while still maintaining ultra-low latency control.
- The User Experience: Parameters download in seconds. The Artificial Horizon moves smoothly.
2.3 Gemini: The Best of Both Worlds
The latest "Gemini" hardware (e.g., Radiomaster Ranger Gemini) transmits on two frequencies simultaneously.
- Diversity: If interference jams 2.400GHz, the packet still gets through on 2.480GHz.
- Reliability: It offers the bandwidth of 2.4GHz with link reliability that rivals 900MHz.
- Verdict: For professional ArduPilot builds, ELRS 2.4GHz Gemini is the current gold standard.
3. Configuration for MAVLink
Getting MAVLink to work over ELRS requires specific settings. It is not "Plug and Play."
3.1 Telemetry Ratio (Lua Script)
On your radio handset, run the ExpressLRS Lua script.
- Standard/Race Setting:
1:64. This sends one telemetry packet for every 64 control packets. Good for VTX status, useless for MAVLink. - MAVLink Requirement: Set this to
1:2.- What this does: It tells the system to sacrifice control packet density to prioritize downlink data. Every other packet is a telemetry packet. This maximizes the bandwidth for Mission Planner.
3.2 Flight Controller Parameters
You must tell ArduPilot to speak the right language on the UART.
SERIALx_PROTOCOL = 23(RCIN). This enables the specific CRSF-to-MAVLink translation.SERIALx_OPTIONS = 0.SERIALx_BAUD = 460(460,800). ELRS usually negotiates this, but setting it explicitly ensures stability.
3.3 RSSI and Link Quality
To see your signal strength in the OSD:
RSSI_TYPE = 3(ReceiverProtocol). ArduPilot reads the RSSI value directly from the CRSF data stream.RC_OPTIONS-> Bit 2 (Suppress RC Failsafe).- Why: ELRS has its own failsafe flag bit. ArduPilot should listen to that bit, rather than guessing failsafe based on channel values (like older PWM receivers).