Indie game storeFree gamesFun gamesHorror games
Game developmentAssetsComics

Arduino RC Receiver USB Adapter

A topic by GregNau created Aug 04, 2016 Views: 3,793 Replies: 15
Viewing posts 1 to 7
(2 edits)

RC Receiver USB Adapter

Arduino based game controller adapter for regular RC receivers up to 6 channels.

It acts as an USB joystick, dispatching the channel-values read from a PWM receiver. Aimed to be fast and responsible, though simple to use with automatic calibration function. It can be useful to play simulators wireless from the computer/tablet with your favourite transmitter. Compatible with Windows, Mac, Linux, Android,IOS.



The code is mostly written for Sparkfun Pro Micro, since it is based on ATmega 32U4 and can act as a game controller on USB. Though it may compile fine on other boards also (eg. Leonardo). Some jumperwires are needed to connect the receiver to the Pro Micro. Below on the picture you can see an example of wiring and setup in details.

To upload this particular piece of code on the Pro Micro you're going to need Arduino IDE 1.8.2 at least.



The Pro Micro boards usually have 2 leds side-by-side, which are the TX and RX status lights. These are used to reflect the state of the adapter:
On every startup these are flashing twice, then one of them is going off, the other one stays on. This means booted up successfully and ready to play.
But if they stay on, that means the adapter is in calibration mode. The calibration data is loaded and verified during setup,
but if these are incorrect/missing than it goes to calibration mode automatically.

Automatic calibration
Calibration process is the same as everywhere, the sticks, pots, switches on all channels must moved to their extents. Preferably more than once and in slow motion.
The leds are lit
During calibration there is no sending of joystick values to the host, there is no feedback at all, except it is in '#DEBUG_ENABLED' mode. Though in debug mode it's only using terminal to send data, there is no hid interface. While in normal operation after the calibration data is accepted and saved it goes directly to play mode.
Manual calibration
Sometimes it is needed to re-calibrate the adapter, although there is valid calibration data saved. To achieve that just plug in the usb while pushing the attached button. Then everything should be the same as with automatic process.

Only known restriction is the calibration autosave function accepts only if there is 6 working channels calibrated. In case you connect less channels then you always need to push the button to save calibration data.


Awesome work, thanks for sharing!

I'm glad you like it.

Freerider is also awesome simulator!

Excellent, but how does it communicate to the USB? there are only 2 wires to the usb connector Gnd and Vcc. Am I missing something or do you use the USB from the pro micro also?

Thanks in advance.

(1 edit)

Simply connect the pro micro with the usb cable, as you would for uploading a sketch from the arduino ide. It is recognized as a game controller, you can check it on joy.cpl in windows.

Or if you mean the extra usb connector on the wiring.png, thats for extra power. Earlier i was trying to fit it with 8ch receiver, but there were power issues. I'm going to remove that extra connector soon from the wiring.

Great thanks, I ended up making a UnoJoy adaptor as I didn't have the ProMicro, it uses the Arduino UNO with the bootloader flashed in DFU mode, and works well. I had a couple micro's arrive yesterday and got to work on yours also to compare.

Yours took a little more to get it to work and calibrated (more driver issues than anything... Win 10), but I managed it and it works quite well. If you attach the positive power from the receiver (+) to the high side of the fuse just above the USB port, you can do away with the extra USB plug that you are using to power the Rx, I have done it, and it works well so far. All you are doing is powering the proMicro and the RX off your PC USB port, nothing it can't handle if you don't try and power servos or anything. ;-)

Anyway, Just thought I'd share that with you, and thank you for your plans, it works very well. Great work.

Hi, I would love to give it a try! But the link seems to be broken, could you upload it again or sent it to me please? Thanks!

I'm afraid that is not available anymore.

You can use instead the source from

(1 edit)


I have more or less the same setup for my controller, only difference is that I am reading the serial (IBUS) signal instead of reading the PWM.  However, FPV Freerider does not recognize my arduino micro as a usb-device. Or something similar.. There is no stick response in the calibration setup. It used to work before, and works in other simulators (Velocidrone). It is also recognized as a USB-game controller in Windows, where all axis behave as expected.

Would love to this controller in FPV Freerider as well, as it runs a lot better on my lower end computer than other simulators. 

I have uninstalled vJoy and SmartPropoPlus which I used with an older audio trainer cable. 

Is there any other known fixes out there? Otherwise it would be great if there was an option for choosing which USB device to use for input, in case there are more devices connected


You could try uninstalling vJoy and SmartPropoPlus and see if that helps. They install a custom driver that sometimes conflicts when using a USB connected controller.

Thanks for the reply. To my knowledge I have already uninstalled both vJoy and SmartPropoPluss. 

Inwas wondering now if the problem is that I'm sending a 16bit value from my current Arduino receiver, instead of the more usual 8bit signal. Any ideas?


I can confirm that joystick values in 8-bit format works with FPV Freerider! I'm using a Joystick library from Heironimus, he has two versions, the older one works with this simulator. However, the channels "Throttle" and "Rudder" do not register in the calibration menu. Using for example Z-axis and X-rotation for throttle and yaw works. 

Developer (3 edits)

Glad you got it working! Thanks for sharing the solution.

(Oh, and if my last reply seemed strange it's because I misread your last post, my brain didn't see that you had in fact already un-installed vJoy and Smartpropoplus)

Awesome work! I did a simpler version of it, but simple pulsein instead of interrupts. I have two questions about it: 
-Is there any reason for the particular pins selected? Wouldn't it make more sense / is it possible to use pins next to each other? 4, 5, 6, 7, 8, 9 for example?

-Is it normal, that it has a slight play? A like it's a little shaky? Did you think of some kind of noise filtering?

One extra question, but maybe I'll need to contact Freerider dev about it: On mac and android it is totally fine, but on windows it is strange and unusable: The only a portion of the stick movements work, and sometimes it's inverted. Like the upper third of the throttle, and the rightmost quarter of the roll. I'll make a vid of it when I'll get to a Windows machine.

Thank you for sharing it, I love it :)

Developer (2 edits)

Mac and Android uses some Linux input system I believe, which is a bit different than Windows'. At least Unity's input manager (used for development of Freerider) sometimes works better in one combination of OS/Input device, an not the other. That's why it is necessary, for example - when using a Taranis, to make the endpoint adjustments according to the Taranis setup document on Windows, but not on Mac/Android. (Range from 0 to +100 instead of range from -100 to 100). Make that info can help you find a solution.

(2 edits)

Edit: I managed to compile & run it on a Leonardo board, but I don't have pins 14/15/16, as it is a different board.
What pins do I map it to? Right now I have set it to pins 3 to 8 and all I see is TX/RX constantly orange, nothing happens and the device doesn't show up as a joystick in Windows 10.