I've wanted to try controlling my Rover and Quadcopter with a Joystick, at first I thought I can use the simple potentiometer based joysticks like these.
Attach them to ADC and transmit the values over to the Controller.
Then I've decided its a good opportunity to try one of the USB Host I had
The USB Host module is based on the Maxim MAX3421E (Datasheet), which is a USB Host controller to SPI, accessible to Arduino programming. Oleg Mazurov wrote a very nice library for it and he has some very nice articles on how to use it, as well as explanations on how to patch the module to get 5 volts supplied to the USB device, which I needed for this project.
You will need to cut the wire where the red circle is and attach that wire to the pin marked in green. Otherwise the USB device will get 3.3v and its not enough for most devices.
Another thing to point out is that these modules work on 3.3v and need 3.3v signal, so a level converter might be needed if you're using 5v Arduino, if you're planning to risk it, then from my experience its not going to burn it, but you'll get an unreliable connection.
I've then attached it to a real joystick to see how if its working
As I wrote, Oleg did a very good job and I got a demo up and running in no time.
I've then thought it might be a good idea to send this data directly to a standard RC receiver, I remember I've found FrSky DHT transmitter (Manual) while looking up FrSky protocol.
The FrSky DHT is a DIY module which uses PPM as input and transmit the values to a standard FrSky receiver, it also has a serial port for getting telemetry back but I didn't use it at this stage.
Many people use it to modify their transmitters to FrSky protocol and you can find many guides on how to convert your own transmitter.
I've also ordered RX-F802 but as some people pointed out in the forums, it died quickly.
I've had another receiver which worked perfectly so I didn't get overly excited about it.
So now we have all the hardware we need and the software for reading the Joystick values, we're almost ready.
I've wanted an easy way to see the values as its being decoded, but keeping the serial port connected all the time is not always useful.
I've used LCD1602, but it has a parallel interface and I didn't want to connect so many pins between it and the Arduino.
To that end there's I2C to Parallel interface module based on PCF8574T (Datasheet), Frank de Brabander wrote a library for controlling LCD1602 with it, but it can be used for other purposes as well.
The interface is pretty simple, you instantiate it with the I2C address and the number of columns and rows and it does the rest.
You can switch the backlight on and off with
You can update the same location by:
- setCursor(uint8_t, uint8_t);
And you can even set 8 custom characters!
Pretty useful for such a low cost device!
So now we have all the components for our USB Joystick to PPM, I've hooked it up, added a switch and printed a box and then went ahead to test it.
I've set it up so each axis is displayed as -99 to 99 for 1000-2000ms and M0-M6 as controller mode matching ArduCopter flight mode values. The rest is not working yet, but the plan is to control channels 7-8 with the 'hat' on the joystick.
But having the numeric values in Arduino is not enough, we need to transfer these values to the FrSky transmitter, this is done with PPM, the basics are, there are 8 pulses, each one variable by width (or time), each one represents a channel and then there is a pause and it starts all over again, this is done about 30-50 times per second, so this thing is pretty fast, Joshua Bardwell have some numbers for you.
I've researched a few libraries but none of them were accurate or consistent until I've found ArduinoRCLib, I've used this library for other things and its very consistent.
You can find my source code here:
Now that we have a working transmitter, we need to check the receiver and see the values actually match.
I've created a simple PPM Display, it listens for PPM on pin 3 and using LCD to display the 8 channels received.
The design is pretty basic, ATMEGA168, 3310 LCD, based on PCD8544 (Datasheet).
Note that the LCD VCC must not exceed 3.3v, so you have to regulate the voltage, I've used A1117 3.3v for that, but its inputs are 5v tolerant (at least from experience) so no need for a logic converter like the USB Host module.
You can find the source code here:
I've hooked it up to a Mini FrSky Receiver and here are the results:
What happens is,
- First, monitor/receiver is turned on without a transmitter, you can see the values are in the middle (~1500)
- Transmitter is turned on, values are what the transmitter sends, note channel 6 is ~950, which means a flight mode wasn't set yet (M0).
- Roll is tested
- Pitch is tested
- Yaw is tested
- Throttle is tested
- Flight modes are tested
- USB Disconnected Failsafe is tested
- Transmitter power off failsafe is tested
I didn't have the guts to test it on a quad yet, I'll continue testing it on my new rover until I have enough confidence its working properly :-)
- Joystick 'Hat' to channels 7-8
- FrSky Telemetry Monitoring, a source code for the telemetry protocol, RSSI Configuration and hookup: