Today Hardware Friday post from Mario Vernari is one that I thought a little different than others I've blogged about (though related), one that helps solve a difficult problem and can might be a good kick off for building some Holiday hardware displays too...
Time ago, Stanislav -a Netduino community user- posted a problem on how to drive a 6-by-4 led-matrix using its Netduino. After some experiment, he got stuck with the circuit, because a matrix must be multiplexed, and that’s not easy to solve.
Here is the link to the forum thread.
If you read the message exchange on the thread, then you’ll collect easily a list of constraints. Here they are:
- the leds have been already assembled (i.e. only the multiplex driver is needed)
- the overall price should fall within 10 Euro
- must be handcrafted, thus no use of small parts (e.g. SMDs)
- the multiplex should not stop its cycling as the Netduino stops (avoid leds burnout)
- the circuit should avoid complicate wiring, so that the PCB can get pretty easy
- reliable enough
- finally, Stanislav asked to learn how to design such a circuit
It was clear that Netduino only wasn’t enough to drive a 6×4 led-matrix. First off, for the inability to give enough current for the leds, and secondly for the relative slowness of the managed code running into.
The problem in depth.
Light up a led is very simple. Starting from the power supply, as parameter you have the current flowing through the led, then calculating the resistor to put in series. A led needs from few mA (SMDs), to several hundreds of mA (or even more) for the high-power class.
Let’s face the multiplex problem thinking to a normal discrete-led which needs 10 mA for a normal brightness.
So, what is a multiplex?
The multiplexing is a technique for driving many loads (e.g. leds), using a relatively low number of wires. Thinking to a 6×4 led-matrix, instead having 24 wires (one for each led), the multiplex-way needs only 6+4 = 10 wires at all. The trick is enabling one column at once, and issuing the related row pattern. If this process is fast enough, our eyes can’t perceive the scanning.
Now, let’s focus on a single column of four leds: the scan process cycles over, but each column is enabled only at 25% (i.e. 1/4) of the total cycle-time. It means that to yield the same brightness as the led was lit with 10 mA, we should raise it of a factor of 4, thus 40 mA. This current is off the upper limit achievable by a normal logic chip.
By the way 40 mA is probably above the led’s limit. However, the current is flowing only for a quarter of the cycle, so there’s no warm up in the *average*. We only should take care to *avoid* any cycle break, otherwise the 40 mA will flow for a too long time, and the led blows.
That’s not all. When a column is enabled, there are 6 leds composing it, and they might be all on (worst case). So, the total current flowing is 40 mA x 6 = 240 mA.
How much is the current of each row, instead? A row drives only the led at where the column is enabled, but at 25% duty, of course. It means the 40 mA seen above.
To solve this problem, I see three ways:
I mentioned holidays? Well don't you see yourself coding something up to display some kind of holiday stuff with this? Come on, you know you want to code this to display some kind of little animated Christmas Tree...