• Full Screen
  • Wide Screen
  • Increase font size
  • Default font size
  • Decrease font size

Project #019 - RC Joystick Tx V2

E-mail Print

Updated 27/07/12

DISCLAIMER: This design is experimental, so if you decide to build one yourself then you are on your own, I can't be held responsible for any problems/issues/damage/injury that may occur if you decide to follow this build and make one yourself.


I started FPV and long range RC flying by using a standard Futaba 9C connected by way of the trainer port to an external 430mHz system (Thomas Scherrer's LRS).

Then I designed and built a joystick which by way of an internal Arduino pcb connected to the trainer port of the 9C. Flying my Quadcopter using the joystick is a blast, but the trainer cable and forgeting the 9C was by me on the ground I was always tripping over it.

So (I must be mad) I re-invented the wheel per se by building my own standalone Joystick Radio Tx using a couple of old PC joysticks, an Arduino and the Tx pcb from Thomas Scherrer's LRS kit.

It's powered from a 1500mAh 3S Lipo. About 4hrs continious use I reckon, charge socket is on the side.
Battery voltage detection sounds a buzzer at 10.8vdc or less.

DISCLAIMER: With this design, including both the hardware & software I offer no guarantee that it is bug free or reliable. So, if your decide to build one and your plane, quad etc crashes and/or causes damage/harm to you, others or property then you are on your own. This project is experimental.



The actual joystick isn't native to the base because the hand control that came with the base isn't 3D thus no rudder control, so I installed the control from a different joystick.

1 * Speed Link Black Widow arcade stick (Base).
1 * Logitech Extreme 3D Pro (Grip).
1 * Matrix Orbital 2x8 LCD (P/N=LCD0821). Note: Must be put into TTL mode.
1 * Thomas Scherrer's 430mHz LRS kit (any model will do) c/w antenna, connector & coax.
1 * Battery (i.e. 3S Lipo, 11.4v 1500mAh).
1 * 10k Potentiometer, panel mounting type.
1 * Toggle Switch, panel mounting type.
1 * Arduino Nano.
1 * Small piece Vero board & SIL headers for wiring.
2 * 100uF 25v Electrolytic Capacitor (supply decoupling)
1 * 15k resistor.
1 * 10k trimpot.
1 * 5v buzzer.



The 4 buttons on the Tx are as follows:-
- Function.
- Down Trim adj, Off/No & Enter/Exit Timer mode.
- Up Trim adj, Ob/Yes & Start/Stop Timer.
- Lo/Med/Hi rates select.

1. You can exit the timer mode and it will remain active. Also, it isn't the most accurate, it'll probably lose 1sec every couple of minutes.
2. Press Down Trim & Up Trim at same time to enter I/O Test mode.

Close up of the 8x2 LCD showing some of the screens including:
Battery capacity/voltage, Hi/Mid/Lo Rates, Ael/Ele/Rud Trim, Timer & the Test mode showing PPM output (uS) & Raw analogue inputs (counts).

Main screen showing battery capacity (%) and the voltage. Also, the current Rates selected.
Note: 0 - 100% battery capacity corresponds to 10.8v - 12.6v, i.e. the working range of a 3s Lipo. The alarm buzzer activates at 10.8v or less.

You can trim Aelerons, Elevators & the Rudder. The settings are saved independently for Hi, Mid & Lo rates. The screenshots here show the Mid rate trims being adjusted.

The flight timer can run up to 99mins, 59 secs. It will run in the background if you need to switch screens.

The Test Mode allows all the PPM output channels to be displayed in uS, and the raw analogue inputs in counts 0-1023.

Elevon mode selection.

Exponential mode selection.

Invert mode selection.




Here's the PPM output from the Arduino showing 6 channels running. The PPM protocol is a very simple serialization of the servo PWM commands, separated by a long syncronization pulse. The range of each channel pulse is 700uS to 1700uS, and you can see ch.3 (throttle) at minimum, whilst ch.5 (aux switch) is at maximum.
The refresh rate of the entire PPM stream is set at 22mS.



There are a few versions available for download, the I/O mapping detailed below is based on the latest 8ch version.

Analogue Input pins (0-5vdc):
Pin 0 = Elevator potentiometer    --> PPM Ch.2 - Elevon mix Aeleron 2 (averaged) (Invert mode) (Exponential mode)
Pin 1 = Aeleron potentiometer     --> PPM Ch.1 - Elevon mix Aeleron 1 (averaged) (Invert mode) (Exponential mode)
Pin 2 = Rudder potentiometer      --> PPM Ch.4                        (averaged) (Invert mode) (Exponential mode)
Pin 3 = Throttle potentiometer    --> PPM Ch.3                        (averaged)
Pin 4 = Aux potentiometer 1       --> PPM Ch.6
Pin 5 = Battery Voltage (2.2v at input to display 12.6v)
Pin 6 = Aux potentiometer 2       --> PPM Ch.7

Digital Input pins:
Pin 2 = Function panel button
Pin 3 = Trim adj panel button
Pin 4 = Trim adj panel button
Pin 5 = HI/LO rates set panel button
Pin 6 = Thumb stick AEL up
Pin 7 = Thumb stick AEL down
Pin 8 = Thumb stick ELE up
Pin 9 = Thumb stick ELE down
Pin 13 = Aux switch 1             --> PPM Ch.5
Pin 11 = Aux switch 2             --> PPM Ch.8

Digital Output pins:
Pin 10 = PPM output
Pin 12 = Buzzer output
Pin 1 = Txout, Serial LCD (TTL mode)

1. Use a 5.6k & 1k voltage divider (or a trimpot) so the input sees 2.2v approx. for a 12.6v battery voltage.



This isn't a full wiring diagram, but offers the basics as to what the wiring effectively looks like. 6ch example shown.


Just about any Arduino version can be used, incluing the Atmega 168 models, however I chose the NANO due to it's size and the fact it has the mini USB jack built in.


Download the latest code here.



Other folks have taken on this project:

1. speeder06 over at rcgroups.com has made a youtube video here.



Added labels on the buttons/switches. This photo shows the 8ch implementation for my own AeroQuad:-


The joystick for controlling Ael, Ele & Rud and making use of the thumb-stick at the top for trim adjustment. On the body of the unit itself the throttle and there's 4off pushbuttons for rates & trim adjustment, the 8*2 LCD and the TI (Thermal Intelligence) pot and switch. This is on the 6ch version software:-


Charge socket on the side & the 430mHz Tx bind/failsafe button in the foreground:-


Power switch, buzzer (via small hole) and Antenna.


Arduino USB port.


Internal view showing the battery, Arduino, 430mHz Tx board & LCD etc.


Here's the joystick undergoing software mods on the workbench.




# 2013-12-11 01:40
Excellent work dude, am using this code to stick an arduino in an old PS3 controller. Takes up less room in my backpack for riding to the beach and slope soaring my mini wing.

Was wondering if there is any reason you went with an 8x2 instead of the ubiquitous 16x2 LCD's?
Reply | Reply with quote | Quote
# IanJ 2013-12-11 06:58
Simply for the space. A 16x2 would never have fitted in the space unless I used one of those very small ones with tiny characters. Hindsight though, the 8x2 I chose has it's issues.
Reply | Reply with quote | Quote
# 2013-12-12 09:29
No worries, I have a couple 16x2's floating around so I might press them into use. I've had a tinker around on my arduino Mega(1280) and can't seem to get a PPM output signal. In your readme.txt I see it's mapped to pin 10 on the Uno - can't seem to find where it comes out on the Mega? I have a Uno on order but it's a few weeks away. Do I need to remap it to another pin? Any help would be greatly appreciated.
Reply | Reply with quote | Quote
# IanJ 2013-12-12 09:42
The Arduino NANO's timers are not quite the same as the MEGA so you may need to adjust more than the pin mapping in the code if you want to use a MEGA. I don't have the code to hand right now so can't check for sure.
Reply | Reply with quote | Quote
# 2013-12-12 10:22
Awesome! Thanks for the heads up Ian, much appreciated.
Reply | Reply with quote | Quote
# sandro 2014-03-31 10:19
Hi, Jan.
First of all, thank you for your project! Really interesting.
I'm ready to make the RC Joystick Tx V2 but i have a problem.
Matrix orbital lcd are very expensive and almost unfindable. I have a diy serial 2x16 lcd made with an old arduino mini pro. Do you think is compatible with your code or may i have some troubles with it?
Reply | Reply with quote | Quote
# IanJ 2014-03-31 11:11
Your new one will not be directly compatible (software) so you will need to re-write the LCD routines.
Reply | Reply with quote | Quote
# sandro 2014-03-31 15:17
Thank you, Jan. Mmmm, I think of not being able to do that. Your code is specific only for matrix orbital lcd or there is an alternative compatible?
Reply | Reply with quote | Quote
# IanJ 2014-03-31 15:56
The Matrix Orbital is unique. I can only suggest you find somebody with Arduino experience to help you convert, or maybe somebody else here has already converted it.
Reply | Reply with quote | Quote
# Saul Valencia 2014-05-26 05:47
I have re-written the LCD routines for 16X2 let me find the code and i will share it...
Reply | Reply with quote | Quote
# sandro 2014-06-27 10:51
Sorry, I only read it now your post :-(. Thank You, really kind from you!
Bests, sandro
Reply | Reply with quote | Quote
# Kristian K 2014-07-15 09:06
I am very interested in your rewritten LCD code. Would you be kind enough to point me to where you shared it?
Reply | Reply with quote | Quote
# Kristian K 2014-07-15 09:22
Also, could the 430mHz transmitting module be replaced with some off-the-shelf 2.4 ghz modules?
Reply | Reply with quote | Quote
# Sandro 2014-08-20 18:05
Hi Kristian and Jan. Finally I resolved!
Just find an Matrix Orbital emulator for serial lcd with arduino:
It's working!
Best, sandro
Reply | Reply with quote | Quote
# vocecyber 2015-05-08 01:35
Reply | Reply with quote | Quote

Add comment

     Security code Refresh
      Security word: This website is all about what? -   Clue = "ELE_T_O_I_S"

PayPal Donation

Feel free to make a PayPal donation no matter how small to keep this site and my video blogs going.

IanJohnston.com is powered by Joomla/IIS and hosted on a dedicated server.