Potential problems with large (50x30) led Matrix

Hey guys,

Am developing a new sculptural piece, the basis of which is a large matrix 50x30 which around 20cm gap between each led.

As this type of project has been done to death (gotta do at least one, right? :wink: ),

does anyone have tips regarding what they would have done differently?


Am planning on lighting each row of 50 leds (20mA 3.5V) at a time which draws 1000mA.
(Anyone have a great suggestion of power sources, converting a pc power supply?. Or just using a high amp wall wart, being enough?)

Each 'string' has a common ground with individual anodes controlled by 74HC595's, and powered through 2N3904's.

I am concerned regarding the best method of obtaining max brightness and reducing any flicker issues.
From my understanding there is a balance of duty cycle vs refresh rate i should be considering.

Any thoughts would be appreciated.


Describe your multiplexing more - sounds like you are not after individual LED control, just whole rows to be turned on/off?
With that kind of current, I think you will want logic level n-channel MOSFETs with low Rds values (5-7mOhm), so 1000mA will barely heat it up, while an NPN will be smoking hot!

If you are indeed after entire rows being on/off, I would string all the LEDs in series with a higher voltage source, maybe in smaller groups than 50 but still controlled together, then you only need 20mA per string and they share the voltage. Then your 200mA 2N3904 could handle 5 strings of 10 LEDs arranged as a row of 50 with (3.5 x 10) = 35V power supply and only need 100ma.

Thanks for your reply.

Yes, ideally i am aiming for individual control over each led.
(I intend for it to be a reactive installation/display - all the calculations will be done in the pc and im sending the bytes to Ardunio)

Would cutting the string into 5 'modules' be a smarter way to power it? Then i would have three strings of 200mA?
So 3.5x 17.5, im assuming i would then need a voltage regulator if powering with 24v?

I have on me 10 74HC595's and 100 2N3904's and 1000 leds..

Also would you be able to clear up the difference between a mosfet and bjt in a typical application like this?

Simple thing first - MOSFET vs BJT. Both can act like an electronic switch. The MOSFET just dissipates a lot less power doing it.
The BJT will have a pretty much fixed drop of ~0.7V across its Collector/Emitter.
Thus the power it dissipates will be driven by the current you pump thru: P = IV, so 1A & 0.7V = 700mW. Hot.
While a MOSFETs dissipation is driven by the current across its low turn-on resistance, Rds: P = I * I * R, so 1 * 1 * .005 = 5mW. Much cooler! All your power can by used by your LEDs vs the drive transistor.

Since you want individual control, you will need shift registers to control which columns you have High and which rows you have Low - the intersection of those 2 will be the LED that turns on.

Okay, see if you can follow me on this:
(more text in next message)

Okay, Here's what I envision:
You have a set of 8 '595s across the top of the array, outputting Col1, Col2, ... Col50, each one controls a transistor (or controls one channel of a ULN2803 driver if you want something more conveniently packaged, 8 drivers per 16 pin package).

You have a 2nd set of 4 '595s down the side of the array, outputting Row1, Row2, ... Row30, each one controls a transistor driver capable of sinking 20mA * 50 LEDs = 1000mA. Which is where the MOSFETs come in. (Or, use 2N3904s, and break the rows up into groups of 10 or something that the transistor handle, the '595can turn on several 2N3904's in parallel).

Your code works like this:
The top 595s get the pattern for Row1 shifted on, their outputs are enabled and then Row1 driver is turned on to light up the LEDs on Row 1.
While they are lit up, you shift in the pattern for Row2. Turn off the Row 1 driver, output the next Row (recalling that 74HC595 can have data shifted in with the Serial Clock, but its the Load Clock that actually updates the output), and turn on the Row2 driver, using the same approach - shift in the row to turned on, then clock it to change it. Repeat 28 more times.
Only turn on 1 row at a time, the current limit resistor is selected to let 20mA of current go thru the column transistor (LED anode is low), or thru the LED (LED then turns on when a Row transistor pulls its cathode low). If more rows are turned, then intensity will be different as more LEDs share the same limited current.

Maybe increase performance by breaking up the hardware into sections so only 16 bits at a time are shifted out for each update. Column data/serial clock & row data/serial clock can still be shared, just have more load clocks, limited only by the number of IO pins available.

Make sense?

You're gonna need more parts - 50 x 30 is 1500 LEDs. And 12 shift registers, unless you resize for the number of parts you have.

10 '595s is 80 bits, 80 transistors - just need more LEDs, and make one of the shift registers support 2 columns as well, just need to be a little clever coding it.
Will need 50 column current limit resistors, value determined by the forward voltage of your LEDs, and 80 base current limit resistors for the transistors so the HC595's don't burn out trying to drive them - the Base/Emitter voltage wants to go to 0.7V when driven, the resistor limits the current - pick a resistor that will limit current to the HC595's output level, which is 6-8mA if you want to ensure good voltage levels: (5V-.7V)/.008 = 560 ohm, 470 ohm at the lowest.

Wow, i love this community.

You have surpassed my expectations 1000%.

Thanks heaps for the extensive reply, all the numbers are now starting to make sense (datasheets are more easier to read now)
I made a mistake in the subject, should have been 20 not 30.

I plan on making a proof on concept in the weekend, so for that ill attempt to wire up 8x8 leds and get the software started.

Here is alittle schematic i made up for the proof of concept.

With 8 leds on each row lighting up at one time, that works out to be a 82 ohm resistor on every led/ column.

If im reading your post correctly i need a 560ohm resistor between the base pins (of the row transistors) and their relative bitshifter pin?


Also if i do choose later to try to light all 50 leds) do you have a type of MOSFET in mind? My searching isn't proving so successful.. noone has thought to create a mosfet calculator :wink:

If i use the parallel 2n3904 approach, how do you think i should power such an application? I intend on using a cell phone charger wall wart i have lying around for the test, but from it's readings i can (i assume its a max reading) draw up to 450mA from it.
So 450/20 = 22.5 -> so 20 leds.

In which case if i need to light 50 at a time, then i need 10v for 40 (two strings paralleled, running 20 in series).. and thats where my knowledge on power supply breaks down..

Thanks so much for your time.

560 between 595 & transistor base, yes.

Keep it at 5V, 10V just makes selecting parts harder. You can get a 4A supply here for little money.
I use this one for my projects.

Search at digikey.com
mosfet single n-channel
then start filtering one thing at a time:

  • in stock
  • logic level gate
  • surface mount or thru hole

doing the above, with thru hole as the last, yields 12 pages.
View page 1, then sort on Rds.
Go thru the pages & find a price & Rds you can live with, such as
http://search.digikey.com/scripts/DkSearch/dksus.dll?Detail&name=954-PSMN4R3-30PL127-CHP for 74 cents, Rds = 4.3mOhm.
http://search.digikey.com/scripts/DkSearch/dksus.dll?Detail&name=NTD4960N-35GOS-ND for 48 cents, Rds = 8mOhm

or, sort by price & scan down until you find a low Rds at a cost you're comfortable with.
I didn't look at surface mount; this should give you an idea of what to look for.