Friday, July 6, 2012

How To Make Your Own Light Show

DIY LED Light Show

First I have so many people to thank for their help with this project. Homey Da Clown, Fritz42, Pshort, Gorak, and many more helped me figure out how to make the project work.  For information on Arduino, look it up on the web, Vixen Lights is free software that you can download. DIY Christmas is a great forum to use as a resource. They have forums on Vixen and even some on using Arduino with Vixen. As you will see, I am no electrician, but want to explain how I did this project for others that might be a bit intimidated. I say that if you don’t know what to fear about failure helps you charge headstrong into the unknown. You might even learn something.
My goal last year was to have several discreet channels of led spotlights that I could dim and turn on and off with some spooky sounds. I had no idea where to start. I basically wanted a Light-O-Rama setup on the cheap and DIY. If you didn’t know LOR setups can cost thousands of dollars. I also wanted to power spotlights that would be lighting my props, not strings of lights facing my audience. I wanted something much more subtle. I know, an animated light show to Thriller isn’t very subtle, but I had to do it after all my hard work.  I was directed to Vixen Lights and really wanted to do an Arduino project. Be warned, do not try this project if you don’t have patience and you are willing to work the bugs out of your system. Trust me, one wrong thing in your code (sketch in Arduino) can throw everything off. OK, let’s get started.
What you’ll need:
Vixen Lights Download
Arduino and all downloads including SoftPWM Library (All found at the Arduino website)
USB cable to connect to computer
Jumper wires
12 Volt Wall Wart
Misc LEDs and resistors (for testing)
Pre Wired 12 Volt LEDs (to be used in homemade spotlights, there are several examples on the internet)
Low voltage landscaping wire or speaker cable
Project Enclosure (I used an old plastic tool box)
Soldering Gun and Solder
Heat Shrink Tubing or Liquid Electrical Tape
I spent about $250 (excluding the computer and soldering gun)
The first set up I did was with bare LEDs and resistors all powered off the Arduino. The Arduino can power several LEDs on its 5Volt output so this is a great way to make sure your setup is working properly with Vixen. The wall wart became necessary later on down the line when each “channel” coming out of the Arduino had 40-80 LEDs on them. For initial testing one LED will represent one channel of potentially many LEDs. Figure 1 shows the diagram of the initial set up.
You will need to have the Arduino up and running. I’d like to suggest doing some of their simple sketches to get used to working with it. The key to this project working is making use of the SoftPWM library. Pulse Width Modulation is what makes the Arduino able to dim an LED, without it you can really only do on and off. Arduino has limited PWM outputs, and the library and sketch make any of the digital outputs capable of dimming an LED. Download the SoftPWM library and add it to your Arduino Library. Note: the SoftPWM library has an arbitrary limit to the number of channels in its file. I had to change that number to 30 to work for me. Make sure all the files are changed so that it works to suit your needs.
Here is my Sketch for 30 output channels:
#include <SoftPWM.h>
#include <SoftPWM_timer.h>

sftPWM with

void setup()
// Initialize Serial
Serial.begin(9600); // set up Serial at 9600 bps
// Initialize SoftPWM

// Create and set pins for PWM use and turn them off

SoftPWMSet(22, 0);
SoftPWMSet(23, 0);
SoftPWMSet(24, 0);
SoftPWMSet(25, 0);
SoftPWMSet(26, 0);
SoftPWMSet(27, 0);
SoftPWMSet(28, 0);
SoftPWMSet(29, 0);
SoftPWMSet(30, 0);
SoftPWMSet(31, 0);
SoftPWMSet(32, 0);
SoftPWMSet(33, 0);
SoftPWMSet(34, 0);
SoftPWMSet(35, 0);
SoftPWMSet(36, 0);
SoftPWMSet(37, 0);
SoftPWMSet(38, 0);
SoftPWMSet(39, 0);
SoftPWMSet(40, 0);
SoftPWMSet(41, 0);
SoftPWMSet(42, 0);
SoftPWMSet(43, 0);
SoftPWMSet(44, 0);
SoftPWMSet(45, 0);
SoftPWMSet(46, 0);
SoftPWMSet(47, 0);
SoftPWMSet(48, 0);
SoftPWMSet(49, 0);
SoftPWMSet(50, 0);
SoftPWMSet(51, 0);


// Initialize Loop counter
int i = 0;
// Set array to store the 30 values from the serial port
int incomingByte[30];

void loop()
{ // 30 channels are coming in to the Arduino
if (Serial.available() >= 30) {
// read the oldest byte in the serial buffer:
for (int i=0; i<30; i++) {
// read each byte
incomingByte[i] =;

SoftPWMSet(22, incomingByte[0]); // Write current values to LED pins
SoftPWMSet(23, incomingByte[1]); // Write current values to LED pins
SoftPWMSet(24, incomingByte[2]); // Write current values to LED pins
SoftPWMSet(25, incomingByte[3]); // Write current values to LED pins
SoftPWMSet(26, incomingByte[4]); // Write current values to LED pins
SoftPWMSet(27, incomingByte[5]); // Write current values to LED pins
SoftPWMSet(28, incomingByte[6]); // Write current values to LED pins
SoftPWMSet(29, incomingByte[7]); // Write current values to LED pins
SoftPWMSet(30, incomingByte[8]); // Write current values to LED pins
SoftPWMSet(31, incomingByte[9]); // Write current values to LED pins
SoftPWMSet(32, incomingByte[10]); // Write current values to LED pins
SoftPWMSet(33, incomingByte[11]); // Write current values to LED pins
SoftPWMSet(34, incomingByte[12]); // Write current values to LED pins
SoftPWMSet(35, incomingByte[13]); // Write current values to LED pins
SoftPWMSet(36, incomingByte[14]); // Write current values to LED pins
SoftPWMSet(37, incomingByte[15]); // Write current values to LED pins
SoftPWMSet(38, incomingByte[16]); // Write current values to LED pins
SoftPWMSet(39, incomingByte[17]); // Write current values to LED pins
SoftPWMSet(40, incomingByte[18]); // Write current values to LED pins
SoftPWMSet(41, incomingByte[19]); // Write current values to LED pins
SoftPWMSet(42, incomingByte[20]); // Write current values to LED pins
SoftPWMSet(43, incomingByte[21]); // Write current values to LED pins
SoftPWMSet(44, incomingByte[22]); // Write current values to LED pins
SoftPWMSet(45, incomingByte[23]); // Write current values to LED pins
SoftPWMSet(46, incomingByte[24]); // Write current values to LED pins
SoftPWMSet(47, incomingByte[25]); // Write current values to LED pins
SoftPWMSet(48, incomingByte[26]); // Write current values to LED pins
SoftPWMSet(49, incomingByte[27]); // Write current values to LED pins
SoftPWMSet(50, incomingByte[28]); // Write current values to LED pins
SoftPWMSet(51, incomingByte[29]); // Write current values to LED pins

So let’s say you have all this together and you are working in Vixen. Vixen is pretty user friendly, but if you run into errors, the DIY Christmas Forum usually has the answers for those problems. It will take some time working with the serial ports and figuring them out. I used a baud rate of 9600bps and that seems to work fine.  Spend some time getting used to Vixen, once you master its idiosyncrasies, it is a handy tool.
Now for the actual yard haunt project with 12 Volt LED spotlights. The Arduino can’t power 12 Volt lights, so a wall wart comes in handy. You’ll have to cut the connector end off and identify the positive and negative wires. The beauty of the low voltage is that it is much safer and easier to work with.  Also needed is a 7 Darlington array (part number ULN2003 or ULN2004). These allow us to use the wall wart to power the LEDs. Each ULN2003/4 will handle 7 channels of output.  Figure 2 shows how the 12 Volt project is wired.
The other attachments are photos of my original project from 2011. It isn’t pretty, but it worked. If you plan on doing this, start early and have several dress rehearsals to avoid mishaps on the big night. 

I don't know why the images got corrupted, this is figure 1 below. The little red thing is an LED, the blue line represents a resistor.

This is Figure 2 below. The little green line represents a prewired 12 volt LED, the black thing with the red and black lines coming out of it is a 12V wall wart. 

No comments:

Post a Comment