A better way to generate servo control signals is to include the Arduino Servo library in your sketch, one of the standard libraries of pre-written code bundled with the Arduino software.
We want to take a closer look at the Servo library.
attach()
writeMicroseconds()
detach()
Servos have to receive high-pulse control signals at regular intervals to keep turning. If the signal stops, so does the servo. Once your sketch uses the Servo library to set up the signal, it can move on to other code, like delays, checking sensors, etc. Meanwhile, the servo keeps turning because the Servo library keeps running in the background. It regularly interrupts the execution of other code to initiate those high pulses, doing it so quickly that it’s practically unnoticeable.
Using the Servo library to send servo control signals takes four steps:
#include <Servo.h> // Include servo library
Servo servoLeft; // Declare left servo
servoLeft.attach(13); // Attach left signal to pin 13
servoLeft.writeMicroseconds(1500); // 1.5 ms stay-still signal
Seconds, Milliseconds, Microseconds
A millisecond is a one-thousandth of a second, abbreviated ms.
A microsecond is a one-millionth of a second, abbreviated μs.
There are 1000 microseconds (μs) in 1 millisecond (ms).
There are 1,000,000 microseconds in 1 second (s).
For calibrating servos, your sketch will need to send signals with 1.5 ms pulses. Take a look at the timing diagram below. This stay-still signal’s high pulses last 1.5 ms. That’s halfway between the 1.7 ms full-speed-counterclockwise and 1.3 ms full-speed-clockwise pulses.
/* Robotics with the BOE Shield – LeftServoStayStill Generate signal to make the servo stay still for centering. */ #include <Servo.h> // Include servo library Servo servoLeft; // Declare left servo void setup() // Built in initialization block { servoLeft.attach(13); // Attach left signal to pin 13 servoLeft.writeMicroseconds(1500); // 1.5 ms stay still signal } void loop() // Main loop auto-repeats { // Empty, nothing needs repeating }
You’ll be using this code a lot, so it’s a good idea to practice declaring an instance of Servo, attaching the signal to a pin, and setting the pulse duration.
Servo servoRight; // Declare right servo
servoRight.attach(12); // Attach right signal to pin 12
servoRight.writeMicroseconds(1500); // 1.5 ms stay still signal
/* Robotics with the BOE Shield – BothServosStayStill Generate signals to make the servos stay still for centering. */ #include <Servo.h> // Include servo library Servo servoLeft; // Declare left servo signal Servo servoRight; // Declare right servo signal void setup() // Built in initialization block { servoLeft.attach(13); // Attach left signal to pin 13 servoRight.attach(12); // Attach left signal to pin 12 servoLeft.writeMicroseconds(1500); // 1.5 ms stay still sig, pin 13 servoRight.writeMicroseconds(1500); // 1.5 ms stay still sig, pin 12 } void loop() // Main loop auto-repeats { // Empty, nothing needs repeating }