Not compatible with ExpressLRS 3.x.x, 2.x.x, or 1.x.x. ExpressLRS major versions are not cross compatible therefore this version 4 OTA is incompatible prior versions and will not connect at all (theoretically).
Support for STM32-based hardware has been removed, including all R9M hardware, your ExpressLRS PP, and Ghost devices. NDAA Blue can eat our shorts.
Fullres packet modes users in 8ch and 12ch mode will find CH9 or CH13 missing, and Arm moved to CH14. See "Optional Arming Method" below.
Any custom hardware.json and options.json (set from the webui Options tab) will be lost due to the flash filesystem update, back them up before updating. See "Flash Filesystem Changed".
When installing the elrs.lua to your handset, be sure to delete the existing elrsV3.lua and elrsV3.luac to not have two tools show up as ExpresLRS. The newest elrs.lua works with all ExpressLRS versions back to 2.0.
Highlights
Automatic Antenna Modes
Stop babysitting your receiver antenna modes. Updated RX/TX syncing now automatically select between True Diversity and Gemini mode based on the transmitter setting so you don't have to. If you connect to a single RF chip receiver, the transmitter also automatically steps down from Gemini mode to antenna switch mode.
Optional alternative arming method (requires EdgeTX 2.11.0 or higher)
The alternative arming method doesn’t use CH5 to communicate the user’s arming request to the TX module leaving CH5 free to use as a regular control channel. Arming is performed by user selected sources, e.g. physical or logical switches, anything EdgeTX offers as a source really. The alternative arming method works for all packet rates and switch modes but is especially useful for the fullres packet rates in connection with PWM receivers. No more “remapping CH5” required to use CH5 as control channel. The optional arming method can be enabled in the EdgeTX Internal/External RF Model Setup menu by changing “Arm using” to “Switch”.
Due to this change, fullres modes no longer "skip" CH5. Previously, 8ch and 12ch modes would generate 9ch or 13ch but now generate exactly the number of full resolution channels specified and CH5 is always a full channel. Users may shift CH6+ down by one or use a higher channel count to account for the change. CH14 now carries the 1 bit arming flag in 8ch and 12ch mode.
Expanded PWM receiver output offerings
You bought the whole servo, use the whole servo, available servo stretch mode now extends the channel input to 500-2500us output
Failsafe ranges have been extended to 476-2523 allow you to failsafe wherever you want on the dial
DSHOT 3D mode added as an available output option
Statistical Adaptive Dynamic Power
Instead of fixed SNR values compiled into the firmware, the dynamic power system now statistically models the SNR expected to result in 99%+ LQ and adjusts power to achieve that. This majorly improves dynamic power for LR1121 systems, which in 3.x tend greatly toward full blast output. Now it goes up, up, up, for a moment... but you're gonna be, gonna be golden.
New WebUI
New modern WebUI with an updated look and beautiful organized code instead of a pile of javascript that didn’t even have any consistent whitespace.
Improved telemetry bandwidth
Double telemetry bandwidth when operating in Gemini mode. We're putting eggs in every basket now. Instead of redundant packets, the telemetry downlink now sends data across both Gemini packets, doubling the telemetry bandwidth.
All my single ladies aren't left out either. OTA rejiggering means improved telemetry bandwidth for all non-Fullres packet modes too. Std telemetry rate on 500Hz shows a 30% increase in bandwidth, reducing the time to receive 14 Betaflight telemetry items from 6.6s to 5.1s. Combined with the Gemini telemetry change, this provides 66% additional improvement, from 5.1s to 3.1s.
Headtracking tracking more than heads
Headtracking through the backpack now supports sending the data to EdgeTX instead, and an arbitrary number of channels. Designed for wireless connected pedals (available now) and built in wireless trainer mode (future).
New DJI output protocol
Slap that DJI Air Unit out of low power mode without needing a flight controller. ExpressLRS now has the ability to arm DJI air units, either tied to arm state or permanently on.
New input telemetry protocols supported
A NMEA-output GPS can now be attached directly (115200 baud) for sending position, ground speed. Altitude, and satellite count.
HoTT telemetry has been extended to support the VSpeak turbine protocol including RPM, fuel level and flow, EGT, ECU voltage, pump and throttle % and status. (Image credit: StartZero100)
More robust syncing
The OTA now requires a counter synchronization lock to function, ensuring that TX and RX share a consistent state. There were certain cases where you could start a connection, but the Link Quality would stay very low (10-20%) even at close range. Instead of this failed sync going on indefinitely, the connection can no longer progress without proper sync and the RX will automatically retry the connection. Solves the “radio off to check failsafe” issue where sometimes the receiver behaved erratic after re-connect.
Making our code less garbagey
Core code refactors mean our interface is more CRSF spec compliant, and a new CRSF packet routing system allows data to move data between more than just a handset and flight controller. There's an expanded event flags system and other framework optimizations for the internal device framework that runs peripherals. STM32 support has removed, and our platforms and libraries have been updated to the latest versions.
Expanded packet modes for LR1121
The whole reason 4.0 needed to happen! The new sync structure means being able to support more packet modes. LR1121 gets more, up to a staggering 20 packet modes. The Team900, Team2.4, and GemX modes are also no longer mixed in one list and are selectable by band. New modes:
K1000 2.4 :arrow_right: 1000Hz FSK (module baud rate must be 921k or higher)
DK250 2.4 :arrow_right: 250Hz DVDA FSK
D50 LoRa 900 :arrow_right: 50Hz DVDA
25Hz LoRa 900 :arrow_right: 25Hz LoRa 900
Flash Filesystem Changed
The internal flash filesystem has been changed from the deprecated SPIFFS to LittleFS. There is no way to upgrade the filesystem in place. This means custom changes made on the old hardware.html page will be erased during the upgrade, along with items from the Options tab in the webui (receiver baud, airport, wifi and regulatory domain overrides, etc). The hardware.json can be downloaded from the webui before updating and then replaced after updating. PWM mappings and serial protocols are not affected.
Minor changes
Backpack is now disabled in wifi and BLE modes
Wide switch mode is always 6-bit now instead of switching between 6 and 7 bit modes, returning boost telemetry performance back to levels before 3.5.4
TQly telemetry item now samples the last 100 telemetry receives, up from 25
Reduced jitter in receiver serial output by always sending synced with the packet timer instead of at packet reception time.
Linkstats are always sent to the handset, even when disconnected. This allows a more immediate notice if the TX believes telemetry has stopped, and in the future we hope this will allow EdgeTX to display more TX status information while disconnected.
Lua r16 - Now labeled elrs.lua, contains bugfixes but old r15 or whatever is on your handset is probably fine.
Complete List
Fix crash in CRSF parser with CRSF packet length 0 #3429
Use invalid CRSF value to differentiate from an actual 0 ChannelData value #3405
Extended pwm failsafe values #3394
HoTT TLM / Support VSpeak turbine protocol #3382
Upgraded Web UI #3381
CRSF handling on the transmitter side #3378
Remove redundant tlmConfirm bit in OTA, increasing tlm bandwidth #3377
Allow arbitrary number of headtrack channels #3373
Change TQly counter to 100 items #3370
Fix DEBUG_INIT not working, unify logger name, simplify some log msgs #3369
Always send LinkStats to handset #3367
Allow secondary CRSF port to send RC data #3364
Atomic channel data updates #3363
Platform upgrade #3341
Statistical Adaptive SNR Thresholds #3302
Wide switch mode always 6 bit, boost to 1:2 #3295
Add OtaNonce to OtaCrcInitializer #3294
CRSF rewrite to be 'more' spec compliant #3198
Dshot 3D mode, allowing for both forward and reverse rotation #3139
Support directly-attached GPS inputs to RX #3086
Mavlink to Ardupilot Custom Telemetry CRSF translation for Yaapu Telemetry Script #3077
Pass HeadTracking Pan/Tilt/Roll back to EdgeTX #3076
Backpack device refactor #3075
Device/event framework optimisation #3049
Communicate Rx available antenna mode to the Tx #3039
Double MSP (TLM and MAVLink) throughput for Gemini hardware #3037
STM32 removal #3033 #3027 #3016 #2960 #2956
Permanently arm DJI (or other MSP displayport) air units using an RX #3028
Adds optional arming method and provides contiguous proportional channels for all full-res modes #3008
Auto configure Rx OTA protocol from the Tx #2994
Auto set True Diversity Rx into Diversity or Gemini mode based on Tx antenna mode #2993
Add tlmConfirm to tlm_dl ota packet-structure #2991
set OtaCrcInitializer to OTA_VERSION_ID during binding #2983
Reduce jitter for CRSF RC packets on the receiver #2943
Disable backpack in wifi and BLE modes #2940
Fix ESP32 based PWM receivers in debug mode #2939
Update OTA_VERSION_ID to V4 #2933
Send RF Mode Enum in place of RF Index in the Sync packet #2932
Split RC data sending from polling and queued data sending V4.0 #2931
Arm DJI O3 directly from an ELRS receiver #2926
Servo stretch feature for wider range servo PWM pulses #2773
D modes for Team900 #2089
Changes Since RC1
Missing some details in the Custom Settings Detected webui #3523
Resolve crashes before GPS has lock #3513
RC4 :arrow_down:
Config upgrade from 3.3.x not properly upgrading PWM channels #3505
Webui missing RFO_HF enabled on LR1121 #3502
Only show "RF Band" in Lua if hardware permits #3501
Fix GPS Lat/Lon parser for coordinates <10° or >99° #3500
Fix S3 USB passthrough flashing backpack #3497
Handle broadcast routing in deliverMessageTo (fix VTXAdmin) #3483
Add missing fields from model export/import file #3482
Fix PPM/CRSF auto detect for RX-as-TX #3481
Fix Gemini 2.4GHz K modes due to FEC buffer initialization #3473
Unify code for setting link parameters, fixes no telemetry in X modes #3472
Fix TFT/OLED displayed packet rates for single band LR1121 #3468
RC3 :arrow_down:
Fix for PWM receivers not showing the connection page in the Web UI #3467
RC2 :arrow_down:
Only use the low bit of the extended channels packet for arm status #3461
Extend VTX Admin disconnect debounce #3459
Prevent POWER_VALUES OOB array access #3458
Ensmallen 8266 firmware binary, switch to LittleFS for all #3457
Remove reference to 750us servo mode in webui #3452
Can't bind RX after RX had connection #3450
Set LQ=0 when handset disconnects #3447
Dual band binding happening on wrong rate TX/RX #3446 #3448
Only use the default UART0 for passthrough flashing #3442
Fix broken I2C on 8285 based receivers #3440
Extend TcpMspConnector idle timeout #3437
Proper packet rate config migration for LR1121 #3439
Move from version-labeled lua to just elrs.lua #3436
Wrong feature flags names being used in webui hardware page #3434