In this project we use every pin on the Arduino to achieve as much control over a set of LEDs as we can. The functionality of the vodka shelf includes:
1. Power 8 sets of two 4 pin RGB LEDs
2. Create two separate colors which are staggered across the surface
3. Turn on and off any set of LEDs
4. Micro controller control of the color and lighting patterns
5. Optional manual control of the LED colors using knob potentiometers
Your eyes are sensitive to only three colors: Red, Green and Blue. All other colors excite the RGB receptors in your eyes in different proportions allowing you to interpret that color. Thus by sending certain amounts of Red, Green and Blue wavelength light into your eyes it appears as though you are seeing different colors. This is how your TV works, if you look really closely you'll see its made up of many small R,G,B lights. We experience this every day. Its just really cool to be able to control it for yourself. I was amazed to when I turned on the Red and Green lights and Yellow appeared.
R+B = Magenta,
R+G+B = White
G+B = Cyan
The easiest way to control the relative amounts of light we get from each LED is by using Pulse Width Modulation (PWM). Instead of turning the lights slightly on by applying a lower voltage we turn them completely on then completely off for a given amount of time over a short cycle. For the arduino, this cycle is approximately 500 Hz. Our eyes respond too slowly to see the fast blinking and they give us the average over time, approximating having partially turned the light on.
Step 1: Materials
-16x RGB LEDs: These are actually 3LEDs built into one casing. They have 4pins, one for each LED anode (+ve) and one common cathode (-ve). These are easy to find on the internet and can be found cheap on ebay. I paid $10 for 50. A good current rating is around 15mA (per internal LED).
-3x 100K Potentiometers: I used knobs
-Protoboard or breadboard + wires, an arduino prototyping shield is ideal.
-16x 2N3904 N-channel Bipolar Junction transistors, very common and inexpensive. Ebay.
-6x 10 Ohm 1/8 Watt Resistor
-8x 1K Ohm 1/8 Watt Resistor
-8x 100 Ohm 1/4 Watt Resistor
-8x 64 Ohm 1/4 Watt Resistor
-8x 56 Ohm 1/4 Watt Resistor
-1x 10K Ohm 1/4 Watt Resistor
-3x 56K Ohm 1/4 Watt Resistor
-Length of ribbon cable
Step 2: Try It on a Protoboard
Why use transistors? The digital pins on the Arduino simply can't source enough current to power the amount of LEDs we want. Each 2N3904 can handle 200mA, more than enough to power the 4 LEDs each one is connected to.
Another note. I don't know what current the 5V voltage regulator is rated to on the Arduino. I can run all the LEDs on full and it gets hot but doesn't die (yet). This works out to 2x8x3 (LEDS) x 0.015A = 0.72A
0.72A x 5V = 3.6W
It would be pretty easy to add your own 5V power supply to the board.
Its easy to write a simple arduino program to control the colors of one or two LEDs. If you're not up for it, here is one that takes in Serial commands to change the colors. An example practice circuit is included in the drawing and PDFs to work with the code. It accepts commands in the form of:
*$RGB,0..255,0..255,0..255,0/1,0/1,0/1* (stars included)
This sets the PWM values for RGB to between 0 and 255 and turns on and off the 3 cutoff transistors. Why use one cutoff transistor for each color? If you wire some of your lights through the cutoff transistor and some straight to the ground this will allow you to make more colors. You could have: R+B on one light with only R on another.
Step 3: Build Your Board
Pins 3,5,6,9,10,11 are capable of PWM output. We can drive two sets of 3 colors. You can see these pins are connected to transistors being used as switches. They are done so in what I think is an interesting way, through a 10 Ohm resistor. Normally we would put a larger resistor to limit the current through the base of the transistor. Since the 2N3904 has a current gain of 200, we would want one that provides approximately 1mA so we can use the full 200mA capacity of the unit. When the transistor is fully open the voltage across the LED and LED resistor should be close to 5V. When it is there will be a low Voltage difference between the Base input and the emmitter. Thus the unit should act as a current regulator for very near to 15mA. I'm not an expert and I don't know for sure but this appears to work well in the finished project.
Note that for this project we assume the following Voltage drops across each LED at 15mA:
Red: 2V ( that is why it has the largest resistor in series with it)
Its generally not great practice to put LEDs in parallel because any differences in their V-I curves will result in different brightness between them. I only wanted to work with 5V, not enough for 2 in series so I tested my light sets for differences before installing.
You can see that the Potentiometers and Push button are located on the same side as the USB and power connector. This is the side which will sit exposed at the edge of the shelf to allow for easy user control. The circuits for the potentiometers and pushbutton are in the top right.
This is where having an Arduino prototyping shield can really help. This is what I ended up making out of a normal protoboard. It just piggybacks on top of the Arduino and can be removed and attached easily.
Step 4: Install the LEDs Into the Shelf
Now poke the LEDs through the shelf. Cut the ribbon cable to the appropriate lengths and solder the ends onto the circuit board. This is a good time to test all the connections by powering the arduino circuit and having it run each light. If everything works, hot glue the LEDs into their holes and mount the arduino into the side of the shelf.
I simply took a jigsaw and cut out the back corner of the IKEA shelf to make room for the arduino. The ribbon cable is hot glued to the bottom of the shelf. If you want to get fancy you could run the wires inside the shelf. I knew my shelf would be mounted where these would be out of sight anyways so I didn't do it.
I really like this IKEA shelf because it is very easy to remove from its mounting bracket on the wall to allow for reprogramming. Its also easy to remove the Arduino from the unit however I don't like having to handle the sensitive circuit on top unnecessarily.
Step 5: Program It
The main program is included in the files below. It can run the manual control and rand_drink computer control. It reads the analog voltages from the potentiometer and adjusts the PWM color outputs proportionately. Pressing the button will switch the bank of lights that the POT knobs are controlling allowing you to make 2 colors.
Upload this to the arduino in the usual way. Note that we didn't put anything on Pins 0 and 1 which are the serial communication pins. Programs can be uploaded without removing the Arduino from the shelf.
You can see that it will be quite easy to extend the Arduino program with new modes, light patterns and games. If you happen to build this project and end up taking the program further, please send me your code! There is a ton of room for creativity here.
The attached files make up the LED_Control_Full sketchbook. You can also just download the .rar. You can see the push button switches modes and if it is held for a count of 50 cycles it will initiate the rand_drink routine. There is another computer control function in there which ramps the lights on and off but I haven't quite finished it yet and it is not called by the main program.
Step 6: Load With Vodka, Enjoy
Many common vodka bottles refract the light into beautiful patterns on the wall and light up nicely at night. As soon as I can get my hands on a good video camera I will add a movie of what this thing can do. Many cameras tend not to be able to capture the vivid colors produced by LED light.
Good luck on making your own version!