Introduction: Desktop-Sized Infinity Dodecahedron
(If you watch the video on Youtube it has timestamps for the different effects. They don't seem to show up on instructables)
You may have seen various "infinity dodecahedrons" or other polyhedra across internet, such as here, here, here, or here. They are all mesmerizing in their own way. However, each of them has, for me, one major problem. They are all waaay too big. All of them are about the size of a basketball, if not larger. This is fine if you're going to a festival, or are going to hang them from a ceiling, but if you'd like to put one on a desk or a shelf, it's probably not going to be very practical. I wanted a desktop friendly version, so I set about making one.
My end result is a dodecahedron that is a bit bigger than a softball. Without the stand, it measures about 150mm from corner to corner, or 124mm from face to face. With the stand, it is about 203mm tall. You can see it compared to a fresh pencil in the pictures. It is small enough to have on a desk, while still having plenty of LEDs, and being build-able by hand.
The dodecahedron uses strips of mini (3535 SMD size) SK6812 addressable LEDs. These are more or less the same as the more common WS2812B (aka Neopixel) LEDs, but are more compact. They are arranged into lengths of seven LEDs on each of the dodecahedron's 30 edges, for a total of 210 LEDs. To drive the LEDs I used a Wemos D1 Mini mounted on a custom PCB housed in the dodecahedron's base. Everything is powered from a common 5V, 2A wall power adapter.
I have written code to drive the LEDs, including 18 different animations/effects.
If you have never worked with WS2812B style LEDs before, taking a look at the Adafruit Guide may be helpful.
Both the dodecahedron and the base are assembled entirely from 3D printed parts. The faces of the dodecahedron are laser cut from 1/8" or 3mm acrylic and are coated in one way mirror film.
For pretty much all "infinity" polyhedra, the tricky part is connecting the LED strips at the polyhedron's corners. Most people connect the strips with wires, but this quickly gets tedious, especially at smaller sizes. To make the connections a bit easier, I designed special corner PCBs that solder directly onto the strip ends, connecting all of them at once. These were for the most part successful, but I did have some tolerance issues that required some extra soldering.
Overall, this is a bit of a tricky build, especially when it comes to soldering. I would not recommend this project to a beginner, but if you have experience soldering in tight places you shouldn't have too many problems. Likewise, there are a few steps where it will be very helpful to have an extra person around to lend a spare pair of hands. I encourage reading through the whole Instructable thoroughly to help plan your build.
You can find all the files for the project at my Github here, and here (last link is for the Wemos control PCB).
If you would like to view schematics of the PCBs you can find them here and here.
Finally, if you have any questions about anything in this instructable, please leave a comment, and I'll get back to you.
Supplies
Custom PCBs:
To keep everything compact, you'll need to order a few of my custom PCBs (Click the download link on the right side of the screen to download them):
- One Wemos D1 Mini Control Board: Found here
- 20 Common Corner PCBs: Found here
- One Base Corner PCB: Found here
If you've never ordered a custom PCB before, it's easy. I briefly go over it in Step 2 of one of my other instructable here. For the Control Board, all the ordering defaults should be fine. For the Corner PCBs you should try to get them made with a 0.6-0.8mm board thickness. Given that the boards are quite small, not all PCB manufactures will be able to do this. I used JLC PCB who were able to make them just fine. You may want to get a few extras in case some get damaged/lost.
Laser Cutting:
You can find the cut files for the dodecahedron's faces here. You'll need 12 faces in total, cut from 1/8" or 3mm thick clear acrylic.I used a local laser cutting service to have mine cut. I've included files for both individual faces and an entire set. You may want to order a few extra as spares (the set includes one extra face). I think some services might charge you differently for single pieces vs the whole set, so you should check both. For reference, the faces are pentagons measuring 49mm along each edge.
If you are experienced with cutting acrylic you could try to cut them by hand from an acrylic sheet. I initially tried to do this, but quickly gave up! I designed a 3D printable tool which may help guide your cuts. You can find it here. Keep in mind that the tolerances for the dodecahedron are fairly tight; your face edges should be very flat and straight.
Electronics Parts:
(You might be able to find most of the parts for lower cost at places like Aliexpress, Ebay, Banggood, etc)
- Two meters of 144 LEDs/M SK6812 3535 (mini) led strip. Be sure to get a non-waterproof strip where the LEDs are full exposed and not covered in silicone. Should be 8mm wide. If you can find strips without adhesive backing, use them. Found here.
- One Wemos D1 Mini. V3 or greater preferred. Found here.
- One 74AHCT125N logic level converter. Found here.
- Three 3-pin 2.54mm female JST-XH connectors. Found here.
- Three 3-pin 2.54mm male JST-XH connectors. Found here.
- Twelve JST crimp connectors. Found here.
- One 1000uf, 10V electrolytic capacitor. Found here.
- One three pin male-male Dupont jumper cable (for testing).
- One 19 x 6 x 13mm Slide Switch (these are pretty common, the actuator should be 4-5mm tall). Found here. If you want to drive the LEDs at full brightness you'll want a larger switch like this one. (You shouldn't need to tho)
- One 5.5 x 2.1mm female DC Jack. Found here, or here.
- If you stick to my code and brightness settings, you can use a 5V 2A adapter. Found here. Could also use a phone charger with a USB to 2.1mm DC jack cable. Found here. If you want to drive the LEDs at full brightness, you'll need a 5V, 10A wall adapter with a 2.1mm DC jack. Found here.
- 22Ga stranded wire. (and 18Ga if you want to run at full brightness)
- 26Ga stranded wire.
- 26/22Ga solid wire (important that it's solid core!)
- Heat shrink tubing, 3mm Dia.
Other Parts:
- One way mirror film. Found here.
- Film application solution Found here. (although apparently dish soap and water works too)
- Three 8mm M3 screws.
- Three 5mm M3 screws.
- Three M3 nuts.
- Three 5mm M2 standoffs. Set Found here. (Optional; you could make do with some stacked M2 nuts)
- Two M2 nuts.
- Three 5mm M2 screws (or 8mm if you're not using the standoffs)
Tools:
- 3D printer.
- Soldering iron with fine tip + solder.
- Hot-glue-gun + hot-glue
- Crimping tool for JST terminals. Found here
- Wire cutters and strippers.
- Tweezers. (as a soldering aid)
- Scissors / hobby knife.
- Old credit card or squeegee. (for smoothing out mirror film)
- Clear Scotch tape.
- Gloves and filter mask. (for working with epoxy)
- 5 or 15 min epoxy. (see Step 5)
- Small popsicle stick or silicone brush (for applying epoxy)
- Acetone and Windex. (for cleaning mirror faces)
- PH0 Screwdriver.
- Heat gun. (for heat shrink)
Step 1: A Brief Explanation of Infinity Mirrors (optional)
Before I launch into the construction details, I thought I'd give a quick explanation about how infinity mirrors work. Reading this step is optional.
As you know, a mirror reflects whatever is in front of it. So, if you place two mirrors facing each other they reflect each other. Then, if you put an object between the two mirrors, it is reflected in both of them, while the reflection is also reflected in the other mirror. This creates the "infinity" effect where the object seems to be repeated into the depths of the mirrors.
However, this isn't very useful when using two normal mirrors, as it's hard to see between them. Instead, infinity mirrors are generally assembled using one mirror and one clear plate covered with a one-way-mirror film. The mirror film acts like a half-way point between being a full mirror and being transparent; reflecting some light, but also letting some escape. The light that escapes can be observed by us, forming the infinity effect. The reflected image fades after each subsequent reflection as more light escapes. This is why all infinity mirrors seem to produce a "tunnel" into the mirror.
For an alternate explanation with some diagrams you can check out this instructable.
The principles for an infinity polyhedron are the same as those of a traditional mirror. However, instead, all the faces of the polyhedron reflect each other, rather than just having two reflections. This may sound complicated, but the end result is that, when looking through a face, all the other faces appear to have multiples of the same polyhedron connected to them. In other words, it appears as if the real, physical polyhedron is surrounded on all sides by phantom polyhedra of the same type. Those polyhedra are also surrounded by more phantom polyhedra, who are then also surrounded. This continues until the reflections are too dim to see. Overall, the effect is probably more understandable by watching the video at the beginning of the instructable :).
Finally, you probably want the infinity effect to be observable from all sides, so one-way-mirror film is used on all the faces. This reduced the depth of the reflections because light is lost faster than when using a mirror.
Step 2: Construction Overview
Since most of the dodecahedron is 3D printed, I thought it would be helpful to have a full exploded view on hand to make assembly more clear. I designed the dodecahedron using Fusion360, which makes it easy to whip up a construction drawing. I've added an image of the drawing to this step, and also attached a PDF version (also on my Github). Please note that the drawing only includes the 3D printed and laser cut parts, and not any of the electronics.
Please look over the drawing. It includes a list of components to be printed, including quantities and any specific printing instructions. Unless noted, only print a single copy of each piece. Later in the instructable, I will refer to the parts by name as listed in the drawing (although hopefully you'll be able to identify them using the images attached to each step). You can find all the parts at my Github: here.
All the parts should be printable using any common FDM printer with a standard 0.4mm nozzle. Please note that some of the parts are quite small, particularly the brackets, so you'll want to check that they look okay in your slicer before printing. If you do have access to a resin-based printer, I would recommend using it to print the brackets and bracket covers.
Finally, please note that I printed all the parts using ABS filament. I do this so that I can smooth them using acetone vapor smoothing. This gives the parts a more "finished" look and is cosmetic only. PLA should be plenty strong enough for the dodecahedron, but if you want a similar finish to mine, you'll need to either sand everything or use some kind of epoxy coating. You'll have to do your own research on that.
Attachments
Step 3: Doedecahedron Construction Step 1:
We'll begin by building the dodecahedon's main body, and then move on to adding the LEDs.
In this first step we'll apply the mirror film to dodecahedron's laser cut faces.
To prep, make sure you are in a dust-free environment and that you hands are clean. You do not want to allow any dust or grime to get under the mirror film when you apply it.
You should also have each of the following at hand. You will need them repeatedly for this step.
- Hobby knife
- Scissors
- Squeegee
- Paper towels
- Masking/scotch tape
- Window film solution
Begin by cutting out a section of one-way-mirror film that will be big enough to cover all 12 faces.
Next, repeat the following steps for each face. Unfortunately my pictures for this step are limited, but the general process is fully demonstrated in this video here (Credit goes to Simon Jowett for the video):
- The face will probably have a protective paper layer on each side. Remove the paper on one side only. This is the side we will apply the film to.
- Roughly cut out a section of the film big enough to cover the face. You do not have to cut it into a pentagon, but it may make it easier to handle/position.
- The film should have a removable backing on one side. This will probably be hard to see/feel. To remove it, take two pieces of tape and apply them at the same corner on both sides of the film. Slowly peel the tape back, and hopefully the backing will also peel away with it. This may take a few tries.
- As you remove the backing, spray the film with the film solution. The solution stops the film from sticking to itself, and allows you to position it.
- Place the film onto the face with the sticky side down. Position the film so that it covers the whole face, applying more solution as needed to reposition it.
- Once you are happy with the position, run the squeegee over the face. This should press out the solution and any bubbles that may have been caught. Repeat this until the film is smooth. (please note that I did not do the best job at this, and so there are a few bubbles on some of my faces)
- Soak up any excess liquid with paper towels. Leave the film to dry. This should take 1-2 hours.
- After it is dry, trim away any excess film from the face using a hobby knife.
Once you have done these steps you should have a set of 12 mirrored faces.
Step 4: Doedecahedron Construction Step 2:
Print out 30 copies of both "bracket_half part 1.stl" and "bracket_half part 2.stl". The halves are almost identical, but part 1 has three cells while part 2 has four. I recommend using a brim around the parts to keep them stuck down.
Glue each pair of halves together as pictured, forming 30 complete brackets with seven cells each. Depending on how much of an "elephants foot" you printer produces, you may want to sand down the middle joint of each bracket.
Step 5: Doedecahedron Construction Step 3:
Now it's time to start assembling the sides of the dodecahedron. We will assemble the faces in groups of three, using three edge brackets to join them together. To help make sure the angles are correct, I've designed a construction aid you can print out. You can find it here. Since the tolerances for the dodecahedron's angles are fairly tight, it will help unsure you get them right.
Before you start I have a few notes:
- You should use the mirrored sides as the outer faces of the dodecahedron. The outer faces are more likely to get smudged with epoxy. This is okay with the mirrored sides because you can use acetone to dissolve and wipe away the epoxy. However, using acetone on pure acrylic tends to fog it up. Please note that the inside faces will be inaccessible once the dodecahedron is fully assembled.
- I recommend using a strong, but relatively slow drying glue to join the brackets and faces. I used 5 min epoxy (I'm impatient :) ), which was a bit fast; 15 min should give you a comfortable working time. You also might want to have some acetone handy for spot clean ups.
- Having an extra person on hand may be helpful. They should help handle the faces, but avoid the epoxy.
Remember to wear gloves and a respirator when working with epoxy!
Apparently, denatured alcohol can remove epoxy without damaging acrylic. I still recommend trying to avoid getting any on the faces though.
To assemble the sides, repeat these steps four times:
- Take three faces and remove the remaining paper backing from the acrylic.
- Insert three brackets into the construction aid as pictured. Make sure the point where the brackets meet is as even as possible.
- Spread epoxy along the inner edges of each of the brackets (ie where the faces are going to slide into). You may need to take each bracket out of the construction aid when you add the epoxy.
- As pictured, slide the faces into the construction aid so that their edges are pushed into the bracket's inner edges. The mirrored sides should be facing towards your work bench. Try to avoid getting epoxy on the faces, especially the pure acrylic sides because you can't use acetone to clean them.
- If you do get some epoxy on the outer faces it's okay. Wait till the epoxy has set enough for you to remove the face trio from the construction aid, but is still slightly soft. Next apply some acetone to the effected areas. The epoxy should soften enough to be removable. Do not get any acetone on the acrylic faces!
- Once clean, place the face trio back into the construction aid to finish setting. Remove once dry.
Once you've done this for all four sets of faces, you're almost finished. Finally, take one face trio, and, as pictured, glue edge brackets to all the outer face edges.
Step 6: Doedecahedron Construction Step 4:
Next, glue brackets onto two of the three remaining face trios so that they match the pictures above. This will simplify our next step, where we assemble all the trios together.
Step 7: Doedecahedron Construction Step 5:
In this step we'll assemble the dodecahedron from the face trios we made in the previous steps.
Sorry that I don't have any mid-build pictures for this step; I had my hands full putting the faces together and couldn't take any photos! It should be fairly straight forward, but leave a comment if you have any questions.
You'll definitely either want to use some slow setting epoxy or have someone on stand-by to help with this step.
Remember to wear gloves and a respirator when working with epoxy!
Using the bracket edges, the four face trios you made earlier should be able to slot together to form the full dodecahedron. Be sure to do a test fit this before applying glue. You should also make sure the inner faces are clean, because they will become inaccessible once the dodecahedron is assembled. I cleaned mine using Windex.
Once you are happy with your test fit, separate the face trios and apply glue to all of the exposed bracket edges. Then, recombine all the face trios to form the full dodecahedron. I recommend inserting the trio with brackets all around the outside last because it has more places to safely grab than the others. Using the construction aid to hold a trio in place may help. Like with Step 3, try to avoid getting epoxy on the faces, especially the inner ones!
Once together, the dodecahedron should be able to support itself without collapsing. However, depending on the epoxy, you may want to squeeze the trios together as the glue firms up to make sure they form an even dodecahedron.
Like in Step 3, once the epoxy is partially dry, you should clean any excess epoxy off the outer faces. Don't bother cleaning any finger prints away; you'll be handling the dodecahedron a lot in the next few steps.
Step 8: Strip Layout Guide
WS2812B LEDs communicate in a single file line, with each LED passing data onto the next until it reaches the end of the strip. So, to arrange the LEDs on the dodecahedron we need to draw a continuous line running through all its edges. Unfortunately, this isn't possible to do without doubling-back multiple times. So, no matter how you choose to lay out the LEDs, you end up with a fairly complicated arrangement.
I could let you choose this arrangement yourself, but then you'd need to change my code to match, and it's possible that the corner PCBs would have mismatched connections. Instead, I've made a guide so that you can lay out the LEDs exactly as I did. This is also essential if you want to change my code, because the guide is the easiest way to figure out what LED is where.
I've attached the guide as both an image and a PDF to this step (also on my Github). To make it more intuitive, it should be assembled into a dodecahedron as pictured using the following steps:
- Print out the guide halves.
- Cut around the outer edges of the halves to separate them, as pictured.
- Fold the outer pentagons of each halve upwards until the sides touch, forming two half dodecahedrons.
- Secure the sides in place using clear tape.
- Take the two halves and join them together to form a full dodecahedron. Make sure that the numbers at the joints match those pictured! IE: 21 and 8 share a common corner.
Using the Guide:
On the surface of the guide there are various numbers and markings arranged along each of the dodecahedron's edges. The numbers indicate the order of the LEDs, and go from 1 to 30. Each edge section holds seven LEDs, so by using the numbers you can determine which set of LEDs is on that edge. For example, 1 is the beginning of the strip, so the section holds LEDs 1 - 7 (actually 0-6 in software, sorry!) Likewise, 5 indicates the edge containing LEDs 35-42 ( 5 * 7 to 5* 7 + 7 ). The data from the sections is connected in order, so 1 connects to 2, 2 to 3, etc.
The arrows indicate the data direction of the section. I tried to keep it flowing clockwise as often as possible. On some sections, the arrows point away from where the next section begins, for example on edge 15 to 16. This means you'll have to double-back with the data. I'll go over how to wire this in a future step.
Finally, the black, red, green dots indicate the order of the ground, positive, and data pads on the strips. This is useful for arranging the corner PCBs and for testing.
Make sure you understand the guide, because you will need to use it in the next steps to attach the strips to the dodecahedron. If you have any questions, please leave a comment!
Attachments
Step 9: Corner PCB's Overview
Before you begin applying the strips to the dodecahedron, it's important to understand the corner PCBs. These PCBs a placed at each of the dodecahedron's corners and connect the strips together. This is easier and more reliable than cutting individual wire sections. However, I did have a few tolerance issues and solder shorts, so watch for those.
I'll explain the PCBs before leaping into why I designed them. You can safely skip the design portion.
The Base Corner PCB:
- The dodecahedron only features one of these PCBs, located at the first corner.
- It is the place when the power, ground, and data wires connect to the strips from the controller. This is why all the pads are through-hole'd, so that input wires can be inserted.
- The + indicates a positive pad, while the - indicates a ground pad. The center three pads are all data pads, but they are not connected to one another. You will have to manually connect two of the data pads (as shown in the next step)
The Common Corner PCB:
- These are applied to all the corners except the base, so 19 in total.
- Like the base corner, the pad polarities are indicated by + and - with the center pads being for data.
- Unlike the base corner, two of the data pads are connected. This is indicated with the "DIO" line.
- The remaining data pad is used to "double back" the data to a new strip that is not connected to the PCB. It is not connected to anything on the PCB, and features a through-hold for inserting a wire.
- By flipping over the PCB, you can keep two connections the same, while changing the polarity of one. This is critical to being able to use the PCB on all the corners (as I explain below)
The Design (optional):
The goal with the PCBs was to efficiently connect power and ground to all of the strips at each corner while also directing the data in the correct direction.
It is important to distribute the power evenly because if power is only injected at the beginning of the strip, the end experiences a noticeable voltage drop that degrades the LED color. By connecting all of the strip sections together, it creates a web of power, minimizing voltage drops. Likewise, with 210 LEDs in total, at full brightness, all white, the total current draw is, in theory, about 9A. Although you are unlikely to ever run the strip at full brightness (and heat buildup would probably limit the current draw anyway), I wanted to do my best to accommodate it. To that end, I designed the base corner PCB, which splits the power between three separate connections. Each JST-XH connector (they connect the base PCB to the controller) is rated to about 3A, so overall, they should be able to handle the current demands. I did not connect the data lines on this PCB because I wanted it to be able to be used as a general connector at any corner, in-case I had made a mistake with the connections.
The other number one thing I wanted to do was to keep the number of different PCBs you'd need to a minimum. If you go and arrange the strips on the dodecahedron in any particular order, you'll find you probably won't produce a set of corner connections that are essentially identical. This happened to me, and at first I thought I'd need about five different PCBs to cover all the different connection arrangements. I took a break from the project for a while, and when I came back I had to start over with the arrangement (largely because I had forgot what I had done haha!) In doing so I arrived at a strip setup where all the connections we basically the same (some are reversed). This is excellent because you only need one real PCB design.
I designed the PCBs after designing the dodecahedron, so I already had the dimensions for the corners. This left me with only an 8mm side long triangle of space to work with. Likewise, I knew that the PCBs had to be fairly thin to fit lie flush with the strips. I did not want to increase the size as this would have meant making the whole dodecahedron bigger. In the end adding all the pads and through-holes was tight, and I thought there'd be manufacturing issues, but they thankfully turned out fine.
Step 10: Applying the Strips Step 1:
We'll begin by attaching strips and wires to the base PCB. This is the bottom corner of the dodecahedron, and is where both power and data inputs are connected to the strips. This is more easily done off of the dodecahedron because you'll need access to both sides of the PCB.
Start by cutting seven ~10cm long lengths of 22Ga stranded wire. It will be helpful if you have three separate colors: one for ground, positive, and data. In my pictures, black is ground, red is positive, and blue is data.
Strip, insert, and solder the wires into the through-holes in the base PCB as pictured. Refer to the guide to make sure you place the wires correctly. Depending on how many strands your wires have, you may need to trim a few away to get them through the holes. If you cannot easily get them through, switch to 26Ga stranded wire.
To connect data between strip 5 and strip 6, take a short length of 26Ga solid wire and strip it bare. Flip the PCB over so that you are on the side without the wires poking out. This makes it easier to work on. Take the length of wire and solder it so that it connects the two unused center data pads as pictured.
Now, cut three 7 LED long sections of the strip. Cut along the center of the solder pads between LEDs, make sure your cuts are straight, and divide the pad into roughly equal halves. It is important that you leave enough pad on each side to solder onto! If your strip has adhesive backing, remove it.
Next, solder the strips onto the PCB as pictured. Make sure you follow the guide to get the orientations and directions correct! The LEDs should be facing away from the side with the protruding wires. It is helpful to tin the strip's pads before attaching them. You can solder the strips to both the top and bottom side of the PCB, I found the bottom to be easiest because the wires are out of the way. The strips do not need to be angled as pictured; I took the picture after I test fit them onto the dodecahedron.
Step 11: Applying the Strips Step 2:
Using hot-glue, attach the base strip trio you just soldered to the dodecahedron. Make sure the LEDs line up with the bracket's holes. The base PCB may protrude a bit from the corner due to the wires. This is okay as long as the surrounding LEDs line up with the bracket holes. Note that where you put the base PCB will be the bottom of the dodecahedron. Also, you can ignore the tape in the photos, that was for testing purposes.
Now, cut out 27 more seven LED long strips; enough to cover all the dodecahedron's edges. As with the base PCB, make sure your cuts are straight and even across the pads. You should remove any adhesive backing, and tin the pads (I didn't do the tinning, which was a mistake).
Next, you have two options:
- Attach all the strips to each of the edges of the dodecahedron using hot-glue. Make sure you follow the guide exactlywhen placing the strips to get the directions correct! It maybe helpful to write down what strip you are on at each step. This is what I did, and it worked out well.
- Skip on to the next step and begin soldering the corner PCBs in place, adding strips to the dodecahedron one by one as you go, following the guide. This may be easier to keep track of, but due to tolerance issues, soldering all the connections to the PCBs may be more tricky.
Step 12: Applying the Strips Step 3:
Now it's time to solder all the corner PCBs in place and add the double back wires.
As pictured, press a common corner PCB into place at each corner of the dodecahedron. They should be a loose press fit. Make sure their orientation is correct by following the guide. That is, make sure the data is connected between the two correct strips, and that the positives and grounds are correct.
Once a PCB is in place, connect its pads to the surrounding strips by bridging them with solder. This is a bit fiddly, but if you use plenty of flux and a fine tipped iron, it should be more time consuming than difficult. Watch for shorts between the pads and the strips!
When I assembled my dodecahedron I didn't do a great job of pressing it together. This was mainly because I tried to do it alone, and my epoxy set too quickly. This meant that on some of the corners, I had gaps that were too large to bridge with solder. For these cases I used small lengths of 26Ga solid wire to connect the pads. You can see this in the pictures. Hopefully you did a better job than me, and won't have to do this too many times.
As you connect the PCBs you should also connect the "double back" wires for the data. These direct data backwards, connecting to a strip on a different corner. In my pictures I used red solid 26Ga wire for this. Each of the corner PCBs has a data pad with a through-hole specifically for the wire, which should help make the connections more solid. Remember to follow the guide to make sure that the data jumps to the correct strip section.
At this point the dodecahedron is all wired up, we will switch to building the controller before adding the finishing touches to the dodecahedron.
Step 13: Controller and Base Constuction Step 1:
Now we will assemble the controller and mount it on the base for the dodecahedron. Overall the controller is simple: 5V power is supplied through a DC jack, which also connected to a switch to turn it on/off. Power is fed from the switch to the control PCB, which distributes power to the Wemos and the LEDs. The Wemos feeds data to the LEDs via a logic level converter. Note that if you want deviate from my code and run at higher brightness's, you'll need to modify the controller for 10A. This shouldn't be necessary, as the LEDs are still plenty bright using my code. Only do this if you are comfortable with electronics/LEDs. I'll add notes where needed for this.
Grab the controller PCB, the Wemos D1 Mini, and the 74HCT125N (ignore the headers in the picture above, you do not need them).
Please note that the controller PCB is a general purpose PCB that I've designed for breaking out the Wemos pins and driving LEDs. This instructable does not use all the connections/components, this is intended.
If your Wemos doesn't have headers solder onto it, solder them on now. You should also test you Wemos to confirm it's functional. You can do this by uploading "blink" using the Arduino IDE. I will not go over how to setup the Wemos in the Arduino IDE here, but you can find instructions on step 11 of my Pixel Shades instructable.
Flip the controller PCB onto its back and bridge the VIN and upper two rightmost pads as pictured.
Next, under where the 74AHCT125N is inserted there are four pairs of pads. These bypass the 74AHCT125N for pins D5-D8. If you would like to add buttons later you can optionally bridge all but the D8 pad (which is used to drive the LEDs). Then solder the 74AHCT125N in place.
The 74AHCT125N is a high speed logic level converter (LLC). The Wemos outputs 3.3V level signals, while the SK6812's are spec'd for 5V level signals. So, to guarantee that data from the Wemos can be picked up by the LEDs you need a LLC. The 74AHCT125N is one of the only LLC's that's fast enough to convert the signals. Unfortunately, it's a one way conversion, so if you wanted to hook up any inputs (ie buttons) to pins D5-D8 you need to bypass the LLC. You could use the other Wemos pins, but the D5-D8 are easier to reach on the PCB.
Step 14: Controller and Base Constuction Step 2:
Take three 3-pin female JT-XH connectors and solder them to the D8, D2, and TX pin rows on the controller PCB. Be sure that their orientation matches that as pictured.
You should also attach the 1000uf electrolytic capacitor to the two PCB through-holes, as pictured. Bend it over to the side so that it lays flat. Make sure the polarity is correct; positive and ground are indicated on the PCB with +, - respectively. The capacitor helps protect the LEDs from large inrush currents.
Finally you should solder the Wemos in place. Trim away an excess header lengths.
Step 15: Controller and Base Constuction Step 3:
Print out one "Mount_base.stl"
At one corner there is a raised block with a circle hole. Next to it there should be a small slot.
As pictured, insert the DC Jack connector into the hole and one of the switch tabs into the slot. Bend the switch tab to hold the switch in place.
Next take several ~8cm lengths of 22Ga stranded wire and solder them to the switch and jack as pictured. The red wires are positive and black wire is ground.
We want the DC jack to be center positive, which means that the positive line is connected to the central pole inside the jack. This should connect to the shortest of the jack's left/right tabs, but you should double check. Likewise, the rest of the jack should connect to ground. The two remaining tabs should both work as ground, but check to make sure they're internally connected.
The center tab of the switch should be connected to the positive of the DC jack.
Don't forget to add heat-shrink to the connections once you're done!
If you want to drive the LEDs at 10A, you should use 18Ga wire in place
of 22Ga. You should also upgrade to a beefier switch (linked in supplies); there's room on the base for it, but you'll need to do some modification.
Step 16: Controller and Base Constuction Step 4:
Next we'll attach the controller to the mount base. (Please ignore the extra wires in the first picture)
First take three 5mm M2 standoffs and screws, and attach them to the three base holes as pictured. The threaded ends of the standoff should be pointed upwards.
Next, solder the ground and power leads from the switch/DC jack to the control PCB. The should be soldered to the + and - through-holes labeled VIN at the end of the PCB as pictured.
If you want to drive the LEDs at 10A, you should add 18Ga wire to the underside of the PCB directly connecting the VIN wires to the JST-XH + and - pins.
Finally, place the controller onto the standoffs. They should fit through the controller's three un-plated holes. You may have to trim a bit off the bottom of the middle JST connector to get the standoff through. Secure the controller using two M2 nuts on the two front standoffs (there isn't room for one on the rear standoff).
At this point the control setup is done.
Step 17: Testing
The SK6812 3535 led strips I used are rather fragile, much more so than normal WS2812b strips. I had a few LEDs fail on me, probably due to over-heating when soldering. This can be particularly annoying, because once you have to replace one LED, splicing in a new one might cause the one next to it to fail, and so you can get caught in a frustrating cycle. Likewise, joining the strips to the corner PCBs is fairly fiddly, and can cause problems.
Once dodecahedron is fully finished, the strips are covered up, leaving no way to access them. So you should test it now. Skip over to the Code step to get the controller working, then return here.
You can create a test probe using three male Dupont jumper cables. Cut off one end of the group of cables, and replace it with a male JST-XH connector, as pictured. You can then connect the cable to the controller. By pressing on the pads of the LED strip with the male ends, you should be able to get the LEDs to light up. Make sure the connections are in the correct order, as indicated on the layout guide!
Step 18: Final Dodecahedron Assembly Step 1:
With the controller finished, and the dodecahedron tested, we can do the final steps of the construction.
Print out 30 of "Bracket_Cover_Full.stl"
For three of them you'll need to trim one of the ends off. Use these three to cover up the base edges of the dodecahedron as pictured. The trimmed ends make room for the wires coming from the base PCB.
Use the remaining covers to cover up all the exposed edges of the dodecahedron. Note that once the covers are glued in place you will not be able to access the strips!
Glue the covers in place with the glue of your choice.
Step 19: Final Dodecahedron Assembly Step 2:
Please ignore the red connectors in the pictures. Do not add them to your dodecahedron!
Print out one copy of "Center_wire_guide.stl".
Slide the wires coming from the dodecahedron through the central hole in the wire guide. As pictured, the guide should be able to rest flush against the three bottom bracket covers.
Glue the guide in place us a strong glue of your choice.
There are three hexagonal holes in the bottom of the guide for M3 nuts. Sand the sides of the nuts before inserting them, this helps glue grip them. When you insert them, you may want to keep screws in them to stop glue gumming up the threads. Remove the screws after the glue has partially set.
Step 20: Final Dodecahedron Assembly Step 3:
Next, we'll add the JST-XH male connectors to the wires coming from the dodecahedron.
Strip and crimp the wire ends with JST crimp terminals, then insert the terminals into the JST-XH connectors, matching the orders as pictured. All the connectors are essentially identical, except for the one that has the extra data line.
Step 21: Final Dodecahedron Assembly Step 4:
Print out one "Mount_main.stl". You might want to add a brim to keep the corners from peeling up.
The mount has a triangular hole in the center surrounded by six M3 holes. As pictured, you should be able to squeeze the JST connectors through the center hole. You'll need to do them one at a time.
Once inserted you can secure the mount by to the dodecahedron using three 5mm M3 screws. These screw into the nuts in the center wire guide. The rotation of the mount is up to you.
Next, take the control board and connect the JST connectors to it as pictured. Make sure that the connector with the data wire is connected to the D8 pin position. The other two connector just provide power, so their order doesn't matter.
Step 22: Final Dodecahedron Assembly Step 5:
For this final step, print out three "Mount_foot.stl" and one "programming plug.stl"
The feet are used to hold the mount parts together. Since the feet are not symmetrical, I added a small hole for a wire. The wire fits into a corresponding hole in the base and stops the feet from rotating. You can see the wires inserted in the first picture. 26Ga solid wire should work.
That being said, you don't really need the wire; you could just glue the feet directly on to to the mount_base. Likewise, if they are tight enough, they probably won't move anyway.
To secure the mount_base and mount_main together, use three 8mm M3 screws, inserted through the holes in the feet. These should feed into holes in the mount_main, locking the parts together. There are spaces for M3 nuts in the mount_main (like with the center_wire_guide) but you don't need to use them, as it's unlikely to be pulled on with much force.
Finally, you can use the programming plug to cover up the hole for the programming USB port. It should be glued in place. (I originally thought that I might use a different controller for the dodecahedron, so I made the hole for the USB port large enough to accommodate different controllers. I the end this didn't end up happening, so I added the programming plug as a partial cover)
Finally, your dodecahedron's faces are probably quite smudged with finger prints by now. Since we're done manipulating it, you are safe to clean them now. I recommend using a light spray of Windex on each face. Don't use too much because you don't want it leaking onto the LEDs or the interior! You can spread the spray across each face with your finger. Let it sit for 20-30sec and then wipe it away with a dry cloth. You might need to repeat this a few times depending on how dirty the face is.
At this point the dodecahedron is compete and ready to go! All that's left is to upload the code.
Step 23: The Code
I've written code for the dodecahedron that includes 18 different effects.
It can be found at my Github in the folder "Inf_Dodec_Code".
Before you can upload the code to the Wemos, you'll need two libraries:
- My "PixelStrip" library
- The Adafruit Neopixel library
You can download the PixelStrip library from here. Download all the files and place them in a folder named "PixelStrip" in the libraries folder of your Arduino install directory. You can install the Adafruit Neopixel library using the Arduino IDE's library manager. Once you've installed both libraries you can open Inf_Dodec_Code.ino and upload it to the Wemos. If everything's good, the dodecahedron should begin cycling effects (make sure your are using the wall adapter for power). If something's wrong, please post a question and I'll try to help.
If you've made it this far, thanks for reading! I hope that assembling the dodecahedron wasn't to difficult, and that you enjoy the final results! If you have any questions, please leave a comment and I'll get back to you.
I've added a few extra notes below, but they are optional.
Changing/Adding Effects:
If you'd like to disable an effect, you'll first need to find it in the Inf_Dodec_Code.ino file. It will be in the large switch statement in the main void loop(). The effects aren't individually labeled, as it's hard to describe them with just comments, so you might have to do a bit of hunting. Once you've found the effect, you just need to change the case number to anything higher than the total number of effects (99 for ex) to disable it.
You're also welcome to modify or add your own effects. To add an effect, add it to the switch statement in the main void loop(), and increase the "NUM_EFFECTS" var. My library is capable of doing a wide range of effects, but it is a bit difficult to work with. Using the layout guide (from Step 8) should help. Likewise, although the Wemos is WiFi capable, I haven't implemented any WiFi features as of writing.
If you want to control the dodecahedron over WiFi, I'd suggest using WLED, however you will need to setup your own effects.
Buttons:
In the code I've included support for three button controls. These are an optional add-on to give you some control of the dodecahedron. The easiest way to add the buttons would probably be to use a triple button breakout board that I've designed here. The assembly steps and connections to the control board are the same as found in my Pixel Mask instructable here. Keep in mind that you'll need to position the board in the dodecahedron's base and drill a few holes for the buttons.
By default the buttons are disabled in the code, you can enable them by setting "BUTTONS_ENABLE" to true.
When using my code, the buttons do the following things:
- Button 1: Next Effect (or restarts current effect if effect rotation is off)
- Button 2: Effect Rotation on/off. This makes the current effect repeat indefinitely
- Button 3: Brightness cycle. You can adjust the increments by changing the "brightnessLevels" array in my code.
The code stores the effect number, brightness, and rotation on/off in EEPROM, so they should be remembered after turning the dodecahedron off/on. In other words, if you cycled to effect number 5, and set the brightness to level 2 before turning the dodecahedron off, when you next turned it on, it would start with effect number 5 at brightness level 2. EEPROM does have limited write cycles (more than you'll ever probably use). To limit the writes I only write after a delay, so that multiple quick button presses only write once. You can disable/enable its use with the "EEPROM_ENABLE" flag (by default it is disabled).