A Star for Christmas
This is what I made: a 7 foot diameter “Star” for Christmas, using 112- 3 watt RGB pixel LEDs, controlled by an Arduino UNO. Each pixel is addressable so many different patterns can be obtained via programming. This Instructable has instructions, program, parts list, what NOT to do, ideas, schematics, AND the Gerber files (zipped) so you can get your own boards made, either for the MODEL (more about this later) or the full-size display. This display can be seen from 700 feet away. The video was shot from about 100 feet away.
Materials and Experience Level
Electronics: (more details/specs in the text)
- 7- MCP23017 port expander ICs
- 7- DIP sockets for above, 28 pin, 0.3 inch spacing
- 21-Transistors 2N5191, NPN. Type not critical
- 14-UDN2981 Darlington driver ICs
- 14- 8 terminal screw terminal strips
- 7- Resistor arrays, 4 resistor bussed-type. 10K value
- 21- jumper blocks, 0.1" spacing. These are for addressing the boards. Optional: you can solder the connections instead but then they become more permanent.
- #22-#26 stranded wire, lots of it. I stripped old large SCSI and parallel printer cables to get the wires
- Computer ATX power supply or equivalent. Get an old PC, take the power supply
- 112 RGB LEDs, from eBay. Order early as free shipping takes 6 week delivery. Specs: Common anode More info in the details.
- 112 -100 watt resistors, 1 watt. I used a large safety factor with 1 watt. ½ watt might work.
- Arduino UNO
Non-Electrical:
- Sheet of ¼” plywood
- "1x4" lumber, actual is 3/4" x 3-1/2". See text for details on how I cut this. Quantity depends on size of your Star
- Plastic shot cups or equivalent. I bought mine at Dollar Store.
- Tube of caulking. I used DAP outdoor
- 6 mil poly sheathing, enought to cover front of Star
Cost of Materials: This will vary of course, based on your location and availability of materials. As indicated I used old printer cables for wiring, transistors were in my junk box stock, I had 4 ATX power supplies already. All in all, it cost me about $200 in materials.
Resources:
Tools Required: soldering iron, wire cutters and strippers, carpentry tools (table saw, sander), wood screws.
Expertise required: there is lots of soldering, and lots of wiring. If you’ve done either before, this project will not be difficult, just time-consuming. To troubleshoot, some expertise with working or building your own circuits is necessary. You will need a DVM to troubleshoot, a logic probe or oscilloscope would be an asset but not necessary.
Background and Introduction
You have probably heard of, and seen, addressable RGB LED strips that use a controller to light the pixels up in nice patterns... NeoPixels (Adafruit Industries) is a name that comes to mind.
This isn’t that, but it is similar in operation.
I wanted to use NeoPixel strips for a Christmas Display but the only public viewpoint for my house is 250 meters (700 feet away) across our ocean cove. I would need more power per LED than the 100 milliwatts of a standard LED strip.
So, I designed my project using 3 watt RGB LEDs. (Strictly speaking these are “pixels”, with each “pixel” having 3 LEDS: red, green and blue, but I use the terms interchangeably.) With Neopixels, like this display, since every “pixel” is addressable you can get any light color or pattern, limited only by your imagination.
The Star had to be visible from 700 feet, so it would have to be big. Since the eaves on the side of my garage are 8 feet from ground to top, I made the Star 7 feet in diameter.
NOTE: This is a BIG project that will take lots of time and effort to complete. It is tedious, monotonous work as well: a few thousand solder joints for example. But once you get going, it will quickly become an easy task. (Get your son or daughter to help).
Downloads
Video: How I Came to Make This Star
The video is about 5 minutes long and describes the challenges I had to meet to get this project running.
Definitions
Some definitions to start, for those who may not understand some of the terminology I use. (Note: These are my definitions, Google the terms if you want more info.)
Pixel: “Picture Element”, it is what your color monitor or TV is made up of and consists of red, green and blue LEDs. I sometimes refer to an LED pixel as simply an RGB LED.RGB: red, green blue colors
Port expander: a logic “chip” or integrated circuit that takes 2 wire as inputs and expands the data stream out to 16 bits or outputs
I2C: Pronounced “Eye-Two-See” or "Eye-squared-See", a technique invented by Philips to communicate by serial means (one bit at a time) to components within a computer system. Real name is IIC, so you see why we call it I2C. Only 2 wires are required for communication. It is slower than SPI, but suitable here.
PIC: programmable interface controller, a term used by the manufacturer (Microchip) of MCU integrated circuits.
MCU: micro-controller unit. Used to be a chip with multiple functions and still is, but can also describe an Arduino UNO which has this and other components on a board (PCB) to make a standalone, ready-to-use computer.
Segment: The Star is made of segments: 5 "points", and center pentagon.
Do NOT Do This at Home
(for information only)
My previous expertise in making displays for Christmas was using 110 volts AC, triacs and opto-isolators, controlled by a PCB I made using Microchip MCU chips, and programmed with BASIC. I started to do the same for this project, but to reduce the wiring I wanted to use a matrix. In this case he matrix would be a 3 x 16 in each of the 7 segments that make up the complete Star.
I made a mock-up out of cardboard and did a small test using 6-RGB incandescent bulbs (7 W, C9 types) and solid-state relays. The test seemed to work okay, but when I scaled it up to one segment of a Star (see photo above), I got lights turning on that I did not want lit, because you cannot do a matrix connection with alternating current! (Ref: Power Point presentation Step 3)
From Incandescent to LED
In my research I discovered high-power RGB LEDs (photo), so I bought a few for testing and compared them with the 7W incandescent bulbs I had been using, because I knew THESE were visible from far away. At my viewing distance of 700 feet, I could get the LEDs as bright as the C9s. (I also compared them using a light meter).
More research into LEDs in general, and how to “drive them” revealed many Google hits from Arduino users. I had heard of the Arduino product but paid little attention to it at the time, but the more I looked into it, the better it looked. For one thing, an Arduino UNO was a complete little board, a "platform", ready to attach inputs and outputs to, and programmable via USB cable. Previously I had been programming Microchip PIC MCUs, making my own boards, using BASIC to program, then downloading via an attached programmer. Arduino was much simpler and less time-consuming, and there was lots of support for the hardware and software. Again, I discuss these issues in the Power Point presentation.
Changes After All Was Working
The display was ready for Christmas 2019, but I very much disliked the external wiring harness I had for the signals from the Arduino, located INSIDE the garage, to the display OUTSIDE the garage. Because the Arduino was far away, I2C communication was flaky, so I had to use I2C extenders to make the I2C bus work. Lots of crap that was unnecessary, as I found out this year when I eliminated the extenders and put the Arduino inside the pentagon piece with two of my output boards. I still needed to parallel the I2C, RGB signals and power supply inputs to each board, but I could eliminate the extenders and the external wiring harness. Now I have a simple 4 conductor cable connected to the Star, from the power supply. There's an X through the photos to indicate to you that this is NOT the final "As-Built". Do not do what is in these photos.
Prototypes/Models
Because I had to learn C++ and new hardware, I made some small prototypes for testing my ideas and programs. I started with single-color LEDs to get my “Hello World” moment, and once I did, I was encouraged to continue on. I updated to color LEDS, then made a complete mock-up with custom designed printed circuit boards. I can make the Gerber files available for these if you want to make a SMALL display. However in this Instructable I will only discuss the Big Star, not the small model.
My model/prototype is a full-functioning display since it uses the same codes and addressing for the small boards as the full-size version. You can make EITHER or BOTH. The small PCB boards are all self-contained with LED pixels as part of the driver board, whereas the boards for the full-size display are all identical but mount separately from the LED pixel.
Shut Up and Let’s Start Building
It took me a year to design, build, wire, program, but here the only thing NOT done for you is making the wood frame, doing the wiring, and populating the printed circuit boards.
Construction Steps
Construction Steps showing the approximate time it should take to complete.
11) Order the printed circuit boards and LEDs as they can be long delivery
12) Make the Star wood components Time: 1 week
13) Mark, then glue all LEDs into place Time: 1 day
14) Drill holes, insert resistor leads Time: 1 day
15) Install bus wires (Red, green, and blue) on all segments: 5 points and 1 pentagon Time: 1 day
16) Solder resistors to LED solder pads Time: 1 week
17) Connect wires from each resistor to the proper bus Time: 2 days
18) Populate the printed circuit boards (PCB) Time: 2 days
19) Initial Board Test
20) Mount PCBs in a central location on each Star point or center pentagon Time: 1/2 day
21) Connect bus wires and anode wires to PCB screw terminals Time: 1 week
22) Prep Arduino and I/O boards
23) Connect Arduino and common wires to terminal board Time: 1/2 day
24) Power Wiring
25) We're done, fire it up!
26) Finishing Up
Order Printed Circuit Boards and Pixel LEDs
Order the printed circuit boards as they can be long delivery
I posted the zip file containing the Gerber files for the full size star, to my Google Drive (link below). You can download this file, upload it to JLCPCB (or your own fab house), to order your PCBs. JLCPCB displays the board based on the Gerber files, so if you see the boards, you know they will be fabricated to that quality and style. You also get an instant quote. When I uploaded the files as a test, the quote was $6.00 (CAD) for FIVE BOARDS!
https://drive.google.com/open?id=1nnLw7-BvioA10PnhD83wbZLGhUukIFRQ
Photo above is actual board as I received them from JLCPCB, front and back.
If you want quick turn-around, pay for DHL to deliver, but if you’re on a budget, or have the time to wait, choose the postal system. Since you MUST order in groups of 5, get 10 boards. You will use 7, and have 3 left over for other projects. They are very, very inexpensive.
Note: the layout was designed with English units (inches), not metric. Pin spacings are standard 0.1"
At the same time, order the pixels if you are getting them from China (via eBay). See photo
Make the Star Wood Components
Make the Star wood components
I used ¼” fir plywood for the main body of the star and 1x4 for the edges You can do as I did, sandwiching the plywood between the 1x4 that is split into 2" and 1-1/2" pieces, or make a dado in the 1x4. (Note 1x4 is how it is sold, but it is actually 3/4" x 3-1/2"). Consult your carpenter friends on how to do this. (I did.)
A rough guide is shown here, with dimensions of the center pentagon shown. Everything was painted twice with white exterior paint. I made this Star in 6 pieces- 5 “points” and center pentagon, and used T-nuts and 1/4” bolts to hold the points to the pentagon. See photo with circled bolt heads. The bolting is NOT necessary. I did it because I thought there would be lots of weight to the display and I would have to store and mount in pieces, but the weight is not excessive (maybe 40 pounds). If you have storage issues, then by all means, make it modular. I drilled holes between the pieces to thread the wiring and resistor leads through.
Mark, Then Glue All Pixels in Place
First thing you do when the pixels arrive is mark the anode on each one while they are still connected together as a matrix (they easily come apart). See photo above with my mark shown circled in red. Once you know where the anode is, you will be able to glue the pixels down in the same orientation.
You can see in the single pixel photo that the cathode colors R, G, and B follow the anode in counter-clockwise order. You can/should check these out on your bench anyway, just to make sure. (Use a resistor to limit current).
I used metal washers to show where the LEDs would be placed. Since I glued them onto the wood, I decided to leave them there to act as a kind of heat-sink. This is NOT necessary. Use the washers (or LEDs if you have them) to lay them out at the spacing you require. Once satisfied, glue the LED’s down and do so pointing them all in the same direction. As shown in photo for one Pixel, I made the cathode (scribbled "K" in photo) as bottom left.
I prefer to use white Dap caulk to stick the pixels down: easy cleanup, easy to remove later if necessary. Don’t use construction glue because you will destroy the LED trying to move it later. Silicone sealant is also good to use in this instance. I used 3” spacing between LEDs...you should adjust for the size of your display.
Drill Holes, Insert Resistor Leads
Drill Holes, Insert Resistor Leads
Each LED of each pixel (3 LEDS per pixel, one for red, green, blue) must have a 100 ohm resistor attached to it, to limit current. You COULD use a smaller resistor to get more brightness at a cost of increased power use. The computer code flashes the LEDs, not allowing them to stay on for any significant time, and in testing, the pixels did not even get warm…so there is room for higher brightness without worry burning up the LEDs. The LEDs barely consume 1 watt each (though rated for 3 watts) at full power. Refer to spreadsheet in Step 6.
After marking the anodes, I marked, on the wood display side, the location of the red, green, blue solder pads, then drilled 4 holes, one for each anode wire and 3 resistor leads. The pixels are on one side (front, obviously) with all the wiring and resistors on the back side and the holes allow for these wires to pass through. This allowed me to cover the pixels with whiskey shot cups to get a dispersion effect, making the LED look bigger than it is. The cups also water-proofed the LED connections and covered the holes I drilled.
Push a resistor end through from the back, and solder it in place, doing one color at one time. It pays to apply solder to the pads beforehand, then just hold the resistor end in hot solder. Don’t bother cutting the resistor leads to fit, it is NOT necessary.
Install Bus Wires
I bought some rolls of metal hookup wire from the Dollar Store. Make sure you can solder to it! Previous wire material I tried to use had a varnished coating that was NOT solderable. These will be the bus wires, one for Red, one for Green and one for Blue that run around the perimeter of the segments. Refer to concept drawing above and photo of the center segment, the pentagon. The wires are looped around screws at key points and eventually connected back to the RGB screw connections on the driver board. There will be instances where one wire has to cross another, so make sure you cover the crossing wire with heat shrink or equivalent insulator. I used some felt pens (RGB colors) to mark which bus was which and Ialso used cheap water-based paints (Dollar Store again) to mark the screw heads with the bus color.
Solder Resistors to LED Pads
Solder resistors to LED pads as shown in the photo.
Note: if you get the pixel LEDs with the bottom heat-sink subtrate, made of aluminum, be careful not to let the resistor leads touch the bottom side of the device. You will short that resistor out, possibly with others. No damage will occur, but you will get multiple LEDs on when you only want the one.
In the photo above, you can see how I looped the wire up a bit to keep it away from the metal bottom.
Connect Wires From Each Resistor to the Proper Bus
Connect wires from each resistor to the proper bus
With the resistors in place, I then laid each one down flat against the wood surface, and twisted the remaining resistor lead around the bus wire, which should be suspended 1/2 “ or so, so you can get your fingers around the wire. Then solder. No need to get fancy. Make sure the resistor tied to Red LED is connected to the Red bus and so on with other colors. Develop a system to do this efficiently, for example, wire all the red LEDs at one time as you follow the wire bus around the display part.
Populate the Printed Circuit Boards (PCB)
Populate the printed circuit boards (PCB).
I used a socket only for the port expander chip, the MCP23017, since it was the most active chip on the board that receives signals and provides outputs. Socketing it allows for quick replacement if you suspect it doesn’t work. (I’ve had a few). Other items don’t need sockets. I used screw terminals for the 16 channel outputs to the pixel LEDs. Note that the screw terminals are "mate 'n Loc", for easy board replacements or troubleshooting.
If you're confident everything will work, you could solder the wires directly to the boards without using terminal strips, but I recommend against it.
I always install components using the flatess ones first, e.g. the resistors and soldered in ICs, because I can lay board flat on my bench to solder the components.
Each board must have a different I2C address, from 0x20 (that is hex #20) to 0x26. I gave the points, #20 to #24 going clockwise, and 25 for outer and 26 for inner, pentagon.
Initial Board Test
Inspect the board for defects, excess leads not cut, bad solder joints, etc.
Install all components EXCEPT the MCP 23017 port expander and apply +5 and +12 volts to the board. Check these voltages at critical points (the ICs), to ground to verify they are correct. Use the board layout and schematic to verify test points.
Mount PCBs in a Central Location on Each Star Point or Center Pentagon
Mount PCBs in a central location on each Star point or center pentagon
See photo that shows where I mounted the PCBs for each point and the two for the Pentagon. Originally I had the two pentagon boards parallel to each other, but then I put the Arduino UNO, which was nowhere near this display (it was 20 feet away inside the garage) in close proximity. This is why it looks rather skewed. Learn from my mistakes! The UNO in the photo is circled with cyan color.
I used #6 wood screws (Robertson head are best), and chunks of 1/4” plastic tubing for standoffs to secure the boards to the wood frame.
Are We There Yet???? Connect Bus Wires and Anode Wires to PCB Screw Terminals
Almost...
Connect bus wires (A) and anode wires (B) to PCB screw terminals
Wiring will probably take you the longest time to complete, which is why I allowed one week to complete the task.
A) The un-insulated bus wires are running around the periphery of each partition but are not yet connected to the Output boards. Do that now, using insulated #22-24 wire. I used wire stripped from old computer printer cables to do the job. I didn’t care much about color coding, or how they were laid out. It was simply point-to-point, with no regard for niceties. I could have tie-wrapped all the wires and made it neat like a military control panel, but doing so would be more time consuming and hard to troubleshoot later on. Also, the longer the wire, the more the resistances which could dim the outputs. These wires obviously connect to the RGB terminals on the output board.
I used hot glue to hold the wires in place. (A little dab here and there to keep wires secure).
B) The 16 channels on the two screw terminals connect to the anodes of the output board. Refer to the board layout. #0 is clearly marked. 0-7 are on the right, 8-15 are on the left. Remember when I told you to put black dots to denote the anodes on each pixel?
You can color code each of the 16 channels if you want, but this is unnecessary and time consuming. Simply find #0 Pixel on your first segment, solder the wire to the anode, run the wire through the hole in the front, to the screw terminal marked #0. Where is #0 pixel? It is ONE-UP from the bottom right corner. Pixel marking is counter-clockwise from #0, all around until you get to the bottom right corner, which is #15 pixel. Refer to photo of Point, above. Red circled is pixel #0, Cyan is #15.
(If you are wondering why it is counter-clockwise, it's because I was working from the back...where the numbering is clockwise). WATCH FOR THIS. Mark the back of the board before you start, with pixel locations.
Prep Arduino and I/O Boards
I purchased a screw shield for the Arduino to attach the required wires, rather than depend on a wire inserted into the Arduino header sockets. There is also a requirement of I2C protocol to have resistors tied to +5 to ensure the lines are at +5, indicating they are ready to be accessed. Without them there will be communication problems. You can see them in the photo, both are tied to +5, with each of the other end of the resistors tied to SCL and SDA. I had to modify the screw term board a bit to put the wires through since the screw terms don't connect to SCL and SDA. I used 13K ohm resistors, but you can use 10K ohm.
An alternative method: simply put the resistor ends in the same screw terminal that the SDA and SCL signals attach, on ANY of the I/O boards. (It doesn't matter where the resistors are, as long as they are on the I2C lines somewhere). Wind the other two leads of the resistors together and put into the +5 terminal, again, on any of the boards.
Each board must have a unique address. Refer to the table. I chose the first "Point", the one pointing upwards as 0x20, or address #20, then clockwise for the others. The addressing is accomplished by plugging in jumpers for pins A0-A2 of the MCP23017. See image of the chip pinout above, and the table at far left. A jumper in place makes that address bit LOW because it pulls the normally-high address bit to zero volts. Conversely, a missing jumper makes that bit HIGH. So if all jumpers are OUT, then the address is 7 (binary 111). It is reverse logic, not my fault.
Because of the way the library and the MCP23107 work, the address must have a numeral 2 in front of it, so if you want address #0, you have to enter address #20. (It has to do with an internal register of the MCP23017 that must have the "write" bit set when setting the address.) Just do it...
In my table above, black-filled means a jumper block is inserted, so 3 filled blocks means address #20.
Connect Arduino
I originally had the Arduino 20 feet away in the garage, with the Star outside, and needed a wiring harness to get signals, power lines, etc to all the I/O boards. Because of the distance I had to use I2C extenders for the I2C bus, in order for it to work.
You do not have to do this, and in fact I totally recommend against it. Put the Arduino inside one of the segments (I chose the pentagon...lots of room). Once you download the Arduino and the display is running, you can button up the back because when external power is applied, Arduino finds the program and runs it.
The trade-off is this: each of the "common" terminals (see photo) has to have TWO wires inserted into each terminal slot. This was the function of the wiring harness that put these wires in parallel. This is not that difficult. I used ferrules for the job, but you don't have to: just twist two common wires together (solder if you want) and insert into the terminal. (If I redo the board, I'll put an input AND output, to allow for daisy-chaining).
The photo of the ferrules shows a closeup of the labeled terminal strip which I labeled by printing out the text on a sticky shipping label.
These are the terminals, left to right
R - Red bus
G - Green bus
B - Blue bus
+5 - 5 volts- this comes from the ATX power supply, not the Arduino
C - power supply common for +5 and +12 voltages
cl - short for SCL or I2C clock signal
da - short for SDA or I2C data line
Empty terminal (I was going to use it as an MCP23017 reset, but it is not required or used.
+12 - 12 volts
Power Wiring
All I/O boards require +5 and +12 volts. The +5 is for the MCP23107, and the 12 volts is for the drivers that feed the LEDS. ATX power supplies have so much capacity, I might have able to use only 5 volts for LEDS (and reducing the resistor value), but that would only entail bigger wire requirement because of increased current.
I used 4-position trailer connectors at both ends of the power cable. They are cheap, water-proof, and keyed so you can't insert them incorrectly and blow things up.
I also used a break-out for the ATX power supply, available from Amazon. I added LEDs to show if there is +5 and +12 power. You do not have to do this...instead you could use the Molex connectors that come with the ATX power supply meant for the computer peripherals. An old computer will have male and female Molex connectors.
Label the colored wires for the voltage they will be carrying. You can see I just wrote these on the outside of the power supply.
The Arduino gets +12 volts via the barrel connector on the UNO board, which is connected to the 12 volt bus.
The only danger in powering up is having the wrong voltage on the MCP23017 because +12 on these will damage them. Everything else will be okay, so check ahead of time that only +5 volts is going to the MCP23017.
We're DONE!!
All the wiring is done. Plug the Arduino into a USB connection and download the program MAIN32V64. You can download without powering up since the UNO gets power from the USB, but go ahead and start the ATX power supply. You should see all the patterns described in the program which runs for 4-1/2 minutes and then repeats.
Note that I used the word download because you always DOWNload from a server (the PC) to a minor computer like the UNO, not "upload" as often stated by Arduino users.)
The program is well documented, so I won't go into details here.
One note: Each pixel can be individually addressed, not just by segment. Refer to image with light blue Points. Each of 110 pixels can be addressed.
Check that all pixels are working, all LEDS light up and there are no issues before moving on to the last step: Finishing Up.
Downloads
Finishing Up.
If all the LEDs illuminate as they are supposed to, then you can install all the shot cups over the pixels for protection from the elements and dispersion of the light. I used DAP for this because if you ever have to remove the cup to repair/replace a pixel, it is easy to do so because DAP remains quite flexible. Easy to clean up too, if required.
One thing I found out was that with a slightly translucent plastic sheathing over the entire Star (ie each segment), I got an even BETTER dispersion. You may want to experiment with this. The poly sheeting I used was heavy material used as vapor barrier in building construction.
At first I mounted the Star on milk crates, but then added French cleats to hold the Star in place. These allow for quick mounting and dismounting, provided you leave the mating piece on the building you are mounting the Star to.