Servos The material presented is taken from a variety of sources including: http://www.seattlerobotics.org/guide/servos.html, http://www.baldor.com/pdf/manuals/1205-394.pdf, and Parallax educational materials at http://learn.parallax.com/ Overview Servo motors are used for angular positioning. They typically have a movement range of 180 deg but can go up to 210 deg. The output shaft of a servo does not rotate freely. It seeks a particular angular position under electronic control. Servos are typically rated by torque and speed. A servo rated 40 ouncein/.21 means that at 1 inch from the hub, the servo can exert 40 ounces of force and move 60 deg in 0.21 sec. What makes a Servo Servo motors and are constructed out of basic DC motors, by adding: • some gear reduction • a position sensor for the motor shaft • an electronic circuit that controls the motor's operation The basic hobby servo has a 180:1 gear ratio. The motor is typically small. Typically, a potentiometer (variable resistor) measures the position of the output shaft at all times. An informative link Feed-back loop open-loop closed-loop Control An external controller (such as the Arduino) tells the servo where to go with a signal know as pulse proportional modulation (PPM) or pulse code modulation (which is often confused with pulse width modulation, PWM). PPM uses 1 to 2ms out of a 20ms time period to encode information. PPM A control wire communicates the angular movement. The angle is determined by the duration of the pulse on the control wire. The servo expects a pulse every 20 millisec (.02 seconds). The length of the pulse determines how far the motor turns. For a 1.5 millisecond pulse, the motor turns to the 90 degree position (i.e., the neutral position). If the pulse is shorter than 1.5 ms, the motor turns the shaft to closer to 0 degrees. If the pulse is longer than 1.5ms, the shaft turns closer to 180 degrees. PPM • Each pulse is from 1300 to 1700 microsec (μs) in duration • The pulses repeat about 50 times each second---once every 20 millisec PPM The amount of power applied to the motor is proportional to the distance to be traveled. If the shaft needs to turn a large distance, the motor runs at full speed. If it needs to turn a small amount, the motor runs at a slower speed. Modified Servos Servo motors can also be retrofitted to provide continuous rotation: Not always necessary Remove mechanical limit (revert back to DC motor shaft). Remove pot position sensor (no need to know position) and replace it with 2 equalvalued resistors with a combined resistance equivalent to that of the pot. Makes the servo “think” it is in the 90 deg position. Modified Servos The idea is to make the servo think that the output shaft is always at the 90 degree mark. This is done by removing the feedback sensor, and replacing it with an equivalent circuit that creates the same readings as the sensor at 90 degrees. Then, the control signal for 0 degrees causes the motor to turn full speed in one direction. The signal for 180 degrees causes the motor to turn full speed the other direction. Since the feedback from the output shaft is disconnected, the servo continues in the specified direction as long as the signal remains. Parallax Servos The parallax servos are modified servos with the potentiometer intact. The potentiometer (a.k.a., pot) should be adjusted to make the servo think that it is at the 90 degree mark. Parallax Servo Connections Servo Connector: Black – ground Red – power White – signal Connecting to the Arduino Calibration Program #include <Servo.h> Servo myServo; void setup() { myServo.attach(9); myServo.writeMicroseconds(1500); // Stop } void loop() { } Demonstration Program #include <Servo.h> Servo myServo; // Create Servo object void setup() { myServo.attach(9); // Servo is connected to digital pin 9 } void loop() { myServo.writeMicroseconds(1700); // Counter clockwise delay(2000); // Wait 2 seconds myServo.writeMicroseconds(1300); // Clockwise delay(2000); myServo.writeMicroseconds(1500); // Stop delay(2000); } Using Two Servos and Angles to Specify Movement #include <Servo.h> Servo servoLeft; // Define left servo Servo servoRight; // Define right servo void setup() { servoLeft.attach(10); // left servo on pin 10 servoRight.attach(9); // right servo on pin 9 } void loop() { forward(); // move forward delay(2000); // wait 2000 millisec reverse(); delay(2000); turnRight(); delay(2000); turnLeft(); delay(2000); stopRobot(); http://www.robotoid.com delay(2000); } Using Two Servos and Angles to Specify Movement---continued void forward() { servoLeft.write(0); servoRight.write(180); } void reverse() { servoLeft.write(180); servoRight.write(0); } void turnRight() { servoLeft.write(180); servoRight.write(180); } void turnLeft() { servoLeft.write(0); servoRight.write(0); } void stopRobot() { servoLeft.write(90); servoRight.write(90); }