3D Printed Animatronic Eye Mechanism on the Cheap




Introduction: 3D Printed Animatronic Eye Mechanism on the Cheap

About: The name "Ikkalebob" was invented by my cat when she ran across the keyboard. I attempt all manner of projects, from home engineering to prop replicas. Follow me on Instructables and my YouTube channel: http...

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):

Step 1: Parts

Obviously a 3D printer is essential for this project, but other than that there are no specialised tools. The only other things that might be handy are some needle-nose pliers for the more fiddly bits.

The parts you will need are:

  • Any Arduino board that can support 4 servos (check to make sure it has at least 4 PWM pins, most do)
  • 4 SG90 micro servos
  • Joystick
  • Potentiometer (10k ohms is generally a good value to use)
  • Push-to-make switch (Some joysticks have this built in, mine was broken)
  • 220 Ohm resistor
  • Jumper Cables
  • 2 x M3 bolts or similar
  • 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 2: 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 3: 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 4: 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.

Step 5: 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!

Robotics Contest 2017

Second Prize in the
Robotics Contest 2017

Design Now: In Motion Contest

Third Prize in the
Design Now: In Motion Contest



  • Water Contest

    Water Contest
  • Tiny Home Contest

    Tiny Home Contest
  • Fix It! Contest

    Fix It! Contest

48 Discussions


6 weeks ago

Good afternoon from Spain

sorry for my English .

my problem sure is basic how can I put the pieces to print?

bottom eyes and Top + Lid

They stay detached from the bed and can not print in the air.

Thank you for your attention

Can we get more pictures of how the servos are connected to the eye?

5 replies

I've added a few more pictures to step 3, I hope that clears up any confusion :)

Very cool!

There's definitely room for improvement, like having 1 servo control the top and bottom eyelids synchronously.

It can also be optimized to get it to fit in a robot head... ;)

I've got a couple of other projects I have to work on first, as always haha.

Hi, I designed it in millimetres. Hope it works out well :)

Could you please put a image of how you wired it on your breadboard?

Hey there - this is just absolutely amazing! I really think this is truly a spectacular setup for my puppets that I'm attempting to build. Do you have any recommendations for building a two-eye unit?

I really am a noob when it comes to mechanics (but I've got a small 3D printer and a willingness to try!). Not to make a blatant skip, but have you considered selling these units yourself?

Thank you, and I'll probably have LOADS more questions!

1 reply

Much appreciated! I can't really sell you one at the minute but I can give some recommendations. I did start to build a two-eye mechanism and I made a short video about it (here!). I tried to use one servo to control different parts of the eye at the same time but in the end I think its more reliable to just not change anything and have two single eye mechanisms instead. One thing I'd definitely suggest though is to look into using a servo driver board (I touched on this in the second video) because with two eyes there will be too many servos to power through just the arduino. 

Feel free to ask more questions! I could send you the 3d model I used in that video too but personally I think its a poor design.

Thanks - I'm in the process of finishing off my build of this, and so far it's going great. What I found was that it was hard to get a good print of the eyelids - but that a standard pingpong ball is exactly the right size to cut into the appropriate shapes - and you can get both eyelids out of one ball if you plan the cutting carefully.

Thanks again for the inspiration - I currently plan to mount mine on top of a large spider-style robot, for added creepiness!

2 replies

Great idea with the ping pong ball, please post a picture when you're done ! I need to see the spider robot haha

Here's a video of the eye on its own, showing the ping pong ball eyelids. I basically cut them from the ball in a similar shape to your 3D prints, and mounted in exactly the same way. Hopefully the lightness contributes to a good fast blink, even with cheap servos.


I'm so going to make this at some point. I can feel some halloween inspiration coming!


1 year ago

This is great. I want to add an LED to the center of the eye. I think that if I incorparate the blink sketch into the code it should work. Any suggestions?

When we plug in the motors they either don't spin at all or they spin and stop because they cant go any farther. At the time, we don't have the X or Y cables plugged in. Neither did it change when we did plug the X or Y cables. Please help we only have 24 hours.

1 reply

Sometimes the arduino takes around 20 seconds to get going and during that time the servos freeze, have you waited that long? Are you using the 5v pin or the 3v? It might be easier for me to help if you upload a photo of the wiring.
Another thing to try is to see how the servos move without the plastic horns screwed in? Maybe the horns just need repositioning.

Thank you so much! That clears up like a million questions!!

I have figured it out. But, can you solder the jumper cables to the analog stick? I provided a link to the adafruit one I got. https://www.adafruit.com/product/512?gclid=CKu3_8mg0tMCFUK2wAodPM0Fxw