Lucky Infinity Cube
Taking lucky car dice to infinity
The Idea
At some point in everybody’s life, they get their first taste of infinity. Thanks to my dad carrying around an enormous VHS recorder on his shoulder in the 80s, I have footage of the moment I first saw it in a hall of mirrors at the Ontario Science Centre:
Infinity mirrors incorporating LED lighting are ubiquitous at this point:
As life goes on, it gets harder to experience the surprise of something completely new; luckily, all roads lead to hypercubes:
A cubical arrangement of infinity mirrors, while not exactly a representation of a hypercube, would be a very cool effect. We could make one as a desk ornament, but surely there is a more unique use case for a visually interesting infinity cube? Something more iconic?
The idea: lucky car dice, taken to infinity.
The Tools
- 3ds Max
- Creality Ender-3
- Arduino Pro Micro
- WS2812B Individually Addressable Programmable RGB LED Strip
- K40 40W CO2 Laser Cutter
The Process
Since the final product must hang from a car’s rearview mirror, I started with a size constraint. Based on the Amazon listings I surveyed, 2.75-inch cubes were a common fuzzy-dice size, so I used that as my design target.
My process was:
- Figure out how to make infinity mirrors
- Design a 3D-printable structure
- Design the electronics
- Develop the software for LED animation and user control
1. Infinity Mirrors
The principle behind infinity mirrors is simple:
The use of a partially reflective mirror allows some of the light to escape at each bounce. The repeated bounces create the infinity effect (with diminishing brightness after each bounce) for the viewer.
It is possible to create a one-way mirror out of any transparent glass with the use of mirror film:
The process is simple: cut the film to size, spray soapy water over the glass (keeps the film from sticking immediately), and apply:
I used laser-cut acrylic for this project, but before sizing the mirrors I needed to design the surrounding structure.
2. 3D-Printed Structure
I had already decided that the cube would have edge lengths of 2.75", but there was one other size restriction I had to work with: the width of the LED strip which would line the inner edges. Once again, I used the ubiquitous WS2812B individually addressable programmable RGB LED strip, commonly known as NeoPixel.
I used the narrow (8mm) 144 LEDs/m variant (3535-size LEDs, 3.5mm x 3.5mm each):
This gave 8mm to work with for the edges of the structure, leading to the following design:
The channel was designed for running the wires connecting each LED strip. I designed the cube structure in two pieces for ease of assembly:
And printed it out with an Ender-3:
With the mirror sizes constrained (60mm x 60mm) I cut them out with my trusty K40 laser cutter and assembled everything before moving on to the electronics.
3. Electronics
The wiring for the LED strips is straightforward:
To keep the wiring as discreet as possible, I used extremely thin insulated wire - specifically 30 AWG wire wrapping wire:
The TS-100 soldering iron with a TS-D24 tip is ideal for this type of fine work:
Since this cube would be hanging from a rearview mirror, I used heat-shrink tubing and thick wire to create a cable which runs back to the Arduino Pro Micro. To facilitate detaching the hanging cube from the car when not needed, I used a 3-pin JST-SM connector:
I wanted the ability to change lighting modes (brightness, speed, animation pattern, color, etc.) during operation; to facilitate this, I added a small momentary switch to the JST connector:
Everything runs back to the Arduino Pro Micro which is tucked out of the way:
To receive power from the vehicle, I used a fuse tap on a 12V circuit. I chose a circuit which is only active during vehicle operation (to avoid draining the battery when not in use), and ran that through a 5V step-down converter before running it up to the Arduino Pro Micro along the trim:
I tested that everything fits as expected:
With the lucky infinity cube assembled, I moved on to the software driving it.
4. Software
I wanted to present the user with a variety of selectable LED animations and give them an intuitive way of changing them.
4.1 LED Animations
To achieve smooth LED animations I needed the lowest latency possible. I used the FastLED library due to its efficiency. An added benefit was that it provided easy access to predefined color palettes for the LED strips. After an exhaustive review, I selected the following gradients:
For the choice of animations, I went with the following:
- Rainbow cycle: cycle continuously through the active palette in a rainbow-like pattern at user-selectable speeds
- Twinkle: randomly light a user-selectable number of LEDs in random colors from the active palette before fading each one out
- Chaser: spawn moving trails (or “chasers”) in a user-selectable color from the active palette
-
Solid color: light all edges in a user-selected color from the active palette
-
Fade cycle: cycle from the current color to a randomly selected color from the active palette at a user-selected speed
4.2 User Control
With only one button for the user to provide inputs, I used the length and number of presses to distinguish various inputs.
-
Long Press: Change to the next animation (wrapping around when reaching the end)
-
1 Short Press: cycle through options for the current animation (e.g. speed, color)
-
2 Short Presses: cycle through brightness levels
-
3 Short Presses: change active color palette
5. Improvements
The homemade half-silvered mirrors are subpar. They don’t transmit enough light, and they are not perfectly smooth (air bubbles are present). Purchasing a large panel of commercial half-silvered mirror and cutting it down to size would have produced a better result.