Using Arduino to Control the Rotation Angle, Speed, and Direction of a Micro Servo Motor

How to Connect a Micro Servo Motor to Arduino / Visits:24

In the dynamic world of electronics and robotics, precision movement is often the key to bringing a project to life. From animatronic eyes in a costume to the fine adjustments of a robotic arm, the component that frequently makes this possible is the humble micro servo motor. These tiny powerhouses are more than just small motors; they are integrated systems designed for accurate control of angular position. This guide will take you from unboxing your first micro servo to mastering complete command over its rotation angle, speed, and direction using the ubiquitous Arduino microcontroller. We'll explore the theory, walk through practical code, and tackle advanced techniques to transform your static projects into dynamic creations.

What Makes a Micro Servo Motor Special?

Before we wire a single component, it's crucial to understand what sets a micro servo apart from a standard DC motor. A micro servo is a closed-loop electromechanical device. The "micro" designation typically refers to its physical size (often weighing between 5g to 20g) and its lower torque output compared to standard or giant servos. However, its core function remains the same.

Key Components Inside the Black Box: * DC Motor: Provides the rotational force. * Gear Train: Reduces the high-speed, low-torque output of the motor to a slower, more powerful movement. * Potentiometer: A variable resistor attached to the output shaft. This is the feedback sensor that constantly tells the control circuit the motor's current position. * Control Circuit: The brain of the servo. It compares the desired position (from the Arduino signal) with the current position (from the potentiometer) and drives the motor in the direction needed to minimize the difference.

This internal feedback loop is what allows for precise angular positioning, typically within a degree of accuracy. Most standard micro servos have a limited rotational range, usually 180 degrees, though 270-degree and continuous rotation variants exist.

Essential Specifications to Decode

When choosing a micro servo for your project, you'll encounter these key terms: * Operating Voltage: Commonly 4.8V to 6.8V. Never exceed this! An Arduino's 5V pin is usually perfect. * Stall Torque: The force the servo can exert when powered but prevented from moving, measured in kg-cm or oz-in. Micro servos have lower torque (e.g., 1.5-3.0 kg-cm). * Speed: The time it takes to move 60 degrees, measured in seconds (e.g., 0.12 sec/60°). A lower number means a faster servo.

The Hardware Setup: Connecting Arduino and Servo

The physical connection is beautifully simple, which is part of the servo's appeal. You will need: * An Arduino board (Uno, Nano, Mega, etc.) * A micro servo motor (like the SG90 or MG90S) * Jumper wires (Male-to-Male) * A breadboard (optional but recommended)

Step-by-Step Wiring Guide

  1. Power (Red Wire): Connect the servo's red (or sometimes brown) wire to the Arduino's 5V pin. For more than one servo, use an external power supply to avoid overloading the Arduino's voltage regulator.
  2. Ground (Brown/Black Wire): Connect the servo's black or brown wire to any of the Arduino's GND pins.
  3. Signal (Orange/Yellow Wire): Connect the servo's yellow or orange wire to a digital PWM-capable pin on the Arduino (e.g., pin 9, 10, or 11 on the Uno). PWM (Pulse Width Modulation) is how we communicate the desired angle.

Pro-Tip: Always connect the grounds of all power sources together. A capacitor (e.g., 100µF) across the power and ground lines near the servo can help stabilize voltage and reduce electrical noise.

The Heart of Control: Understanding PWM Signals

The magic of servo control lies in the PWM signal sent from the Arduino. Unlike using analogWrite() for LED dimming, servo control uses a specific type of PWM signal where the pulse width carries the information.

  • The signal is a repeating pulse, typically every 20 milliseconds (a 50Hz frequency).
  • The width of the high pulse within that 20ms period determines the angle.
  • A 1.5ms pulse usually centers the servo (e.g., 90°).
  • A 1.0ms pulse typically drives it to 0° (one extreme).
  • A 2.0ms pulse typically drives it to 180° (the other extreme).

These values can vary slightly between servo models, which is a key point for calibration.

Foundation Code: Basic Angle Positioning with Servo.h

Arduino simplifies this pulse generation immensely through its built-in Servo library. Let's start with the absolute basics.

cpp

include <Servo.h> // Include the Servo Library

Servo myServo; // Create a servo object to control it int servoPin = 9; // Pin connected to the servo signal wire

void setup() { myServo.attach(servoPin); // Attaches the servo on pin 9 to the servo object }

void loop() { myServo.write(0); // Command servo to 0 degrees delay(1000); // Wait 1 second myServo.write(90); // Command servo to 90 degrees delay(1000); myServo.write(180); // Command servo to 180 degrees delay(1000); }

This code demonstrates the core write(angle) function. The library handles all the complex timing, converting the angle (0-180) into the correct pulse width.

Calibrating for Your Specific Servo

If your servo doesn't quite reach its extremes when you command 0° and 180°, you can calibrate it using writeMicroseconds().

cpp void setup() { myServo.attach(servoPin, 500, 2500); // (pin, min_pulse, max_pulse) } Experimentally adjust the min_pulse and max_pulse values (defaults are ~544 and ~2400) until the servo's movement matches your commanded angles.

Taking Command: Implementing Speed and Direction Control

The Servo.write() function moves the servo as fast as it can to the new position. To control speed, we need a different strategy: moving the servo in small, incremental steps with a delay between them.

Writing a Smooth Sweep Function

cpp void sweepServo(int startAngle, int endAngle, int stepDelay) { int step = (startAngle < endAngle) ? 1 : -1; // Determine direction

for (int angle = startAngle; angle != endAngle; angle += step) { myServo.write(angle); delay(stepDelay); // This delay controls the speed. Larger = slower. } myServo.write(endAngle); // Ensure final angle is set }

void loop() { sweepServo(0, 180, 20); // Sweep from 0 to 180, fairly fast sweepServo(180, 0, 40); // Sweep back from 180 to 0, slower } In this function, stepDelay is the key variable for speed control. The direction is determined algorithmically by comparing the start and end angles.

Advanced Technique: Non-Blocking Speed Control

Using delay() for speed control halts all other code execution. For more responsive projects, we must use a non-blocking, state-based approach with millis().

cpp

include <Servo.h>

Servo myServo; int servoPin = 9;

int targetAngle = 0; int currentAngle = 90; unsigned long previousMillis = 0; const long interval = 15; // Time between angle updates (ms)

void setup() { myServo.attach(servoPin); myServo.write(currentAngle); }

void loop() { unsigned long currentMillis = millis();

if (currentMillis - previousMillis >= interval) { previousMillis = currentMillis;

if (currentAngle != targetAngle) {   // Move 1 degree towards the target   currentAngle += (currentAngle < targetAngle) ? 1 : -1;   myServo.write(currentAngle); } 

}

// Example logic to change target (e.g., based on a sensor) // if (someCondition) targetAngle = 45; } This powerful pattern allows your servo to move smoothly at a defined speed (controlled by the interval) while leaving the loop() free to read sensors, handle serial commands, or manage other tasks.

Project Integration: Building an Interactive System

Let's combine angle, speed, and direction control into a sample interactive project: a "Mood Indicator" controlled by a potentiometer.

Hardware Additions

  • Add a 10kΩ potentiometer. Connect its outer pins to Arduino 5V and GND. Connect its middle pin to Analog Pin A0.

The Complete Interactive Code

cpp

include <Servo.h>

Servo moodIndicator; const int servoPin = 9; const int potPin = A0;

int previousPotValue = 0; int currentServoAngle = 90; const int sensitivity = 3; // Filter for small potentiometer jitters const int moveInterval = 30; // ms between moves - controls speed

unsigned long lastMoveTime = 0;

void setup() { moodIndicator.attach(servoPin); moodIndicator.write(currentServoAngle); Serial.begin(9600); }

void loop() { int potValue = analogRead(potPin); // Reads 0-1023 int targetAngle = map(potValue, 0, 1023, 0, 180); // Map to servo range

// Check if the pot has moved meaningfully if (abs(targetAngle - previousPotValue) > sensitivity) { previousPotValue = targetAngle;

Serial.print("Potentiometer: "); Serial.print(potValue); Serial.print(" -> Target Angle: "); Serial.println(targetAngle); 

}

// Non-blocking, speed-controlled movement towards target if (millis() - lastMoveTime >= moveInterval) { lastMoveTime = millis();

if (currentServoAngle < targetAngle) {   currentServoAngle++;   moodIndicator.write(currentServoAngle); } else if (currentServoAngle > targetAngle) {   currentServoAngle--;   moodIndicator.write(currentServoAngle); } // If equal, no movement occurs. 

} } This system elegantly ties everything together: direction is determined by comparing currentServoAngle and targetAngle, speed is governed by the moveInterval, and angle is the ultimate target. The potentiometer provides interactive, real-time input.

Troubleshooting Common Micro Servo Issues

Even with perfect code, you might encounter hiccups. Here’s a quick diagnostic guide:

  • Servo Jitters or Vibrates: This is often electrical noise on the power line. Fix: Add a capacitor (100-470µF electrolytic) across the servo's power and ground leads, close to the servo. Ensure your power supply provides sufficient current.
  • Servo Doesn't Move, but Draws Current: The internal potentiometer or motor may be disconnected or damaged. Check for physical obstructions.
  • Incomplete Range of Motion: Calibrate using writeMicroseconds() as shown earlier. The physical internal stops might also be limiting it—never force it.
  • Arduino Resets When Servo Moves: This is a classic symptom of power brownout. The servo draws a large current surge when starting, causing the Arduino's voltage to dip. You must use a separate power source for the servo, with the grounds connected.
  • Erratic Movement with Multiple Servos: Power issue again. Use a dedicated servo power supply like a 5V/2A DC adapter or a high-current battery pack. Never power multiple moving servos from the Arduino's 5V pin.

Pushing Boundaries: Advanced Applications and Modifications

Once you've mastered the basics, the world opens up.

  • Cascading Movements: Chain servo movements to create complex sequences, storing angles and speeds in arrays.
  • Sensor-Based Autonomous Control: Use a distance sensor (like an HC-SR04) to have a servo pan back and forth, tracking the closest object.
  • Continuous Rotation Hack: You can modify a standard 180-degree micro servo for continuous rotation by removing the internal potentiometer's physical stop and adjusting the feedback mechanism. This transforms it into a speed/direction controlled gearmotor, though you lose positional feedback.
  • The Servo Library Limitation: The standard Servo.h library can control up to 12 servos on most boards, but it disables PWM on pins 9 and 10. For more advanced multi-servo projects, consider libraries like PCA9685 PWM driver, which uses I2C to control 16 servos with perfect synchronization without taxing the Arduino's CPU.

The journey from a static prototype to a project with intentional, controlled motion is incredibly rewarding. The micro servo motor, guided by the versatile Arduino, provides a perfect gateway into this world of physical computing. By understanding the relationship between pulse width and angle, and by implementing smart coding patterns for speed and direction, you can infuse a remarkable degree of life and purpose into your creations. The techniques outlined here—from basic sweeping to non-blocking, sensor-driven control—form a toolkit you can adapt and expand for almost any application requiring precise, reliable movement.

Copyright Statement:

Author: Micro Servo Motor

Link: https://microservomotor.com/how-to-connect-a-micro-servo-motor-to-arduino/arduino-control-micro-servo-rotation-angle-speed.htm

Source: Micro Servo Motor

The copyright of this article belongs to the author. Reproduction is not allowed without permission.

About Us

Lucas Bennett avatar
Lucas Bennett
Welcome to my blog!

Archive

Tags