Maker.io main logo

How to Control Servo Motors with a Raspberry Pi

2021-02-10 | By Maker.io Staff

Interfacing servo motors can be an essential task in many projects, like building a custom robot. There are several methods one can employ to interface servo motors with a Raspberry Pi. This article introduces two of them and explains how servo motors work. This knowledge should enable the reader to control servos with different microcontrollers or even a simple 555 timer-based circuit.

How do servo motors work?

Usually, servos have three inputs and two of them supply power to the motor located inside the plastic body. The third input controls how much the servo turns.

Usually, the input signal is pulse-width modulated (PWM) and its frequency doesn’t change over time. Instead, the servo motor rotates to a certain angle when the duty cycle of the PWM input signal changes. The servo used in this example can turn 180 degrees in total (90 degrees in each direction). When the duty cycle is 5% (a one-millisecond long high pulse), the servo rotates to its minimum position. If the duty cycle changes to 10% (which is a two-millisecond long high pulse), the servo rotates all the way to the right. Duty cycles in between correlate to different angles between -90° and +90°. However, these numbers might vary for different servos and between manufacturers. Therefore, it’s always necessary to consult the datasheet of the servo.

Note that the Raspberry Pi shouldn’t supply the voltage to the servo. Instead, employ an external power supply to drive the servo motor because the Raspberry Pi’s GPIO pins might be unable to supply enough power to make the motor turn at an acceptable rate.

How to control a servo motor with a Raspberry Pi?

To make a Raspberry Pi control a servo motor, connect the +5 V and GND lines of the servo to an external power supply and the remaining signal wire to any I/O pin of the Raspberry Pi.

Don’t forget to connect any GND pin of the Raspberry Pi to the ground of the power supply as well.

How to Control Servo Motors with a Raspberry Pi

Schematic diagram available on Scheme-It.

As mentioned above, servos typically expect a PWM signal that tells them where to turn. Therefore, there are several methods to rotate a servo to a specific angle. One method is to use the gpiozero library that contains a Servo module. You can use pip to install the library on a Raspberry Pi. If the rpi.gpio package isn't installed yet, download it as well. Otherwise, the gpiozero library won’t work:

Copy Code
sudo apt-get install python3-rpi.gpio
sudo pip3 install gpiozero

Once that’s done, it’s then possible to execute the following script:

Copy Code
from gpiozero import Servo
from time import sleep

servo = Servo(25)

try:
	while True:
    	servo.min()
    	sleep(0.5)
    	servo.mid()
    	sleep(0.5)
    	servo.max()
    	sleep(0.5)
except KeyboardInterrupt:
	print("Program stopped")

As you can see, this library allows you to quickly turn the servo to one of three predefined positions. This simple python script first imports the required libraries. Then, it defines that the servo is connected to pin 25 before starting an infinite loop in which the servo gets rotated to its minimum, mid, and maximum position. In between angle changes, the script waits for half a second.

The library can, however, also instruct the servo to turn to any position between the servo’s minimum and maximum value by directly setting the servo’s value to a number between -1 and 1. A value of negative one corresponds to the minimum position of the servo, and one represents the servo’s maximum rotation:

Copy Code
from gpiozero import Servo
from time import sleep

servo = Servo(25)
val = -1

try:
	while True:
    	servo.value = val
    	sleep(0.1)
    	val = val + 0.1
    	if val > 1:
        	val = -1
except KeyboardInterrupt:
	print("Program stopped")

This simple script works similarly to the previous one. It, however, directly sets the servo’s value in each loop iteration instead of making the servo rotate to one of the three predefined positions.

Note that this library only represents one way of controlling a servo with a Raspberry Pi. Similarly, you could also utilize a different library, such as pigpio, and directly manipulate the PWM output signal that goes to the servo to make it turn to a specified position.

An alternative method for controlling many servos

Any of the Raspberry Pi’s numbered I/O pins are capable of controlling servos. However, if you want to control even more servos or your project requires the GPIO pins for other things, then it’s also possible to employ a servo controller board.

These modules usually communicate with a microcontroller or similar device over I2C, so it’s possible to control many servos utilizing only two GPIO pins of the Raspberry Pi. There are, however, many different types of modules that you can buy and they often work very differently. Therefore, you should consult the datasheet of a module to learn how to use it.

Summary

Unlike regular DC motors, servos typically cannot not rotate a full 360 degrees. Instead, they turn between a certain minimum and maximum angle. A pulse width modulated input signal with a constant frequency controls the rotation. The duty cycle of that signal directly corresponds to the angle of the motor. A servo rotates towards its maximum position when the duty cycle of the input signal increases. The Raspberry Pi can directly control many servos at once via software. Each numbered GPIO pin can manage a servo. It is, however, not recommended to power the servos with the Raspberry Pi. Instead, they should connect to an external power supply. Servo controller boards are a good alternative for controlling a large number of servos at once.

Recommended Reading

Servomotor Control with Limits and Variable Speed

Why Would I Use a Servomotor?

How to put a servo to work in an Arduino environment – Maker.io Tutorial | DigiKey

Servo Motors – Tech Basics | DigiKey Electronics

How to Build a Face Tracking Pan Tilt Camera with OpenMV | DigiKey

制造商零件编号 SC0195(9)
RASPBERRY PI 4 B 8GB
Raspberry Pi
制造商零件编号 SC0194(9)
RASPBERRY PI 4 B 4GB
Raspberry Pi
制造商零件编号 SC0193(9)
RASPBERRY PI 4 B 2GB
Raspberry Pi
制造商零件编号 SC0022
SBC 1.2GHZ 4 CORE 1GB RAM
Raspberry Pi
制造商零件编号 SER0006
SERVOMOTOR RC 4.8V
DFRobot
制造商零件编号 2201
SERVOMOTOR RC 4.8V
Adafruit Industries LLC
制造商零件编号 ROB-09065
SERVOMOTOR RC 6V GENERIC SUB-MIC
SparkFun Electronics
Add all DigiKey Parts to Cart
TechForum

Have questions or comments? Continue the conversation on TechForum, DigiKey's online community and technical resource.

Visit TechForum