Servo Background
 Servos provide control of rotary position
 Servos are used extensively in the remote control hobby
world for:
 Aircraft (flaps, ailerons, throttle, landing gear…)
 Cars and trucks (steering)
 Boats (rudder, sail sheets)
 Servos are used with varying degrees of success on ROVs
because they are not usually waterproof enough to
withstand long periods at depth
 Nonetheless, they present some possibilities for ROV
enthusiasts. Consider for example, camera tilt control in a
sealed tube
How Servos Work
 Inside a servo case, the key components are:
 Control circuitry
 A motor driving reduction gears
 A potentiometer driven by the reduction gears that
extends through the housing and drives the actuator
 An external control signal indicates the angle that the
servo should move to and the motor responds by
running until the potentiometer reaches the desired
 A servo requires three wires, GND, power, and the
control line
How Servos Work
Reduction gears
Control circuit
Considerations in Selecting a Servo
 Hundreds of models of servo are available
 Selection parameters include
 Operating voltage (4.8-6V is typical but some run at 7.2V)
 Digital or analog (digital have better/faster positioning)
 Maximum torque
 Rotation speed
 Number of rotations (180° is typical but other ranges
including multi-turn and continuous turn are available)
 Physical size
 Material gears are made of
 Material bearings are made of
 Waterproof????
 Price
The R/C Servo Control Signal
 Communication of desired position is encoded as the
width of a 0-5V digital pulse
 The pulse is repeated about 50 times each second
 The pulse varies between 1ms and 2ms
 1ms is interpreted as fully one way and 2ms as fully in the
other direction
 1.5ms means position in the middle (or stop for
continuous rotation)
The R/C Servo Control Signal
Pulse anywhere from 1-2ms
Repeat about every 20ms
TIME (ms)
Controlling a Servo with an
 Arduino has functions available for controlling servos
 Servo functions are drawn from a Servo library
 Servos are positioned by setting a pin as a servo output
and then sending a value from 0-180 specifying the
rotation required
 View Jeremy Blum’s Tutorial 5 for an example of how
to program a servo using the Arduino
Motor Control Using Servo Signals
 Many R/C hobby manufacturers have Electronic Speed
Controllers (ESCs)that can control motor speed using servo
Not all ESCs can drive a motor in reverse as is required for ROVs
Ensure that the ESC is able to handle the voltage and current you
require (note that references to cells should be interpreted as
1.2V/cell, i.e. NiCd battery cell voltages thus a 4 cell ESC is 4.8V)
If you have an appropriate ESC, motor speed control is identical
to servo control except that 1ms (value of 0 on Arduino) might be
full reverse, 2ms (180 on Arduino) may be full forward while
1.5ms (90 on Arduino) is stopped.
Of course there many other speeds are possible between these
Test Your Knowledge
 Write an Arduino sketch to:
 Read an analog value from pin A0
Attach a potentiometer between 0 and 5V with the wiper connected
to pin A0 (this could be another resistive sensor/resistor
 Scale the analog value appropriately to control the brightness
of an LED attached to pin 3
 Scale the analog value appropriately to control the position of
a servo attached to pin 9 (or equivalently the speed of a motor
attached to an ESC controlled by the signal at this pin)
 Your sketch should be similar to the that on the following
Reads an analog input on pin 0, prints the result to the serial monitor.
Analog input also sets servo position (orESC motor speed) and LED brightness
Attach the center pin of a potentiometer (or other sensor/resistor combination)
to pin A0, and the outside pins to +5V and ground.
This example code is in the public domain.
#include <Servo.h> //tell C where to get the servo routines
Servo demoServo; // define a variable of type Servo and call it demoServo
int servoPin = 9; // we will use pin 9 for servo output (could also ESC)
int led=3; //we will use pin 3 for analog write to change LED brightness
// the setup routine runs once when you press reset:
void setup() {
Serial.begin(9600);// initialize serial communication at 9600 bits per second:
demoServo.attach(servoPin); //initialize servo functions on pin named servoPin
// the loop routine runs over and over again forever:
void loop() {
int sensorValue = analogRead(A0);// read the input on analog pin 0:
analogWrite(led,sensorValue/4); // scale 0-1023 to 0-255 for analog write
demoServo.write(sensorValue*180.0/1023.0); //scale 0-1023 to 0-180 for servo
Serial.println(sensorValue); // print out the value you read:
// delay in between reads for stability