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
- Servo tail; //create servo object to control a servo Create one of these for each servo you have, you can replace "tail" with a unique name of your choosing
- void loop_tail() create a loop for each servo, make sure to name it the same thing as your servo so you don't forget which loop controls which servo
- 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 in microseconds
- int t3 = random(400, 1000); defines variable and sets neutral random delay in microseconds
- tail.write(t1); sets the servo to a random position according to the range defined in int t1
- delay(t2); pauses movement for a random amount of time according to the range defined in int 2
- tail.write(0); resets the servo to its neutral starting position
- delay(t3); pauses movement for a random amount of time according to the range defined in int 3
- void setup() is run one to setup your board and pins
- tail.attach(9); attaches the servo on pin 9, each servo would get a line of code attaching it to its own pin
- void loop() this is where you'll list all the servo loops you created to be triggered at random
- byte randNum = random(3); creates a max range of random numbers that can be assigned
- switch (randNum) switches between the cases listed
- case 0: the number assigned to the loop which will be called upon with the switch command, if you add another loop to be controlled it would be case 1, followed by case 2 and so on
- loop_tail(); the name of the loop you want to run when the case number is randomly picked
- break; Tells the program to go back to the switch command and pick a new number as opposed to moving to the next case number in the sequence
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.