# Driving LEDs at long distance

I'm looking to drive 52 LEDs (datasheet), around a large inflatable tent. The LEDs have a forward voltage of 3.3V, at a maximum of 20mA.

I'm thinking of using the NXP SAA1064 I²C 16-channel LED controller (datasheet), which seems to be exactly what I'm looking for, since I can drive one as master and another 3 as slave, giving me a total of 64 channels. All of this will be driven by an Arduino.

Update: After reading the controller datasheet, it seems to be that it's not possible to individually control the outputs - it expects to drive a 7-seg. Is this true? If so, are there nice alternatives?

What I'm not so sure on is how to handle the distance. The tent is around 25ft long, and 10ft high, and the LEDs are placed around the dome. The controller board runs at one corner, which means that the furthest LED will be around 30ft away from the device. The cables to the LEDs have to be relatively thin, since the inflatable tent can't take a huge amount of weight. I can see resistance being a problem.

The way I figure, I'm probably going to end up with ~100Ω on the longer cables, which is going to make those LEDs all but invisible. I considered ditching the controllers for shift registers and transistors closer to the LEDs, but that means more cables, more weight, more complexity, and more cost.

Is there a nice solution to this?

• Referring to the controller: even when it is designed for 7-seg displays, you can still hook 7 individual led's to the controller forming a "custom display". The controller probably doesn't care whether the led's are arranged in a display or not. So when you display a "3", no 3 is shown but 4 led's light up. Sep 16, 2012 at 10:42
• What about making clusters of leds that communicate to the other clusters to sync up for stuff. Are you looking at PWN control? Or just Digital? The Arduino Mega has 54 digital pins. Sep 16, 2012 at 10:44
• @PetPaulsen I figured as much, but I need individual control of each LED. Sep 16, 2012 at 10:44
• @Hellonearthis How would I go about driving 54 LEDs from an Arduino Mega? I was under the impression that the total current limit for the device was quite small. Is it just a case of driving at most n LEDs at once, in quick succession? Also, how would I handle the long distance issue? Sep 16, 2012 at 10:45
• @Polynomial - I think you are correct. Driving all the LEDs from a single IC will be problematic from a total package current and power dissipation standpoint. In addition running 54 wires around the tent is next to impractical. Even if you placed the MCU board in the middle and ran 27 wires each way it is rather impractical. You want to think in terms of some type of bus structure where you send stuff serially down a small number of wires. Sep 16, 2012 at 12:32

If you want individual control of each LED then you will want something like this shift register LED driver. The TLC5916 chip can drive displays that are connected to a range of voltage. It also will use a constant current technique for each segment to keep brightness even for all LEDs. It may be advisable to still put some resistance in series with each LED before connecting to the TLC5916 outputs to share some of the voltage drop and reduce power dissipation in the driver chip if you are running with a higher LED drive voltage.

You can obtain the TLC5916 chips from Mouser in both DIP and SOIC package styles. The data sheet is available from there as well.

I do not think you need to worry too much about the length of the wire causing a lot of resistance. For 20mA you do not need a very big wire diameter. Even something small like 30 AWG wire can handle well over 100mA and is ~10 ohms in 100 feet.

If you use the driver chip I recommended you could use a distributed design where you run the serial data controls from chip to chip in the LED harness that goes in groups of 8 LEDs at a time. Local short wiring to each LED would be possible. The control signals, CLK, DATA and LATCH plus the sets of eight local LED wires could easily be done with small wire like 28 or 30 AWG stranded wire for flexibility. The distributed POWER and GND would need some larger wire to deal with the overall power. Your 52 LEDs at 20mA each equates to just over 1 Amp plus the total of 7 of the LED driver chips will consume approximately 15mA per chip so add on another 105mA. Seems like a 1.5A supply would work nicely for you. For the two supply leads I would recommend a slightly larger wire size such as 18 AWG. This can carry the total current required and it can run a total if 156 feet and only have 1 ohm of resistance. This particular pair of wires is important because you want to minimize the voltage drop across this part of the circuit as much as possible.

The LED driver chips want to have their VDD pins connected to +5V. You should be able to also drive the LEDs from the same 5V supply line. The driver data sheet (Fig 14) shows that when you set the constant current sink for 20mA the chip's output drop will work nicely at anything greater than about 0.5V. With the LED VF of 3.3V the driver chip would be operating with an output voltage of (5 - 3.3) = 1.7 volts. If all of the 8 LEDs for one driver were ON at the same time the output power in the part would be (1.7 x .020 x 8) = .272W. This is well within the power rating for the driver chip and no series resistors for the LEDs would be required.

Using this scheme the micro controller board would have very simple wiring using only three I/Os. The software would run the LED driver shift register chain with a slow bit-banged CLK and DATA stream for 56 pulses and then drive the LATCH signal with a single pulse to update the outputs to the LEDs.

Each of the LED drivers could be designed onto a narrow little PC board that could be covered over with a piece of white shrink wrap tubing. Three small free hanging wire harnesses with inline connectors could be left sticking out of the ends of the heat shrink tubing. One with 9-pins to connect to eight local LEDs and two others to work as daisy chain connector cables to reach to the next driver in the chain. One of the cables ends would be made long enough so that it reached to the next display driver's input connector.

You had mentioned a total length of something like 30 feet over 52 LEDs. This puts a modularity of ~4.5 feet from driver module to driver module. That would give you an idea of how long these cable stubs on each driver assembly would have to be. The wires inside the heat shrink tubing could be soldered directly to holes in the small circuit board.

• The TLC5916 that you recommended above -- do you have any thoughts on why it is that its supply current draw is proportional to the current-setting resistor? (Page 9 of the datasheet) The current drawn by the IC for its logical operation alone should be a constant (and a fairly small one), shouldn't it? Sep 24, 2012 at 16:16
• @boardbite - The supply current (I<sub>DD</sub>) varies according to the value of the current setting resistor because the chip shunts current out into the current setting resistor. In normal operation the chip sets the voltage across this resistor to an internally regulated value which then induces a current through it. That current is sourced from the V<sub>DD</sub> pin. In a special operating mode the voltage across the current setting resistor can be programmatically set to allow fine tuning the current in circuit. Feb 26, 2017 at 16:41

Here's a slightly alternative idea, why not use a ready made solution? You can buy strings of addressable LEDs, and there's Arduino code to control them.

There are loads of different types available. Big ones, little ones, strips, RGB, single colours, waterproof or bare PCB. And they're super easy to use. They tend to come in 5m lengths, and you can easily string several together. Or you can buy the individual modules, and wire them up yourself. They're pretty cheap at \$1.05 each.

You can get them on eBay, or direct from China from Ray Wu's store at Aliexpress. I have used him before, and been satisfied with the results.

• Or This Sep 19, 2012 at 2:27

I have done this before. I ended up running 4 wires, gnd, vcc, clock and data (you can probably do it with three and not have a clock, but a clock is easier). At every led I had a tiny avr 8pin processor that would shift in bytes via clock stobes. Each one was programmed with a different value so I could control the LEDs individually.

I would send data to each one then issue a global command so they could all change there led states simultaneously.

You might be able to get 1bit serial latching shift registers cheaper than at tiny's but I found the processors were usually cheaper.

This was a lot better than running 50 wires.

If you drive LEDs with constant current lead resistances will not affect brightness - only the voltage needed to achieve a given current.

Available drive voltage is supply Voltage - LED operating voltage.
Look up VLED at desired I_LED in data sheet.
Applying basic Ohms law concepts gives:

Vmin = (ILED_required x Rleads) - V_LED

and, rearranging.

R_lead_Max = (Vsupply - V_LED) / I_LED

Any LEDs that operate identically can be operated in series. This may reduce required wire weight depending on relative LED locations.

If not all LEDs are not operated at once consider a heavy ground return and lighter power leads.