After putting together our 2016 light show, we realized that it would be very helpful to be able to display numbers with lights to show the year or to do a countdown timer to the next show. Not wanting to incur the cost of doing a full pixel screen, we figured that 4 seven-segment displays (like what is used on a calculator) could meet this need nicely. We considered several different options for where to place these displays including the shallow roof above the garage, our ridiculous amount of privacy fence to the left of the house, and a stand alone frame that would sit in the yard. However, none of these options met all of our needs as they were either too far off the main sight lines (fence) or would block the view of other elements (free-standing in the yard) or were too hard to see from the street (garage roof). So, we decided on the most complex solution: putting the displays on our garage door.
We had always thought that our garage door could be used as a large canvas for lights. On the plus side, it is the largest uninterrupted flat section of the front of our house and is prominently located closest to the street. On the challenging side, a garage door is a mechanical device that must move up and down to give us access to our garage. We quickly decided that any light element to utilize this canvas must not prevent us from parking our cars in the garage because it gets cold in Colorado in the winter and we have moved past the “scraping our windshields in the morning” portion of our lives.
Thus, in 2017, we decided to take a stab at adorning our garage with some seven-segment displays and here is what we came up with.
Due to the low clearance between the garage door and the upper door jamb, we knew that our solution had to be pretty thin. This naturally led us to use LED pixel strips. Unlike our other elements using 12V pixel strips, such as the LED Snowmen and Window Light Boxes, the pixels on the garage door would be directly visible to our visitors. As such, we really wanted individual control over every LED, something the 12V ws2811 pixel strips don’t offer since they have 3 LEDs bundled together for each pixel. Instead, we use 5V ws2812 pixel strips, which give us true individual control of every LED. See LED Pixels for more details on all of the LEDs used in our show and the finer points of the 5V vs. 12V difference.
Laying Out and Mounting the Pixels
In keeping with the lightweight and thin requirements, we picked up some relatively inexpensive corrugated plastic sheeting from Home Depot. This stuff is strong, thin, and very lightweight. Perhaps prematurely, we first painted the entire sheet of plastic with two coats of house paint the same color as our garage door. We then cut it into two 20″ x 8′ panels, which are just shy of the height of each of our garage door sections. NOTE: the two panel arrangement was our second attempt necessitated by wind-driven adhesion difficulties as described further below. We had originally tried making 8 individual panels each 20″ x 20″ but switched to the larger panel approach to make it easier to attach them to the garage securely.
Due to the odd number of “segments” in the display, the top and bottom panels are a bit different. For no significant reason, we decided that the top panel would contain the middle segments and thus it has squares of pixel strips while the bottom panel just has a bunch of U-shaped layouts.
We first tried attaching the pixels to the painted corrugated plastic using just the adhesive on the back of the pixel strips. Unfortunately, this proved to be too weak of a bond and the pixel strips began to bubble up almost immediately.
Our second try included copious amounts of the same E6000 glue we used for the LED Snowmen. This certainly worked better, but we found that over time even this bond begins to loosen and the pixel strips start to bow and lift off the surface.
We aren’t entirely sure what the cause of the separation is, but it seems to be related either to the differential expansion of the pixel strips and corrugated plastic when heated in direct sunlight (our garage door faces south), or to a reaction of the E6000 glue with the adhesive on the back of the strips. It’s not like the entire pixel strips just fell off the panels, but there was more lifting and bowing than we wanted. It could also possibly be related to the fact that we painted the panels first with the outdoor house paint and either the glue or the paint is not tightly bonded to the plastic surface.
Our final approach that seems to have worked well was to forego adhesives all together and instead use staples and an electric staple gun. It was a challenge to get the gun lined up just right since the staples are barely wider than the LED strips, but they hold the strips securely while still allowing a bit of side-to-side slippage as the temperature changes. After stapling a section every few pixels, we flipped over the corrugated plastic and used a small hammer to flatten out the prongs of the staples to hold things securely. A strip of painters tape covers the backs of the staples and prevents them from scratching the garage door or possibly short circuiting on the off chance we missed our aim with the staple gun.
When assembling, we first attached the pixel strips to the panels (make sure to get the directional arrows in the right direction!…we messed this up on one early on and had to pull it off and re-glue it). Once attached, we soldered on connectors to the ends and jumper wires between the strips. Clear caulk serves to waterproof the areas where we had to cut away the IP65-rated silicone in order to solder.
Attaching to the Garage Door
Our first attempt to attached the panels to the garage door was using normal 3M Command Strips. These are the strips made for attaching things temporarily to walls in your house and they have a pull tab to help facilitate removing them without damaging the wall surface. For the most part, these work very well to attach the panels. We had some issues with the first one we put up, but that was most likely due to either the door being dirty or us handling the sticky strips too much and making them less tacky.
We also learned that these strips can be very, very strong when not removed properly. While testing the system, we had a need to move one panel from one spot to another (because Philip managed to fry the pixels on 2 of our 8 panels…see below). Due to the design of our garage door and the size of the panels, the pull tabs of the command strips are challenging to reach. Rather than get the right tool to slide behind and pull the strip (like a long pair of needle-nosed pliers), we instead just brute force ripped the panel from the garage door. This took a lot of effort and brought 4 little chunks of garage door with it when the panel finally came off. Now, our garage door is pretty old and needs to be replaced in the next year or two anyway so we weren’t too horrified by this outcome, but we highly recommend operating with a bit more patience than we demonstrated.
Unfortunately, a combination of direct sunlight on our south-facing garage door and some heavy Colorado winds proved that this attachment was not sufficient. Rose came home one night in November to find our 20″x20″ panels dangling from the wires and being tossed about in the wind.
This led us to rethink some things and we decided that larger panels held in place by bolts through the garage door was our best solution. Again, our garage door is old and needs replacing so we aren’t shy about adding a few holes to it. If and when we replace the door, we may have to come up with a different attachment system (perhaps clips that attach to the top and bottom lips of the garage door sections). Ultimately, we used about eight 1/4 inch bolts with washers, spacers, and wing nuts to attach each large panel to the garage.
Despite our earlier experiences, we still managed to underestimate the power of the sun and expansion of materials. We originally only used six bolts per panel, which worked fine until Rose opened the garage door at midday and the panels had bowed so much that one of them caught the garage opening as it went up. Other than a little crease in the panel (not noticeable at all at night), there was no permanent damage but we decided that more bolts were necessary to keep the bowing in check.
Wiring It All Together
The backside of the garage door contains a labyrinth of wires and a 5V 40A power supply. All of this has to move up and down with the garage door when it opens and closes. An extension cord runs from our garage door opener outlet on the ceiling to the power supply on the door. On the ceiling, we mounted a cheap curtain rod that was laying around and put about 5 shower curtain rings around it. The extension cord is zip-tied to these rings and the end of the cord is zip-tied to the “j-bar” arm on the garage door. This system works remarkably well as the door edge pushes the extension cord out of the way when it opens and the door pulls the extension cord back with it when it closes.
One of the reasons for having so many wires is that 5V power does not travel more than a few feet without dropping in voltage too much to be unusable. Practically, this means that we needed a lot of power injection to make sure that all of the pixels got enough power to operate well and have consistent coloring. Because of how we connected all of the panels together, power is essentially injected at the input and output of every panel and this has been more than sufficient.
Since we’ve had challenges on every other aspect of the seven segment displays, certainly the wiring would be easy, right? Of course not! This picture below is how the panels were intended to be wired together. It’s logical, symmetrical and minimizes the lengths of wires to help with power distribution.
This next picture is how we actually ended up wiring them together.
Why the difference? In short, because it is working. We spent hours and hours troubleshooting these panels and Philip replaced several pixels that seemed to either not accept input data correctly or were not publishing the output data correctly. He was confident that each panel was working correctly. We put them up on the house again and it was a mess with some panels working well and others not.
In our attempts to figure out if we had input or output issues, we started plugging different panels together in all kinds of configurations with jumper wires running all over the place. Ultimately, we learned that there is no logic in play here! In several places, when we plug the ouptut of a panel into the input of another panel it just doesn’t work.
Let’s look at an example. For some reason, plugging the output of “Lower 2” into the input of “Upper 3” doesn’t work. “Upper 3” won’t light up. The rational person will realize that the issue could either be with the output of 2 or the input of 3. To disambiguate, we took that same output of “Lower 2” and plugged it into the input of “Lower 3”. It works! Great, logic dictates that the issue must be with the input of “Upper 3”. So just to make sure, we take the output of “Upper 2” and plug it into the input of “Upper 3”. It shouldn’t work…but it does…perfectly, without issue!!!
We had a similar problem between panels 3 and 4 and cannot explain why. We did purchase our LEDs in two separate batches because Philip managed to fry two entire lower panels of LEDs by hooking up 12V power to 5V pixels one night…yes, it took him ruining two panels before he figured out what he was doing wrong. However, both orders were from the same manufacturer and the strips use the same control protocol. There is no reason at all that every pixel should not be able to talk to every other pixel…but they can’t for some unknown reason.
To make a long story shorter, we finally found a configuration of panels that works and we decided to run with it. The cabling on the back of the garage door is a bit messy but we can live with that!
Controlling the Lights
All four displays are controlled by a single ESPixelStick Pixel Controller that is also mounted on the back side of the garage door (more just dangling there, actually). Each display has 97 pixels (291 channels) plus there are 4 other pixels (12 channels) for the colon between panels 2 and 3. A DMX universe can only hold 512 channels so it takes almost 3 full universes to control the displays. Fortunately, the ESPixelStick can handle up to 4 universes worth of pixels so only one controller is needed. #TODO talk about setting up the controller to handle the multiple universes correctly
See Channel Output Mapping for more details on how all of our channels are mapped to controllers.
Programming the Seven-Segment Displays
Philip originally had hopes of building a custom plugin for Vixen Lights to help with using the displays. Vixen already has effects to display text or numbers on pixel screens and mega trees, but it has nothing for a seven-segment display. Unfortunately, we ran into limitations of time and knowledge. Vixen is written in C#, a language Philip has never used. Beyond that, the documentation is very unclear as to what is required for building a plugin and two nights of effort yielded very little progress. We might work on this more in the off season and likely spend time on the forums to get some assistance in understanding how to do this.
So without any help from Vixen, Rose was forced to sequence the displays by hand. This was a very tedious task, particularly for doing the minute and a half countdown timer at the end of our show…and even more so for the 10 minute countdown timer she made for our lighting kickoff party.
In response to this effort and with a desire to be able to make a 1 hour countdown, Philip spent 2 evenings the following week writing a Python script to solve the problem. He knows Python much, much better than any other language and came up with a solution that seems to work very well. Sequences are stored as XML and the Python script just generates a sequence file with the generated countdown inside it. The sequence file can be opened in Vixen and interacted with as if it had been created in the program originally. Source code for the script can be found on Github.
One other possibility worth noting is to bypass the sequence entirely and do the countdown timer as a pixel overlay script in Falcon Player. We looked briefly at this but were somewhat dissuaded by the use of shell scripting and perl. The Falcon Player documentation talks some about these overlays but we had to log into the Raspberry Pi through SSH to actually look at the scripts that exist. Doing the countdown as a Vixen sequence is more desirable from our perspective and we probably won’t investigate this overlay option any further.