DSC03926.JPG

Interactive Infinity Mirror

Interactive Infinity Mirror

Have You Waited Long Enough is an interactive object comprised of three acrylic disks. The bottom disk is an acrylic mirror, the middle is a laser etched clear acrylic piece, and the top is a laser etched clear acrylic disk with semi-transparent and reflecting window film applied to the top of it. The disks are centered on top of each other with a wooden ring and Lazy Susan mechanism acting as spacers and allowing the top layer to spin. A string of programmable LED lights, connected and programmed to an Arduino with an IR Range Proximity sensor, sit below the second disk to form an interactive infinity mirror.

All of this sits atop a common round table. The LED strip activates when the user approaches the object. Otherwise it appears to be a dark semi reflective surface. When activated the LEDs illuminate the two laser etched disks. The question “Have you waited long enough?” is laser etched onto the the two disks, and is only revealed when they are turned to be perfectly aligned. When the object is not aligned the phrase appears to be markings that cross over each other displaying a rather chaotic and confusing experience. To amplify this chaos, the infinity mirror reflects the light creating a layered effect of these reflections that appear to go back in the distance

This project started at a much smaller scale as shown in the images above. I wanted to make a more complete and finished object that had more impact than a foot wide circle. So I went bigger…

The images above show how the table is built. I started with an everyday round pub table and laser cut a 2 foot circle out of mirror acrylic to set on top. The next layer is a cnc routed ring of wood that houses the LED strip. The next layer is another 2 foot circle laser cut out of clear acrylic. I used a vinyl resist to use frosted glass spray paint to get a laser engraved look. The next layer is a lazy Susan mechanism to allow the top layer to spin. The top layer is another 2 foot circle laser cut out of clear acrylic with the same vinyl resist and spray paint process applied to it. There is also reflective window film on the top layer to aid in the infinity mirror effect.

Above shows the SHARP IR proximity sensor I used to trigger the lights and how the entire thing is wired to the arduino. Below I will include the arduino code used for the sparkle animation and proximity sensor


#include "FastLED.h"

#define NUM_LEDS 60

CRGB leds[NUM_LEDS];

#define PIN 9

/*

* Sharp IR (infrared) distance measurement module for Arduino

* Measures the distance in cm.

* Watch the video https://youtu.be/GL8dkw1NbMc

* *

Original library: https://github.com/guillaume-rico/SharpIR

*/

#include <SharpIR.h>

#define IR A0 // define signal pin

#define model 1080 // used 1080 because model GP2Y0A21YK0F is used

// ir: the pin where your sensor is attached

// model: an int that determines your sensor: 1080 for GP2Y0A21Y

// 20150 for GP2Y0A02Y

// 430 for GP2Y0A41SK

/*

2 to 15 cm GP2Y0A51SK0F use 1080

4 to 30 cm GP2Y0A41SK0F / GP2Y0AF30 series use 430

10 to 80 cm GP2Y0A21YK0F use 1080

10 to 150 cm GP2Y0A60SZLF use 10150

20 to 150 cm GP2Y0A02YK0F use 20150

100 to 550 cm GP2Y0A710K0F use 100550

*/

SharpIR SharpIR(IR, model);

void setup() {

//Serial.begin(9600);

FastLED.addLeds<WS2812, PIN, GRB>(leds, NUM_LEDS).setCorrection( TypicalLEDStrip );

}

void loop() {

// delay(100);

//unsigned long startTime=millis(); // takes the time before the loop on the library begins

int dis=SharpIR.distance(); // this returns the distance to the object you're measuring

while (dis < 30) {

// Serial.print("Mean distance: "); // returns it to the serial monitor

// Serial.println(dis);

int sparklefor = dis*10; //mess with for sparkle multiples

int srarpkdel = dis * 25;

SnowSparkle(0x10, 0x10, 0x10, sparklefor, srarpkdel);

dis=SharpIR.distance();

//delay(100);

}

setAll(0,0,0);

}

//Serial.println(analogRead(A0));

// unsigned long endTime=millis()-startTime; // the following gives you the time taken to get the measurement

//Serial.print("Time taken (ms): ");

//Serial.println(endTime);

void SnowSparkle(byte red, byte green, byte blue, int SparkleDelay, int SpeedDelay) {

setAll(red,green,blue);

int Pixel = random(NUM_LEDS);

setPixel(Pixel,0xff,0xff,0xff);

showStrip();

delay(SparkleDelay);

setPixel(Pixel,red,green,blue);

showStrip();

delay(SpeedDelay);

}

void showStrip() {

#ifdef ADAFRUIT_NEOPIXEL_H

// NeoPixel

strip.show();

#endif

#ifndef ADAFRUIT_NEOPIXEL_H

// FastLED

FastLED.show();

#endif

}

void setPixel(int Pixel, byte red, byte green, byte blue) {

#ifdef ADAFRUIT_NEOPIXEL_H

// NeoPixel

strip.setPixelColor(Pixel, strip.Color(red, green, blue));

#endif

#ifndef ADAFRUIT_NEOPIXEL_H

// FastLED

leds[Pixel].r = red;

leds[Pixel].g = green;

leds[Pixel].b = blue;

#endif

}

void setAll(byte red, byte green, byte blue) {

for(int i = 0; i < NUM_LEDS; i++ ) {

setPixel(i, red, green, blue);

}

showStrip();

}

Darcy GuenterbergComment