Skip to content Link Search Menu Expand Document
ModalAI DOCS
Store

VOXL 2 Remote Controller Configurations

Table of contents

  1. Summary
  2. Remote Controller Options for Built-in Flight Controller
  3. Spektrum (DSMX)
    1. Hardware
    2. Software
      1. Checking Status
  4. CRSF
    1. Hardware
    2. Software
      1. Checking Status
  5. Ghost Atto RC
    1. GHST Protocol
    2. SBUS Protocol
  6. Which UART Can My Receiver Use?
  7. Binding Notes
  8. Troubleshooting

Summary

We are working to expand the capabilities of VOXL 2 every day. The built-in PX4 flight controller enables industry leading SWAP for an autonomous flight controller, but not every interface and flight controller are supported yet. This page provides an overview of available connectivity. If this connectivity is insufficient for your application, VOXL 2 is a world-class companion computer for autonomous navigation and AI when paired with an external flight controller.

Remote Controller Options for Built-in Flight Controller

R/CProtocolIncludes TelemetryInstructionsAdapterExample Hardware
Ghost AttoUART / GHSTNo Not requiredGhost Atto
Ghost AttoSBUSNoSee Ghost Atto SBUS Protocol in this documentVOXL 2 I/OGhost Atto
ELRSUARTYesMAVLink and CRSF raw  
Spektrum (DSMX)UARTNoHereM0094SPM9745
TBS CrossfireUARTYesMAVLink and CRSF raw ES900RX
GraupnerSBUS / UARTNoHereVOXL 2 I/OGraupner GR-16
FrSky NoNot yet supported  
Futaba NoNot yet supported  
WiFiIP / MavlinkNoVOXL 2 Wifi Dongle User Guide Connect QGC over WiFi  
MicrohardIP / MavlinkNoMicrohard Add-on Manual  
Doodle LabsIP / MavlinkNoDoodle Labs User Guide  
CellularIP / MavlinkNo4G or 5G  

Spektrum (DSMX)

Hardware

Tested hardware:

  • Spektrum SPM9X45

VOXL 2 cannot put a Spektrum satellite receiver into bind mode — its driver does not generate the bind pulses that Pixhawk-style flight controllers send at power-up. Bind the receiver to your transmitter using other hardware first (a standalone Spektrum bind tool or another flight controller), then connect it to VOXL 2.

m0054-user-guide-rc-dsmx.png

M0054 J19:

  • Connector on board : SM12B-GHS-TB(LF)(SN)
  • Mating connector : GHR-12V-S

Software

Checking Status

The px4-listener input_rc command can be used to check status.

CRSF

Hardware

PLEASE NOTE: the baud rates for the receivers likely need to be updated.

The baud rates for the receiver UART are set here when PX4 starts on VOXL 2:

  • MAVLink - https://github.com/modalai/px4-firmware/blob/voxl-dev-1.12/boards/modalai/rb5-flight/voxl-px4.config#L172
  • CRSF - https://github.com/modalai/px4-firmware/blob/voxl-dev-1.12/boards/modalai/rb5-flight/voxl-px4.config#L175

Tested hardware:

  • Happymodel ES900EX (in CRSF mode)
  • TBS Crossfire Nano Rx (in MAVLink mode)

m0054-user-guide-rc-crsf.png

M0054 J19:

  • Connector on board : SM12B-GHS-TB(LF)(SN)
  • Mating connector : GHR-12V-S

Software

PLEASE NOTE: If using voxl-px4, edit “/etc/modalai/voxl-px4.conf” setting “RC=CRSF_RAW”

Checking Status

The px4-listener input_rc or px4-listener rc_channels command can be used to trouble shoot, if neither have been published it’s likely the receiver has yet to get RC data or the serial link isn’t working.

Ghost Atto RC

GHST Protocol

Connect the RC Receiver to J19

  • TX on the GHOST receiver to RC_UART_RX on J19
  • 5V on the GHOST receiver to VDC_5V_LOCAL on J19
  • GND on the GHOST receiver to GND on J19

PLEASE NOTE: If using voxl-px4, edit “/etc/modalai/voxl-px4.conf” setting “RC=GHST”

SBUS Protocol

With the VOXL 2 wired up to the connect the VOXL 2 IO board with the Ghost Atto receiver attached to port J3:

  1. Power on the system, the Atto should have a solid blue LED indicating paring mode.
  2. Power on the RC controller with the Ghost TX attached.
  3. On the Ghost Module TX, click the nozzle in.
  4. on the main menu, Navigate to Mode... and click in the nozzle.
  5. Change the following:
    • TX Mode from Auto to Manual
    • Protocol from GHST toSBus
  6. Move the nozzle to the left.
  7. Navigate to Bind... then press in the nozzle.
  8. Navigate to Bind + Setup and change RX to ProtoSBus.
  9. Navigate to and Select Start Bind

At this point the Atto should transition from a solid blue light to a red and yellow light indicating the binding was successful. If you go in to the Radio tab on QGC you should see the values for roll, pitch, and yaw. Change as you move the RC controller’s Thumbsticks.

Which UART Can My Receiver Use?

UART routing rules on VOXL 2:

  • J19’s RC UART goes to the DSP. Drivers started with qshell (spektrum_rc, crsf_rc, ghst_rc, gps) run on the DSP and use DSP-mapped UARTs. Drivers on the applications processor use /dev/ttyHS<x> ports instead — but ghst_rc is DSP-only and cannot be moved to an apps UART.
  • SBUS cannot run on J19 — its signal characteristics need the hardware inverter/buffer on the VOXL 2 IO board (M0065), whose J3 connector provides SBUS input plus 5V for the receiver. Futaba, Graupner (in SBUS mode), and Ghost-in-SBUS-mode receivers all go through M0065.
  • Sharing one link for RC and MAVLink requires the receiver on an apps-processor UART (expansion board required) — MAVLink can’t run over a DSP-mapped UART.

Binding Notes

  • Always power-cycle the vehicle after a successful bind. “Detected 0 radio channels” right after binding is almost always a missing power-cycle.
  • Spektrum: in bind mode the receiver flashes orange rapidly; hold the transmitter’s bind control while powering it on until the receiver goes solid. DSMX vs DSM2 matters — if one fails, try the other. ModalAI’s reference transmitter is the DX6e (SPMR6655).
  • ELRS (M0184 and others): press and hold the receiver’s physical button within 30 seconds of power-on to enter bind mode. Confirm your transmitter actually runs ELRS on the receiver’s band (915 MHz for M0184).
  • ELRS firmware compatibility: receivers and transmitters are compatible within the same major version (3.x.x ↔ 3.x.x) but not across (3.x ↔ 2.x). Update the handset’s TX module with upstream ELRS firmware — ModalAI doesn’t modify transmitter firmware, and handset models/settings persist through the update. ModalAI’s receiver patches only add voxl-elrs conveniences (unbind command, PWM config); any standard CRSF/ELRS receiver works with VOXL 2.
  • Switching receiver types (e.g. Ghost → ELRS): rewiring is only half the job — update RC= in /etc/modalai/voxl-px4.conf to match (GHSTCRSF_RAW).

Troubleshooting

For general service debugging see Debugging Services.

“Detected 0 radio channels. To operate PX4 you need at least 5 channels”:

  1. Power-cycle if you just bound (see above).
  2. px4-listener input_rc — is anything publishing?
  3. journalctl -b -u voxl-px4 — is the right RC driver starting, and does it report parse errors? For more detail, add -v to the driver’s start line in /usr/bin/voxl-px4-start (e.g. qshell spektrum_rc start -v).
  4. Check COM_RC_IN_MODE isn’t disabling RC input.
  5. Then it’s physical: reseat/replace the cable, scope the receiver’s TX line to confirm it transmits at all, and finally try another receiver.

Verification chain when RC “sort of” works: px4-listener input_rc shows channels → QGC radio calibration shows stick movement → px4-listener manual_control_setpoint shows correct mapping. When all three pass, the RC link is healthy — motor problems beyond that point are ESC configuration, not RC.

Spektrum “receiver error” spam in the log: older voxl-px4 builds rejected DSM frames whose protocol byte wasn’t 0x01/0x02, which some receiver/transmitter combinations produce. This check was removed — update to a current SDK rather than patching. If errors persist on a current build, try a different transmitter model (DSM protocol flavors vary).

RC dropouts, especially under throttle: usually electrical, not radio — twist the receiver’s UART wires, shorten the cable, route it away from power electronics, and check for connectors loosened by vibration. Dropouts that correlate with motor speed point at noise coupling or a marginal connector.

Historical note: early system images only supported CRSF at 250000 baud (TBS Crossfire), requiring ELRS receivers to be forced down from their standard 420 kbaud. Current SDKs support standard ELRS rates — no baud workaround needed.