Note: This project assumes you have Arduino IDE setup and know how to connect and write to an Arduino Uno board.

Hook Up Your Servos

The first step is to hook up your servos to your UNO. If you purchased the same servos I used from Amazon the wires are as follows:

The Uno has issues powering servos consistently at 5V and you'll be hooking up multiple servos to 5V, so I recommend using an 5V power supply.

The signal wires will connect to Uno Pins 9, 10, and 11 and the servo power and ground will connect to the power supply. ** Make sure you connect your power supply's ground to your Uno's ground**


Write Sketch and Upload the Code

Plug your Uno into your computer and open a new sketch in Arduino IDE. Copy and paste the code from below and upload to your Uno:

#include <servo.h>

//original code transcribed from Mike Theevil's video: https://www.youtube.com/watch?v=1doy5nNS-cg
//modified by Smalls on Nov 8 2023

Servo tail; //create servo object to control a servo
Servo head; //create servo object to control a servo
Servo eyes; //create servo object to control a servo
// twelve servo objects can be created on most boards

void loop_tail() {
 int t1 = random(0, 170); //defines variable and sets servo step amount between 0 and 170 degrees
 int t2 = random(500, 800); //defines variable and sets random delay 
 int t3 = random(400, 1000); //defines variable and sets neutral random delay     

 tail.write(t1); //makes servo position random
 delay(t2); //triggers random relay
 tail.write(0); //resets servo to neutral position
 delay(t3); //triggers neutral random delay           
}

void loop_head() {
 int h1 = random(0, 170); //defines variable and sets servo step amount between 0 and 170 degrees
 int h2 = random(500, 800); //defines variable and sets random delay 
 int h3 = random(400, 1000); //defines variable and sets neutral random delay     

 head.write(h1); //makes servo position random
 delay(h2); //triggers random relay
 head.write(0); //resets servo to neutral position
 delay(h3); //triggers neutral random delay           
}

void loop_eyes() {
 int e1 = random(0, 170); //defines variable and sets servo step amount between 0 and 170 degrees
 int e2 = random(500, 800); //defines variable and sets random delay 
 int e3 = random(400, 1000); //defines variable and sets neutral random delay     

 eyes.write(e1); //makes servo position random
 delay(e2); //triggers random relay
 eyes.write(0); //resets servo to neutral position
 delay(e3); //triggers neutral random delay           
}

void setup() {
  tail.attach(9); //attaches the servo on pin 9 to the servo object
  head.attach(10); //attaches the servo on pin 9 to the servo object
  eyes.attach(11); //attaches the servo on pin 9 to the servo object
}

void loop() {
  byte randNum = random(3); //max range of numbers
  switch (randNum) //switches between the random numbers assigned in this loop
  {
    case 0:
      loop_tail();
      break;
    case 1:
      loop_head();
      break;
    case 2:
      loop_eyes();
      break;
  }            
}

Understanding the Code

My Use Case

Aside from it being hilarious to watch those little servos go, I'll be using this setup to control the head, tail, and eye movements with servos for a companion bot I plan to build. I'll need to fine tune the delay and angle ranges but my hope is that I'll get random movements that give my companion bot a life like appearance and personality.