Introduction: Building a Simple Projection Mapped Display With Pixel Mapped LEDs
As a circuit board designer who deals mostly with LED control systems, I have accumulated quite a stash of LED strip, bars, pucks, and other companies controllers that we have purchased for clients, gigs, or evaluations. Every now and then I like to crack open a box of this stuff and put it to use to try something new.
The day before this year's Strategik Sanctuary V campout I decided it would be fun to try and build a projection surface that had some form of pixel mapped addressable strip flanking the screen. Here's how we pulled it off fairly cheaply and quickly!
Step 1: The Design.
Digging through the reels of addressable strip I found a few spools of WS2811 strip with a 60px/m spacing. Since the controller had 16 outputs, this would be enough strip to do somewhere around a meter on each header.
I'd already decided a 4' circle would make a pretty nice screen size and fit on the back wall above the DJ, so I fired up CorelDraw and starting laying in approximately 1 meter spikes coming off of it. The first design ended up looking like a clock with the bars spaced uniformly, so I scrapped that and starting rotating them around. The next iteration looked a bit too much like the New Mexico flag so that was also scrapped.
When I get stuck for an aesthetically pleasing pattern I often end up dropping in circles as guides. By following the circumference of these circles, I adjusted the prospective LED bar positioning until I felt that it looked nice.
Since I set up my page at 1:1 scale in CorelDraw I measured the length of each LED bar before it met the circle and took note of that. Then I layed out a quick second page showing the length and the angles for each bar so that I could laser etch it onto the circle as a guide.
Step 2: Assembling the LED Bars
Since the strip I had laying around was 'outdoor silicone sleeve' type, it had no adhesive backing. The easiest way I've found to adhere it to things is to apply a layer of 3M double-sided tape.
To do this simply, roll out a piece of the 3M tape a little bit longer than the strip. Then use some other tape (we used that green electrical tape) to attach the 3M tape sticky-side-up to the table from each end to keep it taut. Then you can use both hands to lay down your LED strip in a straight line. An exacto knife then can be used to trim away the excess 3M tape. Boom, you have an adhesive backing on your strip.
I wanted the LED bars to have a little bit of shape to them instead of just being made of flat bar, and also thought that some form of extrusion would wobble less. Also not breaking the bank was an important factor. It turns out that 4' curtain rods are about $3 per pair at your local box hardware store and they have a pleasant 90deg bend at the end.
The curtain rods were white, so we painted them flat black and attached the LED strip. We also drilled a hole to pass through the wires and loaded it full of hot glue to strain relief and protect the wiring from the metal edges.
Step 3: The Control Board and Wiring
There are a few different options for the LED control from a computer, but by far one of the easiest PCBs I've found to work with is the PixLite 16 by Advantek. This board has 16 channels of around 300 pixels per channel, it will work with about 10 different addressable strip protocols, and it speaks ArtNet and sACN/E1.31. Additionally, if you are using it in sACN mode you will get an additional 4 universes of DMX output. As you'll see in further along the line we'll be using MadMapper so we'll have to use ArtNet mode, but if you use Madrix or LightJams the sACN output will be handy.
After we threaded the wiring for each strip through holes in the curtain rods I attached the terminal block headers and plugged them into the PixLite board. It has a handy test mode to verify that everything is working which is wise to check before you fly this thing in the air.
The company that makes this board has a configuration tool that is used to set up the mapping of ArtNet or sACN to each port, as well as lets you configure the ethernet interface. You can also set the protocol used to drive the pixels and the byte ordering. In the last picture above, you can see how the universe->port mapping is made. By checking the Advanced checkbox you can specify the exact start address and universe for each port, or it will automatically map them in a packed fashion. I used the advanced options to set each port for a different universe with a start address of one since ArtNet universes are effectively free and this greatly simplified the configuration in MadLight.
Step 4: Assembling the Display
Step 1: Laser cut a huge circle that won't fit in your car on the Metabeam at Pier 9.
Step 2: Lay out your super sweet curtain rods then mark and predrill the holes in the correct locations.
Step 3: Get someone with white paint that is working on another projection screen to paint your circle for you.
Step 4: Screw down the curtain rods in the correct order.
Step 5: Tape down the PCB, power supply (this was a 40A 5VDC Meanwell supply), and make the connections.
Step 6: Attach some crazy hanging apparatus so you can hang it from Maffer clamps on light stands.
Step 5: Configuring MadMapper / MadLight
Ok- here's the fun part. MadMapper has a fairly new feature called MadLight that lets you output a mapped area of the source video to fixtures over ArtNet. You can also define what exactly a "fixture" is in terms of number of pixels, byte ordering, pixel placement and size. This means you could make an RGB single pixel and output an area of the display to an LED par can, or you could make a long thin fixture to output 60 pixels to an RGB addressable strip using a board like the PixLite.
Firstly I set up MadMapper to output 16 universes of data to the IP address of the PixLite board. Then I created a fixture to represent a single strip of up to 60 pixels, which is above the maximum number of pixels in any of my runs.
Next in the MadLight configuration I created 16 of that fixture and laid them out in the appropriate locations around the circular projection mask. You can resize each fixture to capture a number of source pixels that will be averaged, or make them a single pixel wide. I find having each LED reflect the average of a small section of the source material makes the playback on the LEDs a little less frantic. On the left side of the third picture you can see where each fixtures gets set to a separate universe assignment.
The projection mapping isn't really part of this tutorial, but the pull handles on the circular surface can be moved around to make the video fit properly on the projection surface and correct for any rotation or skew due to the mounting and position of the projector.
Jumping back to the MadMapper main configuration screen, I selected Modul8 as the Syphon video input and made sure that the circular region was properly sized and warped to fit perfectly on the white projection surface.
Step 6: Fire It Up and Have Some Fun!
Now that MadMapper is set up, you can turn on any video source that can output to Syphon to pipe the video to your hybrid projection/LED screen. This is easy to do in Modul8 by going to the Output pull-down menu and selecting Syphon.
The overall effect was AWESOME, especially for something that was built with 24 hours notice in a total build time of maybe 4 or 5 hours. MadMapper locks the ArtNet framerate to about 40Hz which is perfectly sufficient for fluid motion on this kind of addressable strip.
This would be equally awesome without the projections, as being able to use powerful software such as Modul8 allows you infinite real-time control of your scenes and content rather than having to drive the LEDs with procedural generation, reprogramming a standalone controller, or using kludgy processing sketches.
Here are a few video of the screen in action (which I will switch to Embedded as soon as the feature is supported). The first clearly shows the mapping effect, and the second is a short clip of our friend Ethan Miller rocking a late night set.
VisualConstruct made it!
We have a be nice policy.
Please be positive and constructive.