Using Raspberry Pi to Control Servo Motors in IoT Applications

Micro Servo Motor with Raspberry Pi / Visits:3

The intersection of single-board computing and precision motion control has never been more exciting. Among the most accessible and versatile components in this space, the micro servo motor stands out as a tiny powerhouse that can bring physical movement to your Internet of Things projects. Whether you are building a smart garden irrigation system, a remote-controlled camera gimbal, or a robotic arm for home automation, the combination of a Raspberry Pi and micro servos offers an affordable, scalable, and highly customizable solution.

In this guide, we will dive deep into the technical and practical aspects of controlling micro servo motors using a Raspberry Pi within IoT frameworks. We will cover hardware selection, wiring, software libraries, PWM fundamentals, cloud connectivity, and real-world application scenarios. By the end, you will have a solid blueprint for integrating precise, low-cost motion into your own IoT ecosystem.

Why Micro Servo Motors Are Ideal for IoT

Before we get into the wiring and code, it is worth understanding what makes micro servo motors a perfect fit for IoT applications. These small actuators typically weigh between 5 and 15 grams, consume very little power, and can rotate through a range of 0 to 180 degrees (or continuous rotation in some models). Their small form factor means they can be embedded into tight spaces—inside a window blind mechanism, behind a sensor mount, or inside a miniature robotic joint.

Key Characteristics of Micro Servos

  • Low power consumption: Most micro servos operate at 4.5V to 6V and draw around 100-200mA under load. This makes them suitable for battery-powered IoT nodes.
  • Position feedback: Unlike simple DC motors, servos include a potentiometer that provides closed-loop position control. You command a specific angle, and the servo holds it.
  • Standardized control signal: Almost all micro servos use a 50Hz PWM signal (20ms period) with a pulse width between 1ms (0°) and 2ms (180°). This makes them incredibly easy to drive from a Raspberry Pi GPIO pin.
  • Cost-effectiveness: A quality micro servo like the SG90 or MG90S costs under $5. This low barrier to entry encourages experimentation and rapid prototyping.

For IoT applications, these characteristics translate into reliable, repeatable motion that can be triggered by sensor data, user commands from a mobile app, or cloud-based logic.

Hardware Setup: Connecting a Micro Servo to Raspberry Pi

Let us start with the physical connection. The Raspberry Pi’s GPIO pins output 3.3V logic, which is sufficient to drive the signal line of a micro servo. However, the servo motor itself requires a separate power source for its motor windings. Attempting to power a servo directly from the Raspberry Pi’s 5V rail can cause voltage drops, resets, or even damage to the Pi if the servo draws too much current.

Required Components

  • Raspberry Pi (any model with GPIO, but Pi 3B+ or Pi 4B are recommended for IoT networking)
  • Micro servo motor (e.g., SG90, MG90S, or Tower Pro)
  • External 5V power supply (2A or higher recommended)
  • 1000µF electrolytic capacitor (optional, for smoothing power spikes)
  • Breadboard and jumper wires (female-to-female for Pi to breadboard, male-to-female for servo)

Wiring Diagram

| Raspberry Pi GPIO | Micro Servo Wire | External Power | |-------------------|------------------|----------------| | GPIO 18 (PWM0) | Signal (orange or yellow) | - | | 5V pin (optional, not recommended for power) | - | - | | GND | GND (brown or black) | GND of external supply | | - | VCC (red) | +5V of external supply |

Important: Connect the Raspberry Pi GND to the external power supply GND. This creates a common reference voltage for the control signal.

If you are using a separate power source, connect the servo’s red wire to the positive terminal of the external 5V supply, and the brown wire to the ground of both the Pi and the supply. The signal wire goes directly to a GPIO pin capable of hardware PWM (GPIO 12, 13, 18, or 19 on most Pi models).

Power Decoupling

When a servo starts moving or changes direction, it can draw a sudden spike of current. To protect your Pi and maintain signal integrity, place a 1000µF electrolytic capacitor across the servo’s power terminals (positive to positive, negative to negative). This acts as a local reservoir, smoothing out transient demands.

Software Foundations: PWM and the pigpio Library

The Raspberry Pi’s GPIO pins can generate software-based PWM, but for precise servo control, you should use hardware PWM. The pigpio library is the gold standard for this task because it offloads PWM generation to the Pi’s dedicated PWM hardware, resulting in jitter-free, accurate pulses.

Installing pigpio

First, ensure your Raspberry Pi is connected to the internet. Open a terminal and run:

bash sudo apt update sudo apt install pigpio python3-pigpio sudo systemctl enable pigpiod sudo systemctl start pigpiod

The pigpiod daemon runs in the background and provides a socket interface for controlling GPIO. You can also use the pigpio Python module directly.

Basic Servo Sweep Script

Here is a simple Python script that sweeps a micro servo from 0° to 180° and back:

python import pigpio import time

SERVO_PIN = 18 pi = pigpio.pi()

if not pi.connected: exit()

Set PWM frequency to 50Hz

pi.setPWMfrequency(SERVO_PIN, 50)

Enable servo mode (sets range to 1000-2000 microseconds)

pi.setservopulsewidth(SERVO_PIN, 0) # Off initially

try: while True: # Sweep from 0° to 180° for pulsewidth in range(1000, 2000, 10): pi.setservopulsewidth(SERVOPIN, pulsewidth) time.sleep(0.02) # Sweep back for pulsewidth in range(2000, 1000, -10): pi.setservopulsewidth(SERVOPIN, pulsewidth) time.sleep(0.02) except KeyboardInterrupt: pi.setservopulsewidth(SERVO_PIN, 0) pi.stop()

Explanation: The set_servo_pulsewidth function takes a value in microseconds. A pulse of 1000µs corresponds to 0°, 1500µs to 90°, and 2000µs to 180°. The loop increments by 10µs each step, giving a smooth motion.

Calibrating Your Micro Servo

Not all micro servos respond identically. Some may have a slightly different pulse range. To calibrate, manually set the pulse width to 1000 and measure the angle. If it is not exactly 0°, adjust the minimum value. Similarly, test 2000µs for 180°. You might end up with a range like 500µs to 2500µs for some high-torque models. Always check the datasheet.

Building an IoT-Connected Servo Controller

Now that we have local control, let us elevate this to an IoT application. The goal: control a micro servo from anywhere in the world using a cloud message broker. We will use MQTT, a lightweight protocol ideal for IoT devices with limited bandwidth.

Architecture Overview

  1. Raspberry Pi runs a Python script that subscribes to an MQTT topic.
  2. Cloud broker (we will use HiveMQ’s public broker for testing, or set up your own Mosquitto instance).
  3. Client app (could be a smartphone, another Pi, or a web dashboard) publishes angle commands to the topic.

Installing MQTT Dependencies

bash sudo apt install mosquitto-clients pip3 install paho-mqtt

Full IoT Servo Control Script

Create a file named iot_servo.py:

python import pigpio import paho.mqtt.client as mqtt import json

SERVOPIN = 18 MQTTBROKER = "broker.hivemq.com" # Public test broker MQTTPORT = 1883 MQTTTOPIC = "raspberrypi/servo/angle"

pi = pigpio.pi() pi.setPWMfrequency(SERVOPIN, 50) pi.setservopulsewidth(SERVOPIN, 1500) # Start at 90°

def onconnect(client, userdata, flags, rc): print("Connected to MQTT broker") client.subscribe(MQTTTOPIC)

def onmessage(client, userdata, msg): try: payload = json.loads(msg.payload.decode()) angle = int(payload["angle"]) # Clamp angle to valid range angle = max(0, min(180, angle)) # Map angle to pulse width (1000 to 2000) pulsewidth = 1000 + (angle * 1000 // 180) pi.setservopulsewidth(SERVOPIN, pulsewidth) print(f"Set servo to {angle}° (pulse: {pulsewidth}µs)") except (ValueError, KeyError, json.JSONDecodeError) as e: print(f"Invalid message: {e}")

client = mqtt.Client() client.onconnect = onconnect client.onmessage = onmessage

client.connect(MQTTBROKER, MQTTPORT, 60) client.loop_forever()

Run this script with:

bash python3 iot_servo.py

Now, from any MQTT client (or even another terminal), publish a JSON message:

bash mosquitto_pub -h broker.hivemq.com -t "raspberrypi/servo/angle" -m '{"angle": 45}'

The servo will immediately rotate to 45°. This is the core of IoT control: sensor-less, direct cloud-to-actuator communication.

Security Considerations

The public broker example above is for testing only. In a production IoT system, you should:

  • Use a private MQTT broker (e.g., Mosquitto on a local server or a cloud instance).
  • Enable TLS/SSL encryption.
  • Use username/password authentication.
  • Consider using MQTT over WebSockets for web-based dashboards.

Advanced Techniques: Multi-Servo Synchronization and Feedback

A single micro servo is useful, but many IoT applications require coordinated movement of multiple servos. Think of a robotic arm with three joints, or a pan-tilt camera mount. Controlling multiple servos from a Raspberry Pi is straightforward because the hardware PWM channels are independent.

Wiring Multiple Servos

Each servo needs its own signal wire connected to a different PWM-capable GPIO pin. The power and ground can be shared, provided the external power supply can handle the total current draw. For three micro servos drawing 200mA each, you need at least a 2A supply.

| Servo | Signal Pin | VCC | GND | |-------|------------|-----|-----| | Servo 1 | GPIO 18 | +5V ext | GND ext | | Servo 2 | GPIO 19 | +5V ext | GND ext | | Servo 3 | GPIO 13 | +5V ext | GND ext |

Synchronized Movement Script

python import pigpio import time

pi = pigpio.pi() servopins = [18, 19, 13] for pin in servopins: pi.setPWMfrequency(pin, 50)

def setallservos(angle): pulsewidth = 1000 + (angle * 1000 // 180) for pin in servopins: pi.setservo_pulsewidth(pin, pulsewidth)

Move all servos to 90° simultaneously

setallservos(90) time.sleep(2)

Move to 0°

setallservos(0) time.sleep(2) pi.stop()

This approach is great for applications like a multi-axis solar tracker or a synchronized display.

Adding Position Feedback

One limitation of standard micro servos is that they do not output their actual position. If your IoT application needs to verify that the servo reached the commanded angle (e.g., for safety or diagnostics), you have two options:

  1. Use a feedback servo: Some micro servos (like the Feetech FS90R) include a feedback wire that outputs a voltage proportional to the angle. You can read this with an ADC (e.g., MCP3008) connected to the Raspberry Pi’s SPI interface.

  2. Add an external potentiometer: Mount a rotary potentiometer on the servo’s output shaft and read its resistance with an ADC. This is a common hack for DIY projects.

  3. Implement timeout detection: Monitor the servo’s current draw using an INA219 current sensor. If the servo stalls (e.g., blocked by an obstacle), the current will spike. This can trigger an alert or a retry.

Real-World IoT Application: Smart Plant Watering System

Let us tie everything together with a concrete example. Imagine a smart plant watering system that uses a micro servo to open a valve. The system is triggered by a soil moisture sensor and can also be controlled remotely via a smartphone app.

System Components

  • Raspberry Pi Zero W (low power, built-in Wi-Fi)
  • Micro servo (SG90) connected to a small ball valve
  • Capacitive soil moisture sensor (e.g., v1.2)
  • MQTT broker running on a local server or cloud
  • Python script for sensor reading and servo control

Logic Flow

  1. The Pi reads the soil moisture sensor every 30 seconds.
  2. If moisture drops below a threshold, the Pi publishes a "water_required" message to an MQTT topic.
  3. A cloud function (or a separate script) receives this message and publishes a "valve_open" command to the servo topic.
  4. The servo rotates 90° to open the valve, watering the plant for 10 seconds.
  5. After 10 seconds, the servo rotates back to 0° to close the valve.
  6. The system logs all events to a cloud database for analysis.

Code Snippet for Sensor-Triggered Servo

python import pigpio import paho.mqtt.client as mqtt import time import board import busio import adafruitads1x15.ads1015 as ADS from adafruitads1x15.analog_in import AnalogIn

Initialize ADC for moisture sensor

i2c = busio.I2C(board.SCL, board.SDA) ads = ADS.ADS1015(i2c) moisture_channel = AnalogIn(ads, ADS.P0)

Initialize servo

SERVOPIN = 18 pi = pigpio.pi() pi.setPWMfrequency(SERVOPIN, 50)

def openvalve(): pi.setservopulsewidth(SERVOPIN, 2000) # 180° time.sleep(10) pi.setservopulsewidth(SERVO_PIN, 1000) # 0°

while True: moisture = moisturechannel.value if moisture < 20000: # Adjust threshold based on calibration openvalve() # Publish event to MQTT client.publish("garden/watering/event", "valve_opened") time.sleep(30)

This is a minimal but fully functional IoT loop. In production, you would add error handling, debouncing, and remote override capabilities.

Troubleshooting Common Micro Servo Issues

Even with a solid setup, you may encounter problems. Here are the most common ones and how to fix them.

Servo Jitters or Oscillates

  • Cause: Power supply insufficient or noisy. The servo is fighting to hold position but voltage dips cause it to lose feedback.
  • Fix: Use a dedicated 5V supply with at least 2A capacity. Add a 1000µF capacitor near the servo. Ensure ground connections are solid.

Servo Does Not Move at All

  • Cause: Signal wire not connected to a PWM-capable GPIO, or the pigpio daemon is not running.
  • Fix: Verify GPIO pin supports hardware PWM (check raspi-gpio get). Run sudo systemctl status pigpiod and restart if necessary.

Servo Moves but Not to the Correct Angle

  • Cause: Pulse width range is not calibrated for your specific servo model.
  • Fix: Measure the actual angle for 1000µs and 2000µs. Adjust the min/max values in your code. Some servos require 500µs to 2500µs.

Servo Gets Hot

  • Cause: The servo is being commanded to hold a position against a physical stop or excessive load.
  • Fix: Ensure the mechanical range of motion is within the servo’s capability. Reduce the holding torque by commanding a slightly relaxed position if possible.

Wi-Fi Interference Affects Servo

  • Cause: In some Raspberry Pi models, Wi-Fi activity can introduce noise on GPIO lines.
  • Fix: Use shielded cables for the servo signal wire. Place the Pi and servo at least 10cm apart. Use a ferrite bead on the servo power line.

Scaling Up: From Prototype to Production IoT

Once your prototype works on a breadboard, you will want to make it robust for real-world deployment. Here are steps to move from a hobby project to a reliable IoT system.

PCB Design

Design a custom printed circuit board that integrates the Raspberry Pi, servo drivers, and power management. Use a dedicated servo driver IC like the PCA9685 if you need to control many servos (up to 16 with I2C). This offloads PWM generation from the Pi and reduces CPU load.

Over-the-Air (OTA) Updates

For IoT devices in the field, you cannot physically access them to update code. Use a tool like balena or mender to enable OTA firmware updates. Alternatively, write your Python script to periodically check a GitHub repository for new versions.

Power Management

If your IoT device runs on batteries, the micro servo’s current draw during movement is a major drain. Implement a sleep mode where the Pi goes into low-power state between actions. Use a MOSFET to cut power to the servo entirely when not in use.

Logging and Analytics

Send servo position data, error counts, and power consumption to a cloud service like AWS IoT Core or Google Cloud IoT. Use this data to predict failures (e.g., a servo that takes longer to reach position may be wearing out) and schedule maintenance.

Alternative Approaches: When Not to Use a Micro Servo

While micro servos are excellent for many IoT applications, they are not always the best choice. Consider these alternatives:

  • Stepper motors: For applications requiring continuous rotation or high torque at low speeds (e.g., a 3D printer filament feeder), a stepper motor with a driver like the A4988 is more appropriate.
  • Linear actuators: If you need linear motion (push/pull) rather than rotation, a micro linear servo or a solenoid may be simpler.
  • Continuous rotation servos: For wheels or conveyor belts, use a continuous rotation servo (like the FS90R) that behaves like a geared DC motor with speed control.

The micro servo shines when you need precise angular positioning, low weight, and minimal complexity. For anything else, choose the actuator that matches the physics of your application.

Final Thoughts on Micro Servos in IoT

The micro servo motor is a remarkable piece of engineering that democratizes motion control. When combined with a Raspberry Pi and IoT connectivity, it enables a new class of applications that can sense, decide, and act in the physical world. From adjusting a smart blind based on sunlight intensity to precisely positioning a camera for facial recognition, the possibilities are limited only by your imagination and the quality of your power supply.

As you build your own projects, remember that the real magic happens at the intersection of software and hardware. The Python code that maps an MQTT message to a pulse width is simple, but the result—a tiny motor moving exactly one degree at a time—feels almost like magic. That is the essence of IoT: bridging the digital and physical realms with elegance and reliability.

Now go ahead, grab a micro servo, a Raspberry Pi, and start making things move. The Internet of Things is waiting for your touch.

Copyright Statement:

Author: Micro Servo Motor

Link: https://microservomotor.com/micro-servo-motor-with-raspberry-pi/iot-servo-control-raspberry-pi.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!

Tags