Go Down

Topic: TLC5940 Woes (Read 8470 times) previous topic - next topic


Feb 06, 2011, 11:03 pm Last Edit: Feb 07, 2011, 12:27 am by AlexXx Reason: 1
Some of you might remember. I've been trying for a while to control 48 RGB LEDs with an Arduino. I'm still running into troubles, but I've learned a lot over the past year of tinkering with this stuff. I am having a problem now with a nice clean setup that I have made. I have put a lot of time into this project, and I would really like to see it succeed. :( So, read on if you are interested in helping me out. Thanks.

After completing a smaller sized prototype on perfboard, I bought 3 Brilldea LED painters. Here is a circuit diagram. Here are some pictures of my project. I can take more pictures upon request, feel free to ask.

If anyone cares to help me troubleshoot, this is what I did:

  • I populated the painter boards with one 0.1?F capacitor, one 1.0?F capacitor, and one 2.2k? resistor for each TLC5940 chip. I put two 10?F capacitors across the VLED lines of each painter board. (This is suggested on Brilldea's website)

  • I connected the painters in a chain starting from the Duemilanove, so I had something like this:
    [Duemilanove] => 2ft of cables => [Painter1] => 3.5ft cables => [Painter2] => 3.5ft cables => [Painter3]
    My painter setup is a spitting image of the example on Brilldea's website.

  • I connected 16 RGB LEDs to the first and last painters only. Painter 2 had no LEDs connected. It only passed signal and power through to Painter 3.

  • I connected a 12V 500mA power supply to the Duemilanove via the barrel jack.

  • I connected a 5V 2A power supply to the VLED screw terminal on Painter 1 and continued it down the chain to the other two painter boards. (Again, there is not much to the design, I followed the example on Brilldea to a T)

  • The positive lines from both power supplies were connected to a DPDT switch so that both lines would be switched at the same time when the switch is in the ON position. The grounds from the Arduino, VLED, and the two power supplies were all tied together.

  • I used these RGB LEDs. According to my calculations (page 14), using a 2.2 K resistor, each RGB channel should be sinking about 17mA max. That's about what I read for current draw in my prototype. So, assuming all 48x3 channels are drawing maximum current, that's about 2.4 Amps. :smiley-fat: I just realized that my 5v 2A supply is not sufficient if all of the lights are active. But, I only have 32x3 channels sinking current, since Painter 2 has no LEDs plugged in, right? That equals about 1.6 Amps max which is well below the limits of my 2A supply.

  • I couldn't manage to calculate the power dissipation of the TLC5940s because I am not sure what the value of dPWM is. dPWM is defined as the "duty cycle defined by BLANK pin or GS PWM value" (TLC5940 specs, page 15)

    If it helps, the TLC5940s are rated to dissipate 2457mW at or below room temp, so I have:
    PD =  (VCC * ICC) + (VOUT * IMAX * DCn/63 * dPWM * N)
    PD =  (5V * 0.5A) + (5V * 0.017A * 4095/63 * dPWM * 144)

    Where N = 16*3 channels per board * 3 boards = 144 (This assumes all painter boards are full of LEDs)

    So, maybe there's a power dissipation problem? I'll have to figure out the value of dPWM.

So, after all of this was finished. I ran a simple program to turn each channel on and off, one at a time:
Code: [Select]

#include "Tlc5940.h"

void setup()

void loop()
   for(int i = 0; i < 143; i++) {
     Tlc.set(i, 4095);
     Tlc.set(i, 0);

Making sure of course, that NUM_TLCS was set to 9 in my tlc_config.h file. Also, testing my Duemilanove with a Blink sketch first to see that it ran okay. I later tested the project using an Arduino Mega, and I noted similar results.

The results were this:

  • I flipped the switch to ON.

  • The lights on the Painter 1 lit up randomly, some channels on, some channels off.

  • The lights on Painter 3 lit up randomly as well, but they were very dim.

This leads me to believe that at the very least there is a power supply issue. That would make sense to me if I had all 3 painter boards populated with LEDs or if I programmed all of the lights to turn on at the same time, but I have done neither of those things.

So, I am stuck. The possibilities I can think of are:

  • VLED power supply is insufficient

  • Too much power is being dissipated

  • TLC5940 chips are bad. (The lights can turn on, but the data is getting garbled somehow)

  • Both of my Arduinos are broken.

  • Signal cables aren't securely connected to the Arduino

  • Something else is going wrong that I don't know how to check for

I've tested all of these to the best of my ability. I will obtain a 5V 3A power supply, but I am doubtful that this will fix anything besides the dim LEDs on Painter 3. If anybody has the slightest clue about what could be going wrong, please let me know. This setup isn't very complicated, and I feel like it really must be a simple error to correct. I am so close! Thanks.

EDIT: I think it would also be good to note that I soldered breakaway header pins to the end of the ribbon cable. I am using those to connect to the pins on the Arduino. The pins feel a bit looser than the wires I normally stick into the Arduino pins, but I don't think that they aren't making a good enough connection.

EDIT 2: I've posted more pictures in that album.


Have you changed the TLC5940 library to use 9 chips (three on each painter).
The other thing to worry about is the distance:-
[Duemilanove] => 2ft of cables => [Painter1] => 3.5ft cables => [Painter2] => 3.5ft cables => [Painter3]

Some of those signals are going at high speed and I don't see any thing to buffer them in the circuit.


Feb 07, 2011, 07:40 pm Last Edit: Feb 07, 2011, 07:45 pm by AlexXx Reason: 1
I wondered if distance would be a factor, but in the example on Brilldea's website they have a pretty significant length of ribbon cable between each painter. And if length of cable was an issue, I would think that the first painter board would at least function correctly, right? In any case, how would I go about buffering those signals?

On the bright side, I was just looking through those pictures I posted, and I noticed that Painter 3 was plugged in wrong. The ribbon cable was plugged into the OUT side instead of the IN side. I corrected that and all of the lights are bright now, but they're still displaying randomly.

I think I can rule out issues with the power supply, now. I'm going to try swapping out some of the chips later today, to see if that's the problem.

Oh, and I did change NUM_TLCS to 9 in tlc_config.h. I'm using Arduino in Ubuntu nowadays, though. Maybe I'll try it out in Windows just to be safe.

Thanks for the response, Mike. I know I wrote a lot, but it helps me to figure things out.


And if length of cable was an issue, I would think that the first painter board would at least function correctly, right?

Not necessarily. If you have a problem with reflections on the signal lines then it could affect the one closest to the signal source.
What happens if you disconnect all but one?
If is not so much a matter of buffering but rather that line impedance matching. You could try and put a pull up resistor at the far end.
You should try and look at the signals on a scope to see if they look right.


I unplugged the other painters so just Painter 1 was connected. It looked a bit different, so I replaced all of the TLC5940 chips on that board. Now it works great! I'm still waiting on more chips so I can test the whole system. In the mean time... When I run a program on just the first painter, it runs for a while and then crashes. This happens more often when I strobe all of the lights quickly then when I just leave them all on. Any thoughts? Thanks.


Need more decoupling, try a big bulk cap in addition to what you have already like 100uF or larger.


Across the LED supply or the Arduino supply? Or across the 5V supply coming out of the Arduino going to the TLCs? Again thanks for your help.


All are good but try it across the LED supply as close to the LEDs as you can get. If the LEDs are a long way from the TLC try the odd 100pf cap on the cathode to ground


Feb 10, 2011, 10:55 am Last Edit: Feb 10, 2011, 11:15 am by GekoCH Reason: 1
I got a similar problem with my project. I use a cable length of about 1m but when I do this
the TLC5940 draws 1.2A from my 2A power supply what for me looks like a short cut. But when
the cable is shorter ~20cm all works fine.
What can I do to prevent this "short"? Do I have to put caps in between?

PS: Sometimes it even draws 300mA without an LED connected (I did even change the Chip same result)



It has to be said at the outset that these things are not designed to be on the end of a long wire.

Excessive current draw can sometimes happen when it is oscillation. It is not clear what is at the end of your long wire the TLC chip or the LEDs.

If it is the LEDs then a very small capacitor (50 to 100pf) from cathode to ground might work. Try only connecting on LED at a time and see when it starts.
If it is the chip at the end of the line then try a 0.1uF from +5 to ground as close to the chip as possible. Also try pull up resistors on the signal lines and maybe even protection on the chip inputs.
Protection details http://www.thebox.myzen.co.uk/Tutorial/Protection.html


The stock tlc5940 Library is buggy - did this for me also.  Theres some info on the old forum about it - I can't find it atm but someone wrote their own lib that solved it.


Is the buggy stock library you referenced this one written by Alex Leone?

Because that is the same library as the one on the old forum, and it is the library that I am using.

Or are you talking about a different library? Thanks.


Feb 11, 2011, 04:41 am Last Edit: Feb 11, 2011, 04:55 am by AlexXx Reason: 1
Well, I don't think anything is wrong with the library. It more or less runs what I tell it to on a single painter board with 16 RGB LEDs. My problem comes when chaining the painter boards together. I've verified that each painter (3 TLCs per board) works fine individually. This means that there is trouble along that ribbon cable. It's good that the problem is more or less narrowed down to that, I suppose.

I just tried a few things and got some decent results. (Oh, I guess I never said, but my LEDs aren't very far from the boards. Maybe, 8 inches at most.)

I connected Painter 1 directly to Painter 3, so there was only about 3 feet of wire between them. That alone made Painter 3 function more closely to what I programmed; Painter 1 worked flawlessly. Then I tested out different capacitors across VLED/Gnd and Vcc/Gnd. The capacitors ranged from 1000?F to 0.1?F. I got the best results using a 0.1?F cap across Vcc/Gnd. Seems like I need some more decoupling, right?

The thing is, I already have 0.1?F and 1.0?F SMD caps across Vcc/Gnd for each chip, but they are very tiny. I could barely pick them up with a tweezers. I soldered them with a 15W iron, do you think I might have burned them up? Anyway, I'm considering putting 0.1?F caps in parallel across the smd caps on each chip.

Any thoughts? Thanks again for your help.

@mike: Oh, and were you suggesting putting a pull up resistor between the last pin's Signal Out and Vcc? Or which pins exactly? I wish I had a scope, but I won't be able to get my hands on one for a few weeks at best.


Yes - that library. Someone posted on the old forum that they had made some changes to solve the problem - I think on was to do with timings. I'll have a good search when I am at my pc.



Go Up