Introduction: Infinity Mirror Dodecahedron
I’ve wanted one of these infinity mirrors ever since I saw an advert on Instagram a few months ago. I was shocked to find that you need to pay over £1000 to buy these online and figured I could make my own for much cheaper. After all, how hard can it be??
The answer to that question is VERY, but don’t worry, because I have made all the mistakes so that you don’t have to, and have put together this intractable so that you will hopefully build yours much more easily.
The infinity mirror features 510 individually addressable LEDs built in a dodecahedron shape. One way mirrors on the faces of the dodecahedron bounce the light from these LEDs around within the shape, creating an infinite space illusion within its walls. The lights can be coded with patterns of your choosing, such as flying comets, infinite stars, fireworks, colour pulses and many more.
- 3D printer filament (1kg PETG, 1kg PLA)
- 5m (16ft) Individually addressable LEDs strip - 5V, 144LEDs/m, WS2812B, black PCB
- 5V 30A Power Supply, AC110/220V to DC5V 150W
- 2m 1mm 20WAG single core wire - 1x Red, 1x Black
- 2m 0.5mm stranded copper wire
- 0.6mm single core copper wire
- 2ftx3ft one-way mirrored acrylic sheet 2mm *OR* 2ftx3ft acrylic sheet + one-way mirror film sheet
- Arduino Mega or Arduino Uno
- 100x M3x8mm Socket head screws
- Black heat shrink tubing - various sizes
- Super Glue
- 3Pin Car connector plug
- 5mm braided cable sleeving
Step 1: 3D Printing
The main structure of the dodecahedron will be made from 3D printed parts. This structure supports the LEDs and wiring and will also hold the mirror surfaces later.
OBJ files for the 3D prints have been provided but I urge you to try and design your own, I had a lot of fun designing this project and learnt a lot along the way. If you would like to use custom or alternative LEDs you may need to change the dimensions of the frame. These files worked for me but I can't promise they'll work well for you, so I would advise against printing them all in one go only to find out they do not fit. Its always a good idea to test the pieces in small sections.
If you'd like to design your own structure in CAD I would recommend starting by modelling your acrylic pentagons, and working from there. The important angle you need to consider is the angle between two adjacent faces, called the dihedral angle. This angle is arccos(−1⁄√5) or ~116.6°. You also need to make sure your struts are at least as wide as the LED strip (12mm).
Because we will be soldering the LED strings whilst on the frame, I suggest using a higher temperature plastic such as PETG, the mirrors are quite heavy if you use glass so the extra strength is also a bonus. I chose to use black filament, but this is up to you, these parts will only be visible in small areas on the inside, and black usually hides them pretty well.
All struts can be printed flat on the build plate with no supports, these pieces are long and thin and can sometimes warp and curl up at the ends. The files provided have integrated ‘grab plates’, these grab plates increase the surface area at the ends and work like a custom brim which can be removed after printing.
I know every printer is different but for reference, the basic settings I used are shown below:
- Layer Height: 0.2mm
- Perimeters: 3
- Infill: 15% Rectilinear
- Supports: None
Once printed, the grab plates can be cut off using a flush cutter or a knife. I recommend sanding the ends flat to prepare for the glue-up. You can also sand the flat face from the build plate so that the LEDs will stick better.
The structure consists of 30 total individual struts, 3 of these struts differ slightly for the input corner. If you think you require power injection (see step 2 for more info), you need 12 of these alternate struts to accommodate for this.
Whilst assembling the structure you can start printing the cover plates and ends in the background, I used similar settings for these prints however they will be visible on the outside, so I’d use a finer layer height and use a colour you like, I used a matt black PLA for these parts. There are 30 cover plates and 20 end plates, note that one end plate is different because it accommodates for the input lines.
Step 2: Frame Assembly
With all 30 struts printed you can begin assembly. For this part you will need to prepare lots of small pins made from 1.75mm 3d printer filament, cut these to about 10mm (3/8”). Start with the 3 power input struts and glue one pin into the left side hole on one end of each strut. I recommend doing a test fit when the glue is dry to check the pieces fit before gluing together. Make sure you align the ends with a centre hole where the power will enter. IMPORTANT, when gluing you must glue a whole corner (3 ends) at once otherwise you will not be able to fit other struts later. Pinch the ends of the 3 struts together until the glue is dry.
Once you have a base, attach 2 more struts to each end, working your way around the dodecahedron, making sure to add those pins in on all glue-ups for extra strength. The last glue up can be tricky, you may have to make the pins slightly shorter to have room to glue the pieces together. Once complete the frame is done and we can move on to fitting the LEDs.
Step 3: LEDs and Soldering
This step is by far the most time consuming and difficult step. Don’t Worry! Take it slow, if something doesn’t work it’s better to move away and come back to it later rather than risking blowing up some LEDs. I had 7 strips blow up on me when testing during the soldering phase so I’m telling you from experience.
For this part of the build I recommend creating a cardboard mock up which you can draw on to help understand the wiring and snaking of the data line. It can be quite confusing so referring to a mockup can be very useful. The basic rule is…
- Every positive terminal is connected to the other two positive terminals at that vertex
- Every Negative terminal is connected to every negative terminal at that vertex
- The data line is one single snake that runs in a specific pattern around the whole dodecahedron, and you have to follow the data direction of the LEDs (Most LED strips have arrows to show data direction).
I have provided a schematic for the data line and LED orientation for the dodecahedron, unfortunately, due to the laws of mathematics, dodecahedrons are ‘Non-Eularian’. This means there is no single path around the edges of a dodecahedron that does not cross over another path. To account for this, we need to ‘jump’ a total of 9 times within the data loop to cover all edges of the shape. The frame has small built in tunnels which can be used to run a data line back under an LED strip to continue with the data path you can see where these jumps are needed in the reference layout graph.
To begin this step, we start with the power and data input cables. For the power cables I used 20AWG 1mm single core wire, 510 LEDs draw a lot of current depending on the pattern so I wouldn’t go with anything thinner just in case. For the data wire, standard 0.13mm stranded copper wire works fine. Cut these to your preferred length of extension cable (mine is 2m) and strip the ends. Tape the 3 wires together at each end and hold one end in a vice or with some pliers. Put the other end in a drill and twist the wires together until they are reasonably wound, this will stop the wires separating and make the cable stronger.
On one end of the power wires, break the wire into three by soldering 3 short lengths of 0.6mm copper wire to the end and cover with heat shrink tubing. Push all the wires through the input hole of the structure and now it’s time to start adding LED strips.
Each edge of the dodecahedron consists of 30 strips of 17 LEDs. To cut your strips, use a sharp Stanley knife or some flush cutters. The solder pads can sometimes be very small depending on the manufacturer so I would recommend cutting after the 17th LED, right up against the 18th. Then trimming off the 18th LED before cutting another 17. This does waste one LED every length, but it allows you to solder on the full solder pad at each end rather than a half a pad and makes soldering much easier. To prepare the strips it’s better to pre-solder them before installation. To do this, tape them to your desk or a piece of scrap wood, heat up the solder pad on the strip with the tip of your soldering iron, and push a small bead of solder onto the strip until you have a small mound of solder on the pad. Do this for all 6 pads per strip (3 on each end).
To begin with, glue down the first 6 strips, starting from the input, round in a pentagon and out, being mindful of the direction of the data flow. I recommend adding 3 dabs of super glue under each strip as the backing tape tends to peel up after a while. Now its time to connect the power wires.
Fold the input power wires over and solder all the positive wires to the positive terminals on the first 3 LED strips. Do the same with the negative wires and terminals. Solder the data wire to the start of the first strip. It may be useful to bend the wires in place with tweezers so that they are resting on the solder pads before heating and adding a little more solder. If you need to test the strips you can always build the power box, connect the Arduino (see step 4) and plug it in to test your connections work, I recommend doing a test every couple of strips to make sure everything is working correctly. Then move on to the next connection in the data loop.
At each connection, I would recommend having all 3 strips glued in, even if they are not being used in the loop yet. Connecting all 3 power terminals together will ensure the voltage is evenly distributed across all the LEDs in the project. To do so you need to make 2 small wishbone shaped wires for each vertex, see the images attached for reference. Its important to cover the middles of the wires with heat shrink tubing before you install them, as there are lots of crossing wires at each vertex. Cutting and bending these wires to fit can be very fiddly but it gets easier as you go along.
BEFORE gluing any strips that have a data jump (see schematic), you need to first solder a long strip of wire from the end of the data line, and fold it back to the other side of the strip. When gluing to the frame, this wire is pushed through the small tunnel in the 3D print so that it comes out on the data input side, to go to the next strip.
This process repeats all the way around the dodecahedron, at the end of the data loop only connect the power terminals, the data terminal doesn’t need a connection.
This took a reeeeally long time, so be patient and take it slow. Here are some more tips for this step.
- Do not hold the soldering iron too close to the LEDs as this can damage them.
- Try not to over heat your solders, you could again damage the strip or melt the 3D printed frame underneath.
- If your solder doesn’t seem to stick, try scratching the surface of the copper with a knife
- Don’t do too much at once, you may loose track of the layout and solder something incorrectly
- Double and triple check your connections!! If you solder a positive to negative, or the data line to the wrong terminal you can destroy some LEDs or even full strips
- Don’t leave conductive wires near the frame, I did this and one fell onto the connection when it was turned on… I blew up 4 strips… not a fun experience.
Step 4: Power and Microcontroller
When choosing a power supply you need to consider 3 things:
- LED input voltage
- Number of LEDs
- LED consumption
The strips I used require 5V input, ‘5050’ LED chips consume around 0.3 Watts at full white, maximum brightness and I had 510 of them. This means my total power requirements are maximum 153W. You can find your current draw by dividing your power by your voltage, so I found a power supply that can give me 150W, at 5V 30A.
Now its time to make the box which will hold the power supply, Arduino, and have some buttons for light functions. To do this, you can print the 3D box files provided, or design one yourself to your liking. The box needs to have sufficient ventilation for the supply, and leave enough space for wiring.
To assemble the box, screw the power supply in 4 places from the underside using the 3mm screws and an hex key. Before adding the wires make sure you have threaded the special ‘input end cap’ over the wire, and any wire covering or tubing that you would like to cover the wires. I also added a 3 pin plug connector so that I could pass the wires through desk holes and other tight spaces as the power supply is too big to do this.
Thread the cables from the power supply and your LEDs through the holes in the side of the box, and either tie them in a knot or clamp them in using the 3D printed bracket, this is to prevent the wires from being pulled out of the delicate electronics if someone trips over them. Connect the live, earth, and neutral cables from the power chord to the respective terminals on the power supply. Connect the positive and ground terminals from the LEDs to the power supply output terminals. If your LEDs run on 5V, your can wire the Arduino directly to the power supply, if you're using a 12V LED strip you will need a DC voltage converter to get to the Arduino’s 5V input voltage. You will also need to connect the ground for the Arduino to the same ground terminal to avoid shorting.
If you would like to change the patterns, colours, speeds etc. of your lights you will also need to wire in some buttons and potentiometers. I used 2 buttons and 4 pots for my project. These were used as custom hue, saturation, brightness and speed dials, and buttons for cycling through pattern and colour modes. There are plenty of Arduino instructables on here which will explain how to wire these up better than I can, so check them out if you're having any troubles.
Step 5: Coding
If you're new to coding Arduino, I suggest you download the IDE code below. You can use it as a base to work from. Note that you will need to install the FASTLED Arduino library in order for this code to work.
The FASTLED library is a convenient way of learning and programming large numbers of individually addressable LEDs from our Arduino. Checkout FASTLED instructables if you need some help.
You need to initialise the FASTLED library at the very start of your code, after this you need to define the basic characteristics of your LED strips
#define LEDsPerStrip 17
#define NumStrips 30
#define NumVertices 20
#define VertexConnections 3
#define NumLEDs (LEDsPerStrip * NumStrips
In your setup loop you need to configure your LEDs with the FASTLED functions, add this code:
FastLED.addLeds<WS2812B, LEDPin, GRB>(leds, NumLEDs);
The basic function for lighting up a given LED in the strip is given below:
leds[i] = CHSV(Hue,Saturation,Brightness);
Here you can denote your Hue, Saturation and Brightness values from a 0-255 range. Remember to include the ‘FastLED.show();’ to update the LEDs in each loop after your code has run.
For more complex patterns, it is important to reference the edge matrix. This matrix is used so that the code knows which strips are connected to each other in the LED loop, without this, a simple led running code will jump from one strip to another. You can use this matrix to check if the LED in your sequence is at the end of a strip, and pick an adjacent strip to jump to, making your comets travel around the shape seamlessly. The numbers in the matrix are LED numbers starting from 0, they are a direct reference to the layout diagram provided in step 3.
Step 6: Mirrors
As mentioned previously, there are two methods of creating the mirrors for the faces of the dodecahedron, One-way mirrored acrylic sheet, or clear acrylic with one-way mirrored film. Clear acrylic + film is the least expensive option, however is much more difficult to accomplish. Overall the more expensive option produces a clearer finish and saves time, if you’re on a budget I would recommend the film option.
Whether you’re cutting mirrored or clear acrylic the cutting process is the same. It is imperative that you DO NOT remove the protective film on the acrylic until installation. Acrylic scratches very easily and during the cutting phase it’s very likely you will ruin the clean faces if you have no protective film. To help with this step, you can print the pentagonal stencil to trace the acrylic from. Use a sharpie to mark out 12 pentagons with an edge length of 135mm (Circumcircle radius ~115). See the image for the layout.
Using a jigsaw cut the acrylic into the 12 marked shapes. You may need to drill holes in the middle of the sheet to start new cuts with the saw. It is important that you go slow when cutting acrylic, otherwise it will melt. Set the speed of your jigsaw to the slowest setting and do not rush. If you are using a one way mirrored acrylic sheet, the mirror coating is usually only on one side, make sure the blade of your jigsaw is cutting from the mirrored face into the acrylic, this will prevent fraying of the mirrored surface.
After the faces are cut, you can sand the edges flat using any course sand paper, they don’t need to be really smooth, just flat.
Applying One-Way Mirror Film
Skip this step if you are using pre-mirrored acrylic.
Applying mirrored film can be a difficult task, the acrylic likes to attract dust and if this dust comes between the film and the plastic it becomes very visible. To avoid this I recommend applying your film under water. Yes that’s right, under water. Fill a bath or big bucket with warm soapy water and do not remove the film until your pentagonal sheets are under the water, the soapy water will act as a barrier for dust and hopefully your mirrors should come out clean. One-way mirrored film usually has a protective plastic layer on the adhesive side so you will need to remove this (also under water) before placing the film on top of the acrylic sheet. I recommend cutting the sheet to a larger size than you need to and trimming later. Once together you can remove from the water and using a thin piece of plastic like a credit card squeeze out the excess soap and water between the layers. The soap makes the water squeeze out easier so keep pushing small bubbles towards the edge. Once dry you can cut the excess film around the pentagon flush with the edges.
The final step of this intractable is to install the mirrors into the frame of our LED dodecahedron. Make sure you do this in a clean dust free environment to avoid getting dust inside the shape, make sure to wipe down the mirrors carefully before installing them.
Begin at the power input vertex of the dodecahedron and push the 3 adjacent faces into the frame. Make sure the mirrored side of the acrylic is on the inside. You can then secure them in place using the 3D printed end cap and 3 small M3 bolts. Gradually work your way round the dodecahedron fitting the mirrors and end caps to the frame. In between each cap you can fit a cover plate to cover any power injection wires that follow the outer frame.
Once the mirrors are in place, you are finished! You can place the dodecahedron on its stand and turn on the power!
I find myself constantly gazing at my infinity mirror, and it’s very relaxing. Its patterns are continuously changing and never cease to disappoint! I had a lot of fun building this project, and I hope you will too. Leave a comment I you want me to make an Icosahedron version!
Grand Prize in the
Make it Glow Contest