Maker 101
Published © GPL3+

Face With Animatronic Eyes, Motion Detection and Voice

Are you ready to create something both eerie and captivating?

IntermediateFull instructions provided3 hours1,406
Face With Animatronic Eyes, Motion Detection and Voice

Things used in this project

Hardware components

Arduino Nano V3.0 ATMEGA328P
×1
Mini MP3 Player Module
×1
HC-SR505 Mini Infrared PIR Motion Sensor
×1
MG90S Metal Gear RC Micro Servo
×1

Software apps and online services

Arduino IDE

Hand tools and fabrication machines

Smart Soldering Iron TS101-BC2
Soldering Iron Wire

Story

Read more

Custom parts and enclosures

face_main_p4eM9jPhHX.stl

Sketchfab still processing.

eyeball_jXqizkYY3X.stl

Sketchfab still processing.

eyelid_PcJnh8XZSY.stl

Sketchfab still processing.

eye_holder_main_BSm5A2UIfS.stl

Sketchfab still processing.

bars_v1_xq5tMaubNh.stl

Sketchfab still processing.

backside_WkckKnmEgk.stl

Sketchfab still processing.

joint_v1_ko9F1MRLg2.stl

Sketchfab still processing.

center-joint_v1_DF742WQMb9.stl

Sketchfab still processing.

MP3 File (I see you)

Schematics

Bill of Materials

Code

servo_motor_code.ino

Arduino
#include <Servo.h>

const int servo1 = 2;
const int servo2 = 3;
const int servo3 = 5;
const int servo4 = 6;
const int servo5 = 9;

Servo myservo1;
Servo myservo2;
Servo myservo3;
Servo myservo4;
Servo myservo5;

void setup() {
  myservo1.attach(servo1);
  myservo2.attach(servo2);
  myservo3.attach(servo3);
  myservo4.attach(servo4);
  myservo5.attach(servo5);

  myservo1.write(75);  //right 60 - center 75 - left 90
  myservo2.write(95);  //down 70 - center 95 - up 110
  myservo3.write(50);  //close 50 - open 80
  myservo4.write(80);  //down 110 - center 80 - up 60
  myservo5.write(90);  //right 70 - center 90 - left 110
  delay(2000);
}

void loop() {
  // MOVE 1
  myservo3.write(80);  //close 50 - open 80
  delay(2000);
  myservo1.write(90);   //right 60 - center 75 - left 90
  myservo5.write(110);  //right 70 - center 90 - left 110
  delay(1000);

  // MOVE 2
  myservo1.write(60);  //right 60 - center 75 - left 90
  myservo5.write(70);  //right 70 - center 90 - left 110
  delay(1000);

  // MOVE 3
  myservo1.write(90);   //right 60 - center 75 - left 90
  myservo5.write(110);  //right 70 - center 90 - left 110
  delay(1000);

  // MOVE 4
  myservo1.write(60);  //right 60 - center 75 - left 90
  myservo5.write(70);  //right 70 - center 90 - left 110
  delay(1000);

  // MOVE 5
  myservo1.write(75);  //right 60 - center 75 - left 90
  myservo5.write(90);  //right 70 - center 90 - left 110
  delay(1000);

  // MOVE 6
  myservo2.write(70);  //down 70 - center 95 - up 110
  myservo4.write(110);  //down 110 - center 80 - up 60
  delay(1000);

  // MOVE 7
  myservo2.write(110);  //down 70 - center 95 - up 110
  myservo4.write(60);  //down 110 - center 80 - up 60
  delay(1000);

  // MOVE 8
  myservo2.write(95);  //down 70 - center 95 - up 110
  myservo4.write(80);  //down 110 - center 80 - up 60
  delay(1000);

  // MOVE 9
  myservo3.write(50);  //close 50 - open 80
  delay(2000);
}

the_face_code.ino

Arduino
#include <Servo.h>
#include "SoftwareSerial.h"
#include "DFRobotDFPlayerMini.h"

// Servo pins
const int servo1 = 2;
const int servo2 = 3;
const int servo3 = 5;
const int servo4 = 6;
const int servo5 = 9;

// Servo objects
Servo myservo1;
Servo myservo2;
Servo myservo3;
Servo myservo4;
Servo myservo5;

// SoftwareSerial for DFPlayer
SoftwareSerial mySoftwareSerial(10, 11);  // RX, TX
DFRobotDFPlayerMini myDFPlayer;

// PIR sensor pin
#define SENSORPIN 7

// Timers
unsigned long previousMillis = 0;
const long pauseTime = 2000;     // 2 seconds waiting time between steps
bool isPlaying = false;          // Audio playback status
bool pirEnabled = true;          // PIR sensor status

void setup() {
  mySoftwareSerial.begin(9600);
  Serial.begin(115200);
  pinMode(SENSORPIN, INPUT);

  // Initialize servo motors
  myservo1.attach(servo1);
  myservo2.attach(servo2);
  myservo3.attach(servo3);
  myservo4.attach(servo4);
  myservo5.attach(servo5);

  // Servo start positions
  myservo1.write(75);
  myservo2.write(87);
  myservo3.write(50); // Eyelids closed
  myservo4.write(85);
  myservo5.write(85);
  delay(1000);

  Serial.println(F("Initializing DFPlayer..."));

  // Initialize MP3 module
  if (!myDFPlayer.begin(mySoftwareSerial)) {
    Serial.println(F("Unable to begin:"));
    while (true);
  }
  Serial.println(F("DFPlayer Mini online."));
  myDFPlayer.volume(30);  // Volume level (0 - 30)
}

void openEyes() {
  myservo3.write(80);  // Open the eyelids
  delay(1000);    // Wait 1 second
}

void playSound() {
  Serial.println("DFPlayer Working...");
  myDFPlayer.play(1);   // Play a 5-second audio file
  delay(5000);          // Wait for audio duration
}

void moveServos() {
  Serial.println("Moving Servos...");
  // Left and right eye look at the upper left corner
  myservo1.write(65);
  myservo2.write(75);
  myservo5.write(105);
  myservo4.write(65);
  delay(pauseTime);

  // Left and right eye look at the lower right corner
  myservo1.write(85);
  myservo2.write(105);
  myservo5.write(75);
  myservo4.write(105);
  delay(pauseTime);

  // Eyes centered
  myservo1.write(75);
  myservo2.write(87);
  myservo4.write(85);
  myservo5.write(85);
  delay(pauseTime);

  // Eyelids close
  myservo3.write(50);
  delay(pauseTime);
}

void loop() {
  int pirSensor = digitalRead(SENSORPIN);
  
  // If the PIR sensor is active and no action has been taken
  if (pirSensor == HIGH && pirEnabled) {
    pirEnabled = false;  // PIR sensor deactivated
    openEyes();          // Eyes open
    playSound();         // Audio file is played
    moveServos();        // Servo movements are started
    pirEnabled = true;   // PIR sensor reactivated
  }

  delay(50);  // A very short delay, for sensor stability
}

Credits

Maker 101
56 projects • 187 followers
Maker 101; Beginner and intermediate level Maker projects!
Contact

Comments

Please log in or sign up to comment.