Portland CORE effigy at Burning Man will be using DMX controlled lighting this year. At least that’s the plan, but a low-cost and low-power way to automatically play the lighting sequence (without a PC) is needed. Here’s a little board I made for the purpose.
Click “Read more” for source code and other technical details.
First, the lighting sequence is created using Vixen version 2. Creating the sequence is pretty simple, just click ranges of time slots and use the toolbar buttons to turn the light on, off, fade up, fade down, etc. Vixen has lots of little features to create patterns, but so far I’ve only used the simplest ones.
One nice feature of Vixen, which I knew existed but never tried back on the Hand-Eye Supply float (Tobias did most of the Vixen stuff) is the Sequence Preview. It takes a photo of your project and then you can define pixels that will overlay the image for each lighting channel. Here’s a screenshot:
Vixen version 3 greatly expands the preview feature and adds lots of new features, but it doesn’t use the simple time slots that we need from version 2. Maybe someday I’ll revist this project and make a way to use version 3, but for now it’s limited to Vixen 2.
Vixen saves files to its Sequences folder as a “.vix” file. It’s XML format, with a big binary dump of the raw sequence data encoded as base64. I started reading about Vixen’s file format, determined to write a program to play it. Pretty soon, I found Bill Porter had already done it, and written a very nice tutorial.
I just modified Bill’s awesome script. I’ve done very little with Python before, but it’s a pretty easy language to pick up. There are lots of tutorials and great documentation online. But being a Python novice, I probably didn’t do everything the best way. At least it works. Actually, it apparently only works with Python 2.7, but not Python version 3. Again, I’m a Python novice….
It turned out Bill’s script could not read a .vix file with the image preview. It finds too many channels, because the channels within the preview get double counted. Bill used Python’s minidom XML parser with get Elements By Tag Name() to find all the channels. I found much better documentation for Python’s ElementTree, so I rewrote the script using that to carefully find only the channels in the main section of the file.
I also changed the script’s output. Instead of creating a .cpp file to be compiled directly into Arduino, I had the script output a text file with the data in a format that could easily be read from a SD card. This way, there’s no practical limit to the sequence length. The script stores the data in a simple format, so Arduino code can just read each line of the file as it plays the sequence.
Read More: DMX Lighting Sequence Player