Note
This is not a production ready controller, it may contain design faults. I am not an engineer and cannot vouch for its safety. Ergonomics are still very basic. Uses a low cost screen, with plans to update for a high brightness outdoor screen once testing completes. HDMI would also be useful for use with goggles, but not yet sure how to implement that.
Tip
Although designed for RubyFPV, no reason it cant be used for other systems such as OpenHD so long as they support a Raspberry Pi. OpenIPC doesn't support control link at this time.
Around 2025 RubyFPV matured into a stable digital FPV and link system. Users report it operates flawlessly without stutters or break-ups. In my home testing, Ruby achieves approximately 75% of the range of DJI O4. As of early 2026, RubyFPV is working on integrating specialist FPV modules which will further improve the link. These upcoming modules will provide an even more stable link, more range, and lower latency. They will support multiple frequency bands, a first for digital FPV, including traditional 5.8GHz and low-frequency bands for long range.
Open source FPV eliminates vendor lock-in, privacy concerns, and lack of feedback associated with closed systems. For example, DJI has been shown to have back doors in their hardware, forcing changes without an update in the UK. DJI also require activation, restrict certain features for non-DJI drones (eg head tracking), and leave certain features out of date (eg SBUS). Because RubyFPV is open, it can be fully customised for industrial, academic, or developer applications. It also handles video, telemetry, and control signals over a single link and supports advanced features like signal relaying and antenna trackers.
This 3D-printed controller includes features missing on commercial systems, such as a six-position switch specifically for Ardupilot flight modes, along with a high number of assignable switches. Because RubyFPV supports multiple concurrent links across different frequencies, this controller has the internal space to house multiple transceiver modules simultaneously.
| Feature | Description | |
|---|---|---|
| 7 inch screen | Good size screen, reasonably priced | ✅ |
| Combined Screen and Controller | No need for a separate control link such as ELRS | ✅ |
| Raspberry Pi / Radxa Rock based | ✅ | |
| Open source joystick controller | Uses highly configurable FreeJoy HID controller, allowing large number of switches and pots | ✅ |
| Radiomaster AG1 Hall Sensor Gimbals | Beware: the hall sensor wires on Radiomaster are mis-coloured, remove wires and check polarity printed on sensors. Available in CNC or low cost plastic. | ✅ |
| Built in open source patch antennas | Low profile, low cost, perfect radiation beam for long range | ✅ |
| Diversity omni antennas | V shaped antennas to reduce blind spots | ✅ |
| RTL EU2 Wifi chips with heat sinks | Transceivers mount on integrated heat sinks | ✅ |
| Active cooling | Two large fans | ✅ |
| Rotary switch | Rotary switches support large number of positions, suitable for flight modes on Ardupilot etc | ✅ |
| Power switch guard | Knock guard protects against accidental on/off | ✅ |
| Mini nav stick | Used to navigate through RubyFPV menus. Spare nav stick for screen control. | ✅ |
| LCD Screen | Used for aux display on RubyFPV | ✅ |
| External USB port | Used to update firmware | ✅ |
| High brightness outdoor screen | 2000 nit screen coming later | ⏳ |
| Ergonomics | Improved ergonomics coming later | ⏳ |
Note
Files created in FreeCAD for easy updating. STL files in multiple parts to fit typical 3D printers.
Wiring looks complex: it's not, the switches and gimbal wiring create that illusion.
Note
The RTL chips get hot. Heat sinks are glued into the board, and the RTL modules are attached to the sinks using thermal adhesive tape. The board you see creates two levels inside the controller. The bottom level houses the screen, wiring and gimbals. The top level houses the Radxa/Raspberry, batteries, HID joystick controller, and RTL modules.
I found that the gimbals do not follow red/black wiring convention, with the red wire connected to the -ve and black wire to the +ve. The hall sensors have + and - markings on the PCB which appear correct.
... and other misc items: thermal adhesive tape, resistors for rotary switch and three position switches, and probably more things I've forgotten about.
The controller uses a 4-pin DC plug as a balance lead, with pins wired to each junction of the three battery cells. Due to space constraints, there is no dedicated main power socket. Since most chargers do not support charging via the balance lead alone, you can use a breakout lead (an XT30 plug connected to the two outer junctions). While this is electrically the same as a standard charging setup, the power is "tapped" from balance wires, therefore, you must charge at a low current to prevent issues.
DC PLUG PIN:(1) (2) (3) (4)
| | | |
+--[Cell1]--+--[Cell2]--+--[Cell3]--+
| (3.7V) (7.4V) (11.1V) |
| |
XT30: NEG (-) POS (+)
- Tightly twist the USB data wires and keep them as short as possible
- Lightly twist the hall sensor wires and keep them as short as possible
- WiFi transceivers should take power direct from the voltage regulators. USB power is insufficient at high outputs.
- These should be wired to an analogue terminal on the Joystick Blue Pill STM32 controller.
- Two 5k resistors from centre terminal to outer terminals.
- Power and Ground from the joystick controller to the switch outer terminals.
- Centre switch terminal to analogue pin
SWITCH PIN: (GND) (Analogue Pin) (3.3v)
| | |
+---[R1]---+---[R1]---+
[#### SWITCH BODY ####]
- Solder small resistors between the terminals create a "voltage ladder" (Google "rotary switch voltage ladder").
- The total resistance should sum to ~10 kOhms
- Wire to an analogue input on the Joystick HID Blue Pill STM32 controller
Ardupilot flight mode channel is a pain as the switch boundaries are not configurable, so each notch on the switch may not move the flightmode by one setting. This is because Ardu doesn't use the first and last 10% of the band. Thankfully, FreeJoy axes curves can fix this. The image shows how to configure the curve for a six position switch: notice that the line starts at -80% and ends at 80%, which compresses the band into what Ardu expects.









