Introduction: 3D Printed Animatronic Eye Mechanism on the Cheap
Having bought a new 3D printer I was eager to try designing and printing some mechanical assemblies, so I thought a great place to start would be with this animatronic eye mechanism. It may look complicated, but this project was super quick to do (just 1 day!) and cost me absolutely nothing. Assuming you already have a 3d printer and some Arduino basics this project should cost you next to nothing and is doable in a single evening.
A joystick controls the motion of the eyeball, while a small push-to-make switch blinks the eye and another potentiometer controls how wide open the eyelids are by default (or you can just think of it as the "tiredness" adjuster).
Of course, this is the kind of project you need to see a video of to fully appreciate, so be sure to check out the video which also has instructions (if you prefer more visual instruction):
Supplies
You can get the majority of the parts from an arduino starter kit like this: https://amzn.to/31Cj4bw although you'll need to buy some more servos (https://amzn.to/2P7R5ha). If you need to buy anything individually, check the following list:
- Any Arduino board that can support 4 servos (check to make sure it has at least 4 PWM pins, most do) I used an Arduino Uno: https://amzn.to/2W2cPfT
- 4x SG90 micro servos: https://amzn.to/2W3ON4j
- Joystick: https://amzn.to/2N0CGRk
- Potentiometer (10k ohms is generally a good value to use: https://amzn.to/2o63ze6)
- Push-to-make switch (Some joysticks have this built in, but its easier to control when its seperate: https://amzn.to/35UM55G)
- 220 Ohm resistor: https://amzn.to/2JcjaAe
- Jumper Cables: https://amzn.to/2MCf9XQ
- 2 x M3 bolts or similar: https://amzn.to/33SsHEA
- Stiff Wire (I used packaging wire)
- Breadboard
- 3mm Universal Joint (This is the only part that isn't as easy to find, I bought them from this link:https://www.aliexpress.com/item/5pcs-Rc-Boat-Stai... )
Step 1: Printing
The base prints easily without supports, but the eyelids and eyeball are a little more tricky. I'd reccomend printing the eyeball facing up as shown in the picture, at as high a resolution as possible (I just got away with 0.1mm).
I wanted this to be a very easy and accessible project so I coloured the iris with some marker pens, but to get a better finish you could sand down the eyeball and paint it, perhaps using some 2-part epoxy to get a glossy finish and a lens effect over the cornea. As you can see however, I got great results with a quick and dirty marker pen paintjob.
Step 2: Assembley
The servos fit almost perfectly into their sockets, but I did have to wrap a layer of tape around some servos just to avoid having to use glue. I'd recommend you put the X and Y servos in place (refer to my images to make sure you have them facing the right way), followed by the eyeball itself. Using some needle-nose pliers, I bent a little hook into the wire and plugged one end into the servo horn and the other into the hole in the eyeball. This is easier to understand if you watch the video, but once you understand how the mechanism works, the assembly should be quite intuitive. Put the eyelids and their servos in after the eyeball is already secured, just to make it less fiddly.
The wiring of the Arduino is also quite simple if you already understand how to control servos with a potentiometer, but even if not the wiring diagram above should make the process quite easy. Each servo plugs into a digital pin on the Arduino (as well as positive and negative), and each potentiometer plugs into an analogue pin. Remember that a joystick is actually just 2 potentiometers that you can control simultaneously, so if you understand how the "Knob" example sketch works in the Arduino IDE, understanding how to control 2 servos with 1 joystick should be easy to grasp.
Step 3: Coding
The code for this project is relatively simple, I started with the "Knob" example sketch and added more servos and a few extras. "Knob" simply takes a reading from a potentiometer and maps it onto a range of values from 0 - 180, basically converting the analogue signal into an angle in degrees for the servo to move to. This code does exactly that except, rather than being values from 0 - 180, the numbers have been chosen specifically so that the movement will occur within a narrow range of angles. It might be best for you to experiment with values to get the most organic-looking movement possible, but note that if you don't like coding you can just experiment with the starting positions of the plastic servo horns or the lengths of the wires.
The eyelids take the reading from the Y-axis controller (up and down) and move based on this. When the eye looks up, the eyelids both adjust upwards slightly to accommodate this, massively adding to the realism of its motion. The push switch also sets both eyelids at once to move to the centre, causing the eye to blink.
Attachments
Step 4: Finishing
Simply upload the sketch to your Arduino and you should be good to go! Note that the puppeteering is the most important aspect of making the eye look realistic, so play with it often to get to uncanny-valley levels of creepy!