Post

Using a Vintage Hitec Flash 5 RC Transmitter as a USB Joystick

Using a Vintage Hitec Flash 5 RC Transmitter as a USB Joystick

A Very Old RC Transmitter: Hitec Flash 5

The Hitec Flash 5 is an extremely old RC transmitter. By modern standards, it is almost a relic.
However, one important feature still makes it useful today: the trainer port outputs a PPM signal.

By capturing this PPM signal with an Arduino, the transmitter can be reused with modern RC simulators. The signal can be converted and forwarded in two ways:

  • Serial communication
  • USB HID Joystick

This allows simulator usage without purchasing a dedicated RC simulator cable.


RC Simulator

In the past, using an RC simulator almost always required a proprietary cable.
This is still true today in many cases. However, thanks to Arduino, this is no longer strictly necessary.

Commercial simulator cables are cleaner and simpler, but the Hitec Flash 5 is very old, and most modern simulators no longer support serial ports.

When asking Gemini AI, two practical approaches were suggested:

  1. Convert PPM to a virtual joystick using vJoystick
  2. Use Arduino Leonardo to directly implement a USB HID joystick

This document focuses on the USB HID joystick approach.


R/C Desk Pilot (Free)

As a test environment, a free RC simulator such as R/C Desk Pilot can be used.


Hitec Flash 5 and the Circuit

To use the trainer port, the 6-pin DIN socket on the back of the transmitter is required.

A Zener diode is also necessary because the trainer port outputs approximately 12V PPM. This voltage must be reduced to a 5V TTL level for Arduino input.

Without proper voltage regulation, there is a real risk of damaging the Arduino MCU.


Trainer Port PPM Voltage Conditioning

Because the target is a USB joystick, Arduino Leonardo is required. Leonardo natively supports USB HID, which simplifies joystick implementation.

Today, AI tools such as Gemini can generate working source code almost instantly. In this project, very little manual work was needed.

(Strictly speaking, this is not even specialized knowledge anymore.
That is simply the world we live in now.)


Arduino Code (USB HID Joystick)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
#include <Joystick.h>

// Joystick configuration
Joystick_ Joystick(JOYSTICK_DEFAULT_REPORT_ID, JOYSTICK_TYPE_JOYSTICK,
                   0, 0,            // No buttons
                   true, true, true, // X, Y, Z
                   true, true, true, // Rx, Ry, Rz
                   false, false, false, false, false);

#define NUM_CHANNELS 6
#define PPMin 4
int channels[NUM_CHANNELS];

void setup() {
  pinMode(PPMin, INPUT);
  Joystick.begin(); // Register as USB joystick
}

void loop() {
  if (pulseIn(PPMin, HIGH) > 2000) {
    for (int i = 0; i < NUM_CHANNELS; i++) {
      channels[i] = pulseIn(PPMin, HIGH);
    }

    int low = 850;   // Adjust for center calibration
    int high = 1500; // Adjust for full-scale calibration

    Joystick.setXAxis(map(channels[0], low, high, 0, 1023));   // Aileron
    Joystick.setYAxis(map(channels[1], low, high, 1023, 0));  // Elevator (inverted)
    Joystick.setZAxis(map(channels[2], low, high, 0, 1023));   // Throttle
    Joystick.setRzAxis(map(channels[3], low, high, 0, 1023));  // Rudder

    Joystick.sendState();
  }
}
This post is licensed under CC BY 4.0 by the author.