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

The Process

Since the final product must hang from a car’s rear-view mirror, I started with a size constraint. The typical size of car dice (based on Amazon listings) are cubes with edges of 2.75" each, so I treated this as a standard.

My process was:

  1. Figure out how to make infinity mirrors
  2. Design a 3D printable structure
  3. Design the electronics
  4. Develop the software for LED animation and user control

1. Infinity Mirrors

The principle behind infinity mirrors is simple:

The use of a half-silvered/one-way 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 will 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, 35mm x 35mm 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 onto 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 AWG30 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 rear-view mirror, I used heatshrink 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 is it gave easy access to pre-defined color gradients for the LED strips color palettes. After an exhaustive review, I selected the following gradients:

For the choice of animations, I went with the following:

  1. Rainbow cycle: cycle continuously through the active palette in a rainbow-like pattern at user-selectable speeds
  1. Twinkle: randomly light a user-selectable number of LEDs in a random color from that active palette before fading it out
  1. Chaser: spawn moving trails (or “chasers”) in a user-selectable color from the active palette
  1. Solid color: light all edges in a user-selected color from the active palette

  2. Fade cycle: cycle from current color to a random 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.

  1. Long Press: Change to the next animation (wrapping around when reaching the end)

  2. 1 Short Press: cycle through options for the current animation (e.g. speed, color)

  3. 2 Short Presses: cycle through brightness levels

  4. 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.

The Result