Shadow Mirror
I designed and built a large-scale engineering art interactive exhibit which was installed on the Tufts University campus in February 2024.
​
Shadow Mirror is comprised of 576 motors that recreate the viewer's image with shadows in a 24 x 24 resolution display. Despite numerous reductions into only a silhouette (and at a lower resolution), viewers can still see the movement of their form. Believing in the value of engineering and play, Gabe and Greg are drawn to the value of creation and engagement. By interacting with the mirror, the viewer is both participating in the creation of the display and seeing themselves reflected in the work.
​
Daniel Rozin's mechanical mirrors inspire the concept for this project, but our design and mechanism are entirely unique. I completed this project outside of any academic obligations with Greg Osha, a mechanical engineering peer.
Skills
Electronic Systems, Power Management, Sourcing Funding, Mechanism Design, Large-scale Project Management, Microcontrollers, Risk Analysis
Overview
A mechanical mirror is made up of hundreds of individually moving components, that create contrast when they move to portray an image.
​
My version of this is made of moving slots that cast shadows to create dark and light spots.
​
Below is a demo with a phone flashlight to represent the light source.
Daniel Rozin's Mechanical Mirror
Our mirror is 24 by 24 "pixels", and each pixel takes up ~2 square inches and is controlled by a micro servo.
​
We have a camera reading in footage and microcontrollers that convert it to signals for the servos.
The dark pixels will be portrayed with shadows, and the white pixels will be portrayed with light.
Protoyping
After deciding on the way we'd create contrast in our mirror (light and shadows), I brainstormed mechanisms to achieve this. Greg and I reviewed these and we decided that a rack and pinion-type mechanism would give us the most reliable outcome.
​
I prototyped a few quick versions of this with the laser cutter hoping to test the consistency of the mechanism, the validity of our circuit design, and to determine if laser cutting would work for the final version.
I built a small button-controlled circuit to move the servo via a Raspberry Pi Pico. Because the mirror will use 576 servos, I knew we'd have to use I2C to control them all. I used a servo shield which allows me to control 16 servos with only two outputs on the Pico.
I made some refinements to the mechanism and tested it again. This time I added acrylic side rails (as seen on the left) which keep the rack in line throughout its movement. We also decided to use low-friction tape under the racks to reduce the load on the servos. This ensures we don't have wood-on-wood rubbing. This prototype also helped us test how the light and shadows appear.
Because the final mirror will have so many parts, I wanted to use press fits wherever I could to make assembly simpler. It would be convenient to press the pinions onto the servo shafts, but we risk them falling off during use if the fit is too loose. I made a test piece to understand the laser cutter tolerancing and identify the perfect sizing for the pinion holes and side rail holes. These look really promising, and I plan to do a fatigue test on these fits.
4 Servo by 4 Servo Prototype:
This is our current most production-accurate design. If this prototype behaves well, we will need to make 36 of them to assemble the entire mirror
The goals of this prototype are to:
-
Make sure everything fits together well and the mechanisms work
-
Study how the light and shadows appear and look for ways to make it better
-
Try out assembly and identify pain points/ways to speed it up
-
Identify wire routing improvement opportunities
-
Run a fatigue test to determine the longevity of the system
Assembly was no doubt tedious for this prototype. Granted I was learning how to assemble it as I was working, but it took me 2.5 hours to build. In an effort to reduce this time, for the next iteration, I'll add laser-etched guides to help with the orientations of each piece.
​
Everything fits together well! I was also impressed with the consistency and accuracy of the mechanism. It was a very prideful moment to turn the servos on.
We have a back panel that helps with wire routing and makes sure that the wires don't get caught in the moving gears.
​
This was fairly easy to put on and route the wires through, but it requires a full disassembly of the servo shield and wiring to replace a single servo which I don't love. I don't have any ideas to make this better at the moment.
I used protruding pegs to hold the LEDs as they were woven through. This design allows us to "un-weave" them if we need to remove a panel.
​
The lighting looks good in our tests, but I want the shadows to be a bit more defined. I think LED light leakage coming from the left and right of the slots is hurting us. I then experimented with adding light shields to block the light from bleeding in from the sides.
These pieces hold the servo motors. They are mounted with small 2-56 bolts and it's a very tedious process to get them attached. To help with this, we laser engraved a small indent the size of the 2-56 nut. The nut sits in this hole and makes the assembly much easier.
​
This change doubles the amount of time it takes to laser cut these pieces, but it saves more than that during assembly and will make servicing the motors easier.
There were a bunch of miscellaneous small design changes we made to improve different aspects, like the holes in the side panels to provide access spots to the motors when it's all assembled, and some wiring adjustments in the back panel.
Older Prototype
New Prototype
The new prototype has light shields, the LEDs are offset 5mm from the front panel, and I painted the front panel white and the racks black. All of these work towards getting higher contrast and a more crisp image.
Assembly
At this point, I was confident with our design for the 16-servo box and we decided to move forward with mass assembly. We recruited friends to help glue up the boxes and to prep for this, I laser cut out the wood pieces and assembled the servo sub-assemblies. This was many hours of manual work.
I personally attached 600 motors to wood pieces using 1200 nuts and bolts...
I made an assembly guide for our helpers to reference.
We slightly adapted our design to make assembly easier by engraving numbers on the pieces to help with alignment.
Servo Issues and Troubleshooting (detour):
To validate our box construction we ran a stress test that set the racks in, and then out repeatedly.
20 minutes into our stress test, we noticed that a few motors would stop moving until we touched them, where they'd resume moving where they should be. Because they'd snap back like in the video, it seemed like there was some kind of wind-up or spring action happening.
​
3 individual servos on this box were misbehaving in this way.
​
I had to figure out what was going on quickly so that we could decide how to move forward. We ran some experiments to find the root cause.
Debugging Process:
- Determined current draw to see if it was a power issue
- The power supply gives more than enough power
​
- Tested servos out of the box with the same stress test to see if it's a mechanical issue outside the servo (like friction too high)
- After 15 minutes, one servo stopped working in the same way
​
- Observed signal using an oscilloscope to see if it was a communication issue with I2C
- The PWM signal was behaving as we expected (see video below)
​
- At this point, we believed the issue was contained in the servos themselves
- Tried using a different 40° range of motion in case it was getting stuck on something
- The servos were still getting stuck!
​
- I wondered if some servos were bad because they were cheap, or if we were breaking them by running the test
- During our stress tests, I noticed the servo cases were getting hot. I suspected the heat inside the servo (most likely due to friction) was becoming a problem, maybe burning out coils.
- Ran a less rigorous (and more realistic test) to see if we were breaking them
- In its normal use, each servo will not have to move as frequently for more than a few seconds.
- This test ran for 4.5 hours with no problems!
​
The current theory is motors were getting too warm which was causing issues with something internal. We decided to keep the active time down during testing.
Over the course of 2 build sessions, we glued up 27 boxes! We then used wood filler to create a smoother front surface, greatly enhancing the appearance.
I attached each box to the 80-20 cross beams and wired them up.
I also changed the design of the wire-managing back panels to an open layout. The holes are currently big enough to fit gears through and adjust them on the servo. This is incredibly helpful for alignment, as we realized the servos were not aligned properly originally.
This is the top 1/3 of the mirror: 2 feet tall and 6 feet wide. From here, our goal was to build the 4 remaining rows and hook everything up!
Although tedious, building the remaining boxes was straightforward!
​
I made custom 80-20 mounts for our power supplies, power distributors, and Raspberry Pi and wired everything up very carefully. The back of the mirror looks really cool.
Our next challenge was painting the front surface. An even white surface provides more contrast which helps create the image. We initially tried to spray paint the mirror, but it was too cold outside for the paint to stick properly and we thought we could get a better look by hand painting it.
The fully painted mirror looks super good, even before we added the lights
To get the most even lighting possible, the LED strips need to sit flat and not have bends. Because the LED strips are very flexible, to accomplish this, I used their built-in adhesive and stuck them on 0.02" thick ABS sheets. This gave it the rigidity we needed, but cutting it to size was hard! I need 24 strips of 6 feet by 0.2 inches. Doing this with just a ruler was time-consuming so I spent a few hours prototyping a jig.
The design below ended up working really well. I found that the trick was to score the ABS sheet rather than try to cut through it all the way. This limited blade deflection and decreased the resistance of a cut.
This is the current state of the project! The very last thing we will do before installation is replace some of the servo motors that are misbehaving. You'll notice them in the video below as dead pixels.
Installation
The Tufts Art Collection gallery managers were exceptionally helpful in finding a spot to display and install the mirror. We installed our mirror in the Tower Gallery on the first floor of Tisch Library — a prime location!
They borrowed a Tufts moving truck and we moved the mirror (very carefully) from the Engineering building, up the hill, and into the library.
​
​
The exhibit will be up for the whole Spring semester! It may move to a different location on campus after.
Overall, I am very pleased with how this project turned out. It was a huge endeavor from the start, and even when things got tough, Greg and I kept moving forward. With a project so large, with so many duplicate constructions, I learned how important the little details are, like the laser engraved nut holders on the pieces of wood the servos attach to, or the open layout of the back panels.
​
By prototyping aggressively, and making many iterations before scaling up, we were able to remove a lot of potential issues that would have gotten in the way of overall success.
​
This project came into reality with the help of a lot of friends who pitched in their time and labor to assemble boxes, the NOLOP Makerspace which stored the mirror during assembly, the Robotics Club who funded materials, and the Tufts Art Collection managers who organized the installation.