Ever alert to the causes of my wife's grumpiness, I decided to cheer her up by making an animated, brightly lit drinks coaster.
Here it is under a gin and tonic:
And here it is, glass-free, displaying a spinning galactic ice-cube.
The coaster can be driven from any PC with a serial port and will display any 10 by 10-pixel video you wish.
Step 1: Buy Some Parts
30 1K 0805 resistors (R1 - R30)
30 MBTA42 NPN transistors (Q1 - Q30)
10 100 Ohm 0805 resistors (R31 - R40)
10 FMMT717 PNP transistors (Q31 - Q40)
5 74HC594 SOIC shift registers (IC1 - IC5)
4 100nF 1206 capacitors (C1 - C4)
100 TB5-V120-FLUX-RGB8000 RGB LEDs (LED00 - LED99)
The LEDs can be hard to get hold of at a decent price; eBay is once again the friend of the penurious electrical engineer.
Step 2: Make and Assemble the PCB
Assemble the board, taking great care when soldering the surface mount components. I found this one to be right at the limit of my dexterity. Note that there are two different types of SOT-23 transistor, and two types of 0805 resistor on the board. Look at the bottom silk layer to see the component names (R23 etc) and use this to match against the parts list in step 1.
Once you're done, your circuitboard should look like this.
Step 3: Drive the Board
1 2 3
4 5 6
The corresponding signals are:
1. XVOLTS - drive voltage for LEDs. Connect to 4V current limited supply.
2. SERIAL_CLOCK - shift data from SERIAL_DATA on positive-going edge.
3. SERIAL_LATCH - latch 40 bits from shift register to LED control on positive-going edge.
4. GROUND - common ground.
5. 5VOLTS - supply voltage for control circuitry. Connect to 5V supply.
6. SERIAL_DATA - input data for shift register.
To scan the display, clock 10 4-bit numbers into the shift register. To clock in a bit:
- bring SERIAL_CLOCK low
- modify SERIAL_DATA
- bring SERIAL_CLOCK high
Once 40 bits have been clocked in, the SERIAL_LATCH signal can be brought high to transfer them to the LED control circuitry. Each 4 bit number selectively enables the red, green and blue LEDs in one row, and selectively disables all LEDs in one column. So if we clock in a string:
0011 0100 0111 ...
RGCB RGCB RGCB
This sets all the LEDs in row 0 to blue, all the LEDs in row 1 to green and all the LEDS in row 2 to cyan (green + blue). It disables all the LEDs in columns 0 and 2. By rapidly clocking in various combinations of values (typically with only 1 of the 10 column-disable bits low), we can scan the array to build up an image, and use pulse-width modulation to give a range of apparent intensities.
The attached firmware can be used with an Atmel ATmega644 to generate the required signals in response to serial input from a PC or Mac.