ESP32-S3 firmware that turns any ExpressLRS receiver into a USB game controller. No drivers. No software. Just plug and fly.
Everything you need to go from receiver to game controller.
SOF-driven HID reports at 1 kHz with change-only transmission for minimal latency.
Full ExpressLRS CRSF protocol support at 420 kbaud with CRC validation and link statistics.
Up to 8 axes, 32 buttons, and 4 multi-position switches. Descriptor rebuilds on profile switch; USB re-enumerates automatically.
Built-in WiFi AP with captive portal. Configure channel mappings, device settings, and OTA updates from any browser.
Store up to 10 radio configs in NVS flash. Switch between profiles and the HID device adapts instantly.
Standard USB HID joystick. Works out of the box on Windows, macOS, Linux, and Android.
Configure everything from your browser. Connect to the built-in WiFi AP and you're in.
Map each of the 16 CRSF channels to axes, buttons, or switches. Live values update in real time via SSE.
Two tiny boards, four wires, and an optional 3D-printed case.
Compact dev board with USB-C, built-in antenna, and all the required GPIO.
Any ExpressLRS-compatible 2.4 GHz receiver in the mini form factor.
Just four connections between the ESP32-S3 and the ELRS receiver.
| ESP32-S3 | ELRS RX | |
|---|---|---|
| 5V | → | 5V |
| GND | → | GND |
| GPIO 13 | → | RX |
| GPIO 12 | → | TX |
A single WS2812 LED shows the device state. The diagram below maps every state and transition.
Three steps from zero to flying.
Download the firmware and flash it to any ESP32-S3 board using the ESP-IDF tool or the web flasher.
Get the firmware →Wire an ExpressLRS receiver to the UART pins, power it up, and bind it to your radio transmitter.
Plug the USB into your PC. The device appears as a native joystick. Open your sim and go.
The numbers behind the performance.
Measured with GamepadLA at 1000 Hz polling rate.
=== Polling Rate === Average: 1000.85 Hz Median: 999.00 Hz === Refresh intervals === Minimal interval: 0.96 ms Median interval: 1.00 ms Average interval: 1.00 ms Maximum interval: 4.00 ms Jitter (StdDev): 0.47 ms === Outliers Report === Transition Artifacts (isolated spikes) removed: 132 Jitter Outliers (quantile filter) removed: 146