CS 341 – Lab 10
Computer Architecture and Organization
Controlling the Speed and Direction of a Servomotor, and Calibration
Equipment: Arduino UNO microcomputer, PC with Arduino IDE installed, and a USB cable.
Parallax Continuous Rotation Servo
Your assignment is to connect a continuous rotation
servomotor to the Arduino board, control the speed and direction of rotation of
its arm, and calibrate it for zero speed.
Normally, a CR servo is used directly only in light load applications
where precise control is required. A CR
servo may be used to turn the wheels of a small remote controlled vehicle
moving it forward or backward at a controlled speed. It may also be used to feed paper in a
printer, copier, or other paper handling device. For large load applications such as a truck
engine, a standard servo might be used to control the gas and/or brake
The Parallax Continuous
Rotation Servo provides information on programming the speed and direction
of the CR servo. As in previous Parallax datasheets, the
software examples shown are based on a different language and library so you
can only use it for guidance and cannot use that code directly in our project.
All the instructions for setting up the
Standard Servo and coding the sketch in Lab 9 apply here for the CR Servo. However, the value written to the PWM output
controls the direction and speed of the servo instead of the position. A value of 90 should cause the Servo to
stop. A value larger than 90 should
cause the Servo to rotate in one direction at increasing speeds. A value smaller than 90 should cause the
Servo to rotate in the other direction at increasing speeds. Copy your sketch from Lab 9 and run it. It should be transferring the position of the
pot knob/shaft to the speed and direction of the CR Servo. Demonstrate that you
can position the pot control to stop the turning motion.
However, there is an additional
calibration step that would be required for a practical application of this
servo. When the value 90 is written, the
servo is supposed to stop turning.
However, that value may leave an “uncalibrated” servo moving in a slow
but still continuous rotation. This
could be a problem for the application of the device containing the servo. We can handle the calibration in either of
We can find a value – typically near the
90 value - that stops the servo. After
we find such a zero value, we store it in configuration memory such as in an
EEPROM. (See Lab 3.) When we program the
servo to move in either direction, we retrieve the calibration zero value and
add or subtract a number proportional to the desired speed in that direction.
There is a calibration screw on the CR
Servo next to the location where the three wires are attached. This can be used to calibrate the device so
that 90 is the correct value for a dead stop.
This calibration step would normally be done by a technician (or a
robot) at the factory prior to shipping a product that includes CR servos.
Modify the loop function in your sketch to
output the value 90 instead of the value from the pot/analog input. Run the sketch and observe the motion of the
servo. It probably won’t be at a dead
stop. (If it is actually at a dead stop,
use a small Phillips screwdriver to turn the adjustment screw by few degrees so
that it starts turning slowly in either direction.) In this state, it is not properly
To determine a zero value, change the
value 90 in your sketch plus or minus a small amount and experiment until you
get the servo to stop turning. Record
the value that works here: ____________.
Change your sketch back to writing the
value 90. While your sketch is
continuing to write the value 90, use a small Phillips screwdriver to adjust
the screw until the servo is at a dead stop.
Either way your control for the servo is
now properly calibrated.
DETACH THE BATTERY TO PREVENT IT
FROM CONTINUING TO RUN THE ARDUINO BOARD AND DYING IN THE BOX!
Since this is the last lab session of the
course, you won’t turn in a lab report next week. Show the TA that you have properly calibrated
your CR servo to get credit for this lab.
___ / 10