Project: 16x24 RGB LED Array

This project is an array of LEDs, sized to fit an alcove in my apartment living room, about 35 inches wide by 58 inches tall. The LEDs will be RGB, with fullcolor pixels arranged 16 wide by 24 tall. Each pixel will be 2 1/8 inches square. There are a total of 384 pixels, and 1152 individually controlled LEDs. The array will be used to display informational graphics, audio visualizations, and tunable ambient lighting.


The most significant part used in this project is Texas Instruments' TLC5940 LED PWM driver. It uses a clocked serial data input, and provides 12 bits of PWM resolution on each of 16 outputs.

Normally, the TLC5940 would require one output for each LED element. Since there are three elements per RGB LED, this would add up very quickly; the planned array would require 3 * 24 or 72 TLC5940 chips. At $3 to $4 per chip, this would go over the budget I'm comfortable putting into this project.

Instead, I will strobe the TLC5940 through several rows of LEDs. The shift data input can be operated quickly enough to run a few PWM cycles before having to switch to a new row. This allows one TLC5940 to control six LEDs per channel, for a total of 96 LEDs with full PWM control per chip. That cuts the number of required TLC5940 to 12, one for every two rows of 16 fullcolor pixels.

Since the TLC5940 is a sink-type driver, I am using common-cathode LEDs. The TLC5940 controls the cathode, and power is strobed into the red, green, and blue anodes. At 600Hz or above, this provides a flicker-free appearance due to the eye's persistence of vision, since each LED is being activated 100 times per second.

The rest of the electronic design involves storing pixel data, generating a grayscale clock, and shifting data out fast enough to achieve flicker-free operation. These functions will be controlled by an Atmel ATmega micrcontroller.

The TLC5940 grayscale clock is an important consideration. It can run up to 30MHz; in practice, 10MHz or more is required to provide fast enough update at 12-bit PWM resolution. Also, the microcontroller must generate a blanking signal every 4096 counts of the grayscale clock. Experiments have shown that an acceptable approach involves tapping into the microcontroller external oscillator and using one of the microcontroller's timers to detect when 4096 counts have occurred.


Design of the enclosure for this project is important, because the final appearance and operation of the device will depend on the materials chosen. Each pixel must be separated by a light-proof barrier, and the front of the array must be covered with a material that won't block much light, but still diffuses the LEDs well.

The Sketchup render above shows the concept for final construction of the array. The LEDs will be mounted on long PCB strips, and will extend through holes drilled in the back panel of the array. The separators between pixels will be thin wood partitions, slotted to fit together eggcrate-style. The front surface of the array will be thin white polystyrene diffuser panels; this material is available in the Home Depot lighting section and works well.

Experiments / Prototypes

The images below show a 16-element array that was used for testing electronic concepts for the final design. It proved that strobing each color was a valid method of extending the control abilities of the TLC5940 driver. The test array was controlled with an ATTiny84 microcontroller.

The images below show another 16-element array constructed to test the dimensions and the choice of diffuser material. The breadboarded circuit above was transferred to a proto board.


Project Status


  1. Define features
  2. Select components
  3. Design schematic (partial)
  4. Develop microcontroller code (partial)
  5. Design printed circuit board (partial)
  6. Locate component sources
  7. Order parts
  8. Construct and test prototype
  9. Construct complete device

Submitted by Garrett on Sun, 03/09/2008 - 18:49.

Wow, thats an ambitious

Wow, thats an ambitious project!!
Good thing thats coming along flawlessly :-D
Where did you find Common-Cathode RGB leds?
And how much were they?

Looks awesome. Shall attempt

Looks awesome.
Shall attempt something similar before I leave university and lose access to the mechanical workshop.
Same question here, which LEDs did you use? I can only seem to find common anode ones.

Hi, nice project! : ) I have


nice project!

: )

I have a question:
You multiplex the LEDs, what kind of grayscale clock do you use?
I think it has to be 30MHz, because 30MHz/4096/12/6 = 101Hz:

4096 steps
12 driver TLC5940
6 way mux

Is it right?

How do you mux the lines? Via Fets?

And what about the current consumption? Do you really design the Led current to 20mA.
It would blow up the current consumption to 23,04Amp.

I am looking forward hearing from you!

Best wishes from Germany,


Actually 23 Amps at about

Actually 23 Amps at about 2-3 volts is not that bad, you just need a decent transformer, right?

How did you handle that issue?

Regarding both of the above

Regarding both of the above questions...the grayscale clock is 16MHz from the CKOUT pin on an ATTiny dedicated to each row. This project is actually still in limbo, about half the LEDs soldered and the controller boards need to be completed. I didn't get it done in time for Maker Faire. :(

The power supply issue is solved quite easily with an extra computer power supply I had on hand. Those can put out 30 to 40 amps DC at 3.3 and 5V. Even a nice separate 5V rail for my logic boards.

I'm using p-channel MOSFETs to switch the LED anodes, and connecting the TLC5940 sink outputs to the common cathode. Technically, I could have done it with common-anode LEDs. That would require connecting three TLC5940's to six rows of 16 LEDs, with six red cathodes connected to one channel of one TLC5940, six green connected to a channel on another TLC5940, etc. Then I'd have to use a high-side switch to power the common anodes of each row in turn.

can i request 4 d schematic

can i request 4 d schematic diagram of dis project?

Hi! I'm doing a similar

Hi! I'm doing a similar project with 24x16 leds. The matrix is divided to 6 separate 8x8 sections, each section containing a pic18f4580 (@32 Mhz) doing all the pwm and multiplexing stuff.

what's the estimated cost of

what's the estimated cost of this? looks like something i'd want.

Hi there, I check back every

Hi there,

I check back every day to see if this project is finished but no posts. Any chance you'd be kind enough to post an update?


It's only partially complete

It's only partially complete right now. I moved, so the place I originally was going to put the array is gone...I am converting this to a coffee table. I was also looking for a better way to make circuit board for this; I figured that out, so I hope to get this rolling again.

hi there WOW ,

hi there
can i see your rgb lrd driver schematic circuit if possible ?
thx a lot .

Hi, i'm at the design stage

Hi, i'm at the design stage of a similar display and came up with the same solution as you before i found this site.
My array is slightly smaller at 10x20 leds so i'll probably use the TLC5940's directly (needs 13 chips) and just multiplex the Red, Green and Blue lines of the array.
If i'd not bought the LEDS first (from Ebay) i'd have gone for common anode LEDs as they seem to be what all the controller chips are made for.

One thing i don't quite understand at the moment is why you (and others on the net) are pulsing the Blank pin every 4096 clocks.
As far as i can see from the data sheet it's only used to blank the display, it also resets the greyscale counter but won't that just wrap if you don't reset it ?

I'm using Pic micro on mine as that what i use at work.

Any updates on progress of your display ?


The counter stops when it

The counter stops when it reaches maximum count. From the datasheet:

"When the counter reaches a count of FFFh, the counter stops counting and all outputs turn off. Pulling BLANK high before the counter reaches FFFh immediately resets the counter to zero."

I've driven these with the internal clock output from a PIC and a timer to interrupt when the blanking signal is due and it works well.


do you think you could post

do you think you could post the code for this project. im trying to accomplish something similar but cannot get my update rate quick enough

nice i like to try your work

nice i like to try your work

Can you explain a little

Can you explain a little more on how you were able to use common cathode LEDs with the TLC5940 chip?

Can you send me the

Can you send me the Schematic Diagram of this above mention project.

would you please send me the

would you please send me the Schematic Diagram of this project
Thank you

Hi, It's a nice ting you're


It's a nice ting you're working on over there.
I'm working on a kind of similar project.

As I understand you multiplexed the 16 outputs of the tlc5940 with 16 multiplexers.
1)How did you wire this?
2)Does the LED get RGB signal at the same time? (Using 3x TLC5940 one for each colour)
Or do you strobe this as you explained. First Red than Green than Blue (Using only one TLC5940)

I am not a programmer and learn by teaching myself.

3)Do you still have the code and the schematics?
4)Can you please send me an email with the code and schematic? So I can proceed with my study

Thanx in advanced,

ooh almost forgot. my email

ooh almost forgot.
my email is

Hey there, Interesting idea

Hey there, Interesting idea to multiplex all the outputs to save money, but can you achieve a decent frame rate like that? If yes, is the brightness still OK? Also if you use TLC5940's on common cathode matrices you will only be able to control all colours at once (i.e. white light), but I'm sure that's just a typo.