Google Ad

Project 020 - RC Joystick Tx V3 - USB Version

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.


This version of my RC Joystick follows off the back of the previous version here which differs in that this version interfaces to a standard un-modified USB PC Joystick.

As before, this version is Arduino powered and uses a USB Host Shield to provide the USB interface to the PC Joystick. All the electronics is housed in a small satellite enclosure mounted off the joystick.

The software has been hugely modified and upgraded over the original joystick, and to facilitate this uses an Arduino Mega.



The basic parts required:

1 * Arduino MEGA 2560 (MEGA 1280 will possibly work)
1 * USB Host Shield (P/N=DFRobot DFR0138, Circuits@Home Rev 2.0, Tinyos Rev 2 or Sainsmart Usb 2.0)
1 * Logitech Extreme 3D Pro
1 * 16x2 LCD (LiquidCrystal library)
1 * Thomas Scherrer's 430mHz LRS kit (any model will do) c/w antenna, connector & coax.
1 * Battery (i.e. 3S Lipo, 1500mAh, approx. 2hrs contiuious use)).
1 * Enclosure.

The following will not work (although possibly will with some library mods): Sparkfun USB Host Shield & Arduino Mega ADK.



8-ch PPM output (channels can be re-assigned).
Model Select (4 model memory).
Battery voltage display and usable capacity in %.
Selectable High, Mid & Low rates.
Aeleron, Elevator & Rudder trim (for each of the Rates. On main panel & stick top hat).
Elevon Mode.
Exponential Aelerons.
Exponential Elevators.
Exponential Rudder.
Invert Aelerons.
Invert Elevators.
Invert Rudder.
Invert Throttle.
Aux Switch1 (main panel).
Aux Switch 2 (main panel).
Aux Pot 1 (additional ability to send to 0%, 50% or 100% via thumb switch).
Aux Pot 2 (additional ability to send to  0%, 50% or 100% via trigger switch).
Display RAW & PPM data.
Timer (with throttle inhibit)
2off Aux channels can be used with Top Hat control for pan/tilt ouptuts, or Trim

Button 7 = FUNCTION Backwards
Button 8 = Trim- / OFF / DOWN / LEFT / TIMER START&STOP
Button 9 = FUNCTION Forwards
Button 11 = Aux Switch 1
Button 12 = Aux Switch 2
Button 5 = Aux Pot 1 UP
Button 3 = Aux Pot 1 DOWN
Button 6 = Aux Pot 2 UP
Button 4 = Aux Pot 2 DOWN
Top Hat = TRIM ADJUST / Aux Pot 1&2 UP/DOWN (mode dependant)

Close up of the 16x2 LCD showing some of the screens including:

Main screen showing battery capacity (%), voltage. current Rates selected, AuxPot 1, AuxPot 2, Aux Sw 1 & Aux Sw 2 status.
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. Example below for Hi rates:-


Elevon mode selection:-

Exponential mode selection:-


Invert mode selection:-


Aux. Pot. Thumb & Trigger setting. The available settings are 0%, 50% and 100%. These are extremely useful when used in conjuction with the Top Hat mode below and used to centre the camera at the press of the thumb or trigger switch:-

PPM Output re-assignment. Completely flexibility over which functions are sent to each channel, even allowing for duplication:-

Test Mode. See the raw value from the stick potentiometers/switches and also the configured PPM channels:-

Timer, included a Throttle inhibit function. When used in throttle inhibit mode the timer will pause when the throttle goes below 1%:-

Model Select. Allowing for 4 models, all parameters are saved for each model:-

Joystick Top Hat Function. Allows for changing the Top Hat function between controlling AuxPot 1&2 outputs (Pan & Tilt camera perhaps!) or Trim functions on AEL & ELE:-


 Here's a run down of how the menu system works on the LCD. Not 100% complete but it will do for now:






Here's the PPM output from the Arduino showing the 8 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.
The refresh rate of the entire PPM stream is set at 22.5mS. It is Futaba compatible.


I haven't tested this myself, but some of the good peeps over at RCGROUPS have reported that the DM8 module will work with the following must be noted and applied.

Quote "I put a 4.7k resistor in series with the PPM output of the Arduino and the base of the 2N2907A transistor. I also put in a pullup resistor from the base to the emitter to make sure that the 2N2907 was hard off when the Arduino PPM output is high. Using the PNP transistor results in no inversion of the PPM signal unless it is inverted in the software.

The pulses are positive going. So at the beginning you create a 400uS pulse. But the time for the first position starts at the beginning, so you subtract 400uS from the desired pulse and pause that long. When that time elapses you create another 400uS pulse, then pause for the desired position (minus 400uS), etc.
In other words it is necessary to deduct 400uS from teh values entered for the low, mid & high settings".




PPM CHANNELS (can be re-assigned via the LCD):-
PPM Ch.1 - Aeleron - Elevon mix Aeleron 1 (Invert mode) (Exponential mode)
PPM Ch.2 - Elevator - Elevon mix Aeleron 2 (Invert mode) (Exponential mode)
PPM Ch.3 - Throttle - (Invert mode)
PPM Ch.4 - Rudder  - (Invert mode) (Exponential mode)
PPM Ch.5 - Aux switch 1
PPM Ch.6 - Aux switch 2
PPM Ch.7 - Aux potentiometer 2
PPM Ch.8 - Aux potentiometer 1
ARDUINO I/O PINS (Dig. & Ana.):-
Ana Pin 0 = Battery Voltage Monitor input (2 resistor voltage divider necessary)
Dig Pin 13 = Buzzer output
Dig Pin 12 = PPM output
Dig Pin 2  = LCD D7
Dig Pin 3  = LCD D6
Dig Pin 4  = LCD D5
Dig Pin 5  = LCD D4
Dig Pin 6  = LCD RS
Dig Pin 7  = LCD ENABLE

1. Use a 5.6k & 1k voltage divider (or a trimpot) so the input sees 2.2v approx. for a 12.6v battery voltage. There's a multiplier in the code to adjust further.


The Logitech joystick has 16 switches in addition to 3-axis stick and the throttle pot, as follows:-

Aeleron stick pot
Elevator stick pot
Rudder stick pot
Throttle pot onbase
Top Hat
Switch 1 = trigger
Switch 2 = thumb
Switch 3 = top panel left side
Switch 4 = top panel right side
Switch 5 = top panel left side
Switch 6 = top panel right side
Switch 7 = base panel
Switch 8 = base panel
Switch 9 = base panel
Switch 10 - base panel
Switch 11 - base panel
Switch 12 - base panel




Download the code here, and the USB Host library here. It is compatible with Arduino IDE Version 1.0.5 (Arduino Mega 2560).

Note: You must use the USB Host library provided. The original library is from Circuits @ Home but has a bug in it which I have fixed.

Please note that the software is continually being updated for bug fixes and new features being added.



Photos of the finished joystick, including the internals.
2x16 Lcd on the top, antenna out the back, power switch on the side alongside the charge socket and Arduino USB connector:



The Lcd is mounted on the lid, the battery, Tx pcb, Arduino Mega and Usb Host Shield:


The Lcd on the lid:


Side view:


Some photos of the software development in progress: