(Note: you can view videos of the array in action in the 'Files' section)

Design:

A standard matrix text display has a 7x5 grid, I went for three characters allowing for space, for a 7 row, 18 column display.
I decided on using my Lattice XP2 Development Board to generate the control signals, as it had enough pins to drive the array and I could get something up and running simply and quickly without fussing about libraries and code timings.

Parts:

I selected the components online, which took quite a while to calculate the power ratings needed and choose through all the options. I settled on 7 SOT-23 p-channel MOSFETs to drive the rows, these tiny puppies will handle 20v at 1A! They're smaller than a grain of rice, but I figured I could bodge them across three corners of the tripad board I was intending to use for the interface between the fpga and the leds.

To drive the rows, I chose a 7x Darlington array, and like the MOSFETs I checked they would be compatible with 3.3v logic thresholds.

I made a slight slip up here, as the MOSFET gates were referenced to the positive rail (which was 5v above ground) so when it came to testing the FPGA outs were barely tickling the gate. This was easily remedied by adding a spare 7x array of the darlingtons as an inverter, to drive the gates in conjunction with a 1k2 Ohm pull-up.

For the LEDs I chose a classic red (no flange!) in a red package, mainly for aesthetics than any practical considerations. I narrowed down the available parts based on brightness and, of course, cost.

The total Bill Of Materials came in around £20 which seemed reasonable.

I designed the circuit very conservatively, going over and above worst case current draw so I could be absolutely sure nothing would burn out.

Construction:

First off I soldered all the LEDs together. This was more of a fun task than you might guess, becoming quite a meditative experience! I formed the legs 7 at a time in a kind of 'engineers hand' way, soldered all the cathodes in a line and then the anodes across, building it one column at a time. I estimate this took about 4 hours in total.

You may notice a familiar setting - I discovered a kitchen extraction fan is excellent for soldering!

Detail of LEDs coming together

The complete array

Next I wrote the code in VHDL for driving the LEDs. This came together surprisingly quickly once I had formed a plan of attack in my head. The text is stored in seven 72-bit shift registers(!) that loop round. 18 bits are siphoned off to the columns, with a multiplexer driving rows consecutively. The clock is divided down in a manner similar to a numerically controlled oscillator, where a 4-bit value (fed from the board's 4x dip switches) is added to a 25-bit counter, the msb of which clocks the rest of the logic.

I also added two LFSR noise registers to make a pair of flickering eye LEDs.

The next part was to solder the transistors together in a meaningful way, this again was fairly straightforward, just a matter of being methodical and carefully checking the pin-out. The control data was linked across using a ribbon cable connected to the 40-pin header on the dev board.

The SOT-23s were quite fun to solder, you can't escape a bit of SMD action these days!

Once the gate threshold mishap was rectified, I had a working array, ready to be fitted to the body of the lantern which I had completed in two worshop sessions using materials kindly supplied by the organisers (I didn't forget to make a donation to the festival too!)

Debugging:

After running the display I noticed a slight ghosting between rows, which I solved by narrowing the row pulses to avoid overlap. this wasn't the most refined solution. but it worked and decreased dynamic power consumption so I was fine with that. I wanted to avoid 'mission creep' and I can always investigate the timings more thoroughly later. I have since been told...

Read more »