You can treat a hobby servo as “one signal wire + power” — the tricky part is powering it safely.
I’ll walk you through a simple, safe setup.

**1. What kind of servo are we talking about?**
Most small hobby servos (like SG90, MG90S, etc.) have 3 wires:
* Red – +5V (power)
* Brown/Black – GND
* Orange/Yellow/White – control signal (PWM)
That’s what I’ll assume below.
**2. The golden rule: separate power, shared ground**
Servos can pull a lot of current (300–800 mA peak each), which is too much for the Raspberry Pi’s 5 V pin if you have more than one or if the servo stalls.
**Recommended:**
* Use an external 5 V supply for the servo(s).
* Tie grounds together: servo GND, Pi GND, and power-supply GND must all be connected.
**Basic wiring**
**1. Servo power**
* Servo red → +5 V from external 5 V supply
* Servo brown/black → GND of external supply
**2. Common ground**
* External supply GND → Raspberry Pi GND (any GND pin)
* This makes sure the PWM signal has a common reference.
**3. Signal wire**
Servo signal (orange/yellow/white) → [Raspberry Pi](https://www.ampheo.com/c/raspberry-pi/raspberry-pi-boards) GPIO pin with PWM, e.g. GPIO18 (physical pin 12).
For one tiny servo (e.g. an SG90) you can sometimes power it from the Pi’s 5 V pin, but it’s safer to use an external 5 V brick if you notice brownouts or reboots.
**3. Which Raspberry Pi pin to use?**
Let’s use BCM GPIO numbers (what Python usually uses):
* GPIO18 – hardware PWM capable (good choice)
* Physical location: pin 12 on the 40-pin header
So for a single server test:
* Servo signal → GPIO18 (pin 12)
* Servo GND → Pi GND (pin 6 for example)
* Servo +5V → external 5 V (or Pi’s 5 V at your own risk)
**4. Control the servo in Python (simple example)**
Common approach: use pigpio or RPi.GPIO. pigpio gives very stable PWM, but RPi.GPIO is simpler to show.
**Example with RPi.GPIO**
Install (if needed):
```
sudo apt-get update
sudo apt-get install python3-rpi.gpio
```
Python code:
```
import RPi.GPIO as GPIO
import time
SERVO_PIN = 18 # BCM numbering
GPIO.setmode(GPIO.BCM)
GPIO.setup(SERVO_PIN, GPIO.OUT)
# 50 Hz servo signal (20 ms period)
pwm = GPIO.PWM(SERVO_PIN, 50)
pwm.start(0)
def set_angle(angle):
# angle ~ 0..180
# duty cycle ~ 2..12 (varies slightly by servo)
duty = 2 + (angle / 18.0)
GPIO.output(SERVO_PIN, True)
pwm.ChangeDutyCycle(duty)
time.sleep(0.3) # allow servo to move
GPIO.output(SERVO_PIN, False)
pwm.ChangeDutyCycle(0)
try:
while True:
set_angle(0)
time.sleep(1)
set_angle(90)
time.sleep(1)
set_angle(180)
time.sleep(1)
except KeyboardInterrupt:
pass
pwm.stop()
GPIO.cleanup()
```
You might need to tweak the duty cycle range (that 2..12) depending on your servo; some like 0.5–2.5 ms pulses, some 1–2 ms.
**5. Driving multiple servos? Use a driver board**
If you want many servos, don’t drive them all directly from Pi PWM:
Use a [PCA9685](https://www.onzuu.com/search/PCA9685) servo driver board (I²C interface):
* It generates 16 channels of PWM in hardware.
* You still power servos from a separate 5 V supply.
* [Raspberry Pi](https://www.ampheoelec.de/c/raspberry-pi/raspberry-pi-boards) just sends position commands over I²C.
This dramatically simplifies timing and reduces CPU load.
**6. Quick checklist**
* Servo red → 5 V (prefer external supply)
* Servo black/brown → GND
* Servo signal → GPIO18 (pin 12) or other GPIO
* External GND tied to Pi GND
* Use 50 Hz PWM, ~1–2 ms pulse width
* Use separate 5 V supply if current draw is high