Intro: Disco Drinks Coaster
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
You will need:
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
Manufacture one or more PCBs using the attached Gerber and drill files. A double-sided PTH process is required, so it is probably best to use one of the various small-volume professional PCB manufacturers; I have found PCB Train in the UK to be fairly reliable.
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
This is the tricky bit. You need to use something (probably a microcontroller) to drive the board in a way which generates an image. Attach power and data cables to the connector in the bottom right of the board. Seen from above, we number the six pins:
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.
Step 4: A Warning and a Tip
A couple of words of warning. Modern LEDs can be very bright indeed. You could probably hurt yourself pretty badly by dialling them up to full intensity and ignoring your look-away reflex, so don't. Also, when debugging your firmware it is easy to stall the scanning process and burn out the precious LEDs. Use a decent current-limited bench power supply, with the current dialled back to a few tens of milliamps to avoid this happening.