Using RC channels for data transmission


In the world of Radio controlled models, cars, planes etc. you have a transmitter and a reciever. You typically use one channel per function, like "throttle" or "blade angle" or "steer left/right". Most radios don't have more channels than you need, and buying the ones that have many (7+ channels) is very pricey.

I do have 2 spare channels in my system and I'd like to use them to transmit data between arduinos. One Arduino Pro in the actual handheld transmitter, and one on the receiving end, inside the model.
It feels like someone should have done this already. I can think of at least one way to do this, but I rarely think of the best way. :slight_smile:
Datarate requirements: 10 bps would suffice for what I'm doing.
Zigbee is an option, but an expensive and over-the-top one for most RC projects. I just need lot's of one way channels to trigger functions in the models.
As you may know, the RC channels use the same kind of pulses that you use to control a Servo, a PWM signal which is 1-2 ms long, where 1 ms means 0% and 2ms means 100%. Then, a pause for some time (20ms?) and so on.
This should allow for transmitting at least 16 different levels of signal in each pulse, typically. (1.00ms, 1.07 ms, 1.23 ms and so on antil 2.0 for instance?)
In that way I ought to be able to send HEX characters each ~30ms. Perhaps even more than 16 values, I'm not smart enough to do the math, by just reading a PWM input?

You can buy multiplexing units over the shelf at great cost. They will typically multiplex 10 digital channels and two proportinal channels over one RC channel. Sending data would make it much simpler though since I will be able to send clear text commands like "A50" would mean channel A set to 50%, or "BH", Channel B set to High and so on.

I googled but only found one entry from a guy thinking about doing it, and using two channels. How come the commerical ones can do it using just one? :~

Magnus, Sweden

The receiving end is simple, the sending end would depend on how your transmitter connects the user inputs to the actual IC that is doing the sending, my guess and it is only a guess is that this will depend on the transmitter type and that something that might work on my transmitter may not on yours.

Your best bet is to open up the transmitter and see what is connected to the channels you want to use.

Duane B

On the sending end, the transmitter will almost certainly have a simple potentiometer connected to the joystick, or a switch connecting one of two resistance values for a switched input.

I would have thought it would be easy enough to replace this with an Arduino-controlled driver circuit that switched between two alternate resistance paths depending whether an Arduino output was high or low.

On the receiving side there is already a servo input library which can interpret the PWM signal output by an RC receiver and return the corresponding 'servo position' value.

To use these as a comms link, you would need a library similar to SoftSerial on the sending side which output the bit stream as a sequence of high/low values on the pin that controlled the transmitter. On the receiving side you would need something similar to poll the 'servo position' and convert this to a sequence of high/low values which were then passed to a modified SoftSerial library that interpreted it as a serial stream.

You would need the bit rate to be substantially slower than the RC frame rate - which would usually be 50Hz. It may need some modification to the SoftSerial library to enable it to cope with baud rates this low. It would be prudent to include parity and sufficient stop bits to enable reliable synchronisation.

Note this is one-way only - there is no return path.

A 9 channel unit is only $50 right Duane?

It does look like a very good deal for 50USD, if anyone is interested, the radio we are talking about is a Turnigy 9X. as I mentioned in another thread I have never used one, but there are lots of positive reviews on the web.

So if your interested in a low cost highly functional radio do some of your own research and let us know what you think.

Duane B

I had a Turnigy 9X. Actually, three, before I gave up. They all came broken in one way or another, spent $100 on return shipping alone. Big bummer.

I recently bought a used Futaba FF-7 and installed an FR-sky 8 channel module with telemetry. A total of about $100 for a 7 channel hi quality system. But that's for my radio, this project should preferably work for others too. Like my friend with the RC Big Rid, he has an Futaba 12ch also with a FRSky module in the back.

You did all mention a good point, I hadn't thought the entire process through. How to connect inside the radio?
I guess the most efficient way is to hook the arduino up between the radio motherboard and the TX-module. There is some kind of PWM pulse train going on there, with 8 pulses in a row going to the transmitter. I could out the Arduino in serial there, listen to the signals from the radio, copy the first 6 or 7 pulses and then insert my own 8:th channel.

And as you say, the recieving end should be simple.

All in all, I think a lot of Arduino:ers could utilize this concept for making a cheap but powerful one way link. Even if you do not want to hook it up to a RC handheld transmitter, just get a "DYI module" and use... like this one:
RX: Radio Control Planes, Drones, Cars, FPV, Quadcopters and more - Hobbyking

The TC basicall uses three wires, Vcc, GND and Signal. That's 5 (or 8 with a different RX) channels for $25. With 5 simultaneous channels you should be able to get a very useable datarate.
Who knows, I bet you'd get satisfactory performance by getting a dual setup and sending data both ways independently.



I think there are many easier options for this, not my area though so someone else jump in !

Duane B

Thinking a little outside the box, your extra channels could drive "electric pots" ( MCP413X )

You control 2 virtual pots by sending them serial data. This would take 2 Arduino output pins each.
One channel produces a "clock" voltage and the other produces a "data" voltage.

On the receiving end, these two channels of analog voltage can be treated as digital, probably thresholding first since you will not have a full 0
or full 5v coming from these 2 extra analog channels. The "clock" and "data" now go into a shift register chip, which latches the data inbetween chars.
These bits of the shift register could control hardware directly, or be read by the Arduino and used to control something else.

It would be like you're spelling out a letter in code by quickly flipping a joystick up and down, using 0 and full only.
I'm not saying this would be cost effective or very fast.
It is, however, pretty unique, novel, and capable of a huge number of digital bits using only your 2 channels.
You might need a "sanity check" - if you are sending out say 64 bits of data and receive only 60, you don't latch the data.