If you need precise angular positioning (typically 0° to 180°) without designing complex limit switches or wiring external magnetic encoders, a standard RC servo is your default actuator. For continuous rotation, high-torque robotic arms, or camera gimbals, you step up to digital metal-gear servos. However, plugging a high-torque servo directly into an Arduino's 5V pin is a fast track to a melted voltage regulator. This guide covers exactly how to size servos for your specific load, wire them safely using dedicated PWM drivers, and decode the physical failure signatures when your mechanics bind.
Servo vs. Stepper vs. DC: Which Motor Fits Your Arduino Load?
Before sizing a specific model, you must match the motor topology to your mechanical requirements. A common beginner mistake is treating steppers and servos as interchangeable. They are not. Servos excel at bounded, high-speed angular movement with built-in position feedback. Steppers excel at continuous, open-loop precise rotation or linear travel (like CNC axes). Brushed DC motors are strictly for continuous, unpositioned rotation (like drive wheels).
| Motor Type | Torque Curve | Control Needs | Cost (Approx) | Best Arduino Use Case |
|---|---|---|---|---|
| RC Servo | High holding torque at zero speed; drops slightly at max speed. | Closed-loop (internal pot/encoder). 1 PWM pin per servo. | $3 – $25 | Robotic arms, camera gimbals, RC steering, valve actuators. |
| Stepper | High holding torque; drops significantly as RPM increases. | Open-loop. Requires step/dir driver (e.g., A4988, TMC2209). | $10 – $35 | 3D printers, CNC routers, precise linear actuators, pan-tilt sliders. |
| Brushed DC | Peak torque at stall; zero holding torque without power. | Requires H-Bridge (e.g., L298N, DRV8871) for speed/direction. | $2 – $10 | Wheeled robots, conveyors, flywheels, winches. |
The Verdict: Choose a servo when your load needs to move to a specific angle and hold there against gravity or spring tension, and your total travel is under 360°. Choose a stepper when you need continuous rotation with exact step counting and don't mind adding a dedicated motor driver board.
Sizing Your Servo: Torque Math and Real-World Arduino Models
Servo torque is universally rated in kg-cm (kilogram-centimeters) or oz-in (ounce-inches) at stall. This is the maximum rotational force the output shaft can exert before the motor stalls. When selecting a model from the bench, you must account for dynamic loads, not just static weight.
| Model | Type | Stall Torque (6V) | Weight | Price | Gear Material |
|---|---|---|---|---|---|
| SG90 | Analog Micro | 1.8 kg-cm | 9g | $2.50 | Nylon |
| MG90S | Analog Micro | 2.2 kg-cm | 13g | $4.00 | Brass/Metal |
| MG996R | Analog Standard | 13.0 kg-cm | 55g | $6.00 | Brass/Metal |
| DS3218 | Digital Standard | 25.0 kg-cm | 60g | $14.00 | Steel |
| DSS-M15S | Digital High-Voltage | 17.0 kg-cm (at 8.4V) | 58g | $28.00 | Steel/Coreless |
Worked Load Example: Pan-Tilt Camera Mount
You are building a tilt axis for a 150g action camera. The camera's center of mass is 6 cm away from the servo's output shaft.
- Static Torque: Load (0.15 kg) × Distance (6 cm) = 0.9 kg-cm.
- Safety Factor: 0.9 kg-cm × 2.0 = 1.8 kg-cm required.
Selection: The SG90 (1.8 kg-cm) is mathematically borderline. In practice, the nylon gears will strip under vibration, and the servo will jitter. The MG90S (2.2 kg-cm, metal gears) is the correct engineering choice for this load profile.
Wiring, Power Delivery, and PCA9685 Driver Integration
Standard RC servos use a 3-pin JR or Futaba connector. Identifying the terminals correctly is critical to avoid frying your microcontroller's GPIO pins.
Terminal Identification
- Brown or Black (GND): Ground reference. Must be shared with the Arduino and the power supply.
- Red (VCC): Motor and logic power. Typically 4.8V to 6.0V for standard servos, up to 8.4V for High-Voltage (HV) models.
- Orange, Yellow, or White (Signal): PWM control line. Expects a 50Hz signal (20ms period) with a pulse width between 1.0ms (0°) and 2.0ms (180°). Compatible with 3.3V and 5V logic.
When to Use a PCA9685 PWM Driver
If you are driving 1 or 2 micro servos (like the SG90), you can wire the signal pins directly to the Arduino's hardware PWM pins (e.g., Pins 9, 10, 11 on an Uno). However, if you are driving more than two servos, or using any high-torque metal-gear servos, you need a dedicated I2C PWM driver like the Adafruit 16-Channel PCA9685.
The PCA9685 chip handles the strict 50Hz timing in hardware, freeing up your Arduino's timers for other tasks, and isolates the high-current servo rails from your microcontroller.
PCA9685 Wiring Map:
- VCC (Logic): Arduino 5V or 3.3V
- GND: Arduino GND
- SDA / SCL: Arduino A4 / A5 (or dedicated SDA/SCL pins on ESP32/Mega)
- V+ (Servo Power): External 6V 5A Power Supply (+)
- GND (Servo Power): External Power Supply (-) Must be tied to Arduino GND
Decoding Failure Signatures: Jitter, Hum, and Thermal Stall
Servos communicate their health through physical feedback. Before you swap out a "broken" servo, diagnose the signature it's presenting on the bench.
1. Jitter (Oscillation at Target Position)
Symptom: The servo reaches the target angle but continuously vibrates or hunts back and forth by 1-2 degrees.
Cause: Power supply brownout or noisy PWM signals. When a large servo moves, it draws peak current. If your power supply sags below 4.5V, the servo's internal microcontroller or analog comparator resets, causing it to lose its position reference and hunt.
Fix: Solder a 470µF to 1000µF electrolytic capacitor directly across the VCC and GND rails at the servo connector to buffer transient current spikes. Ensure your PSU can deliver the combined stall current of all servos moving simultaneously.
2. Hum (Buzzing Without Movement)
Symptom: The servo is stationary at the target angle, but emits a loud, high-frequency buzzing sound and draws continuous current.
Cause: The Arduino is sending a PWM pulse width that falls inside the servo's mechanical deadband, or the internal potentiometer has a worn carbon track (very common in cheap analog servos). Digital servos (like the DS3218) have a much narrower deadband and will hum aggressively if the PCA9685's PWM frequency isn't set to exactly 50Hz.
Fix: If using analog servos, implement a software detach. Once the servo reaches its position, cut the PWM signal entirely.
#include <Servo.h>
Servo myServo;
void moveToAndDetach(int angle) {
myServo.attach(9);
myServo.write(angle);
delay(600); // Allow time to reach position under load
myServo.detach(); // Cuts PWM, stops the hum and saves power
}
3. Overheat and Thermal Stall
Symptom: The servo casing becomes too hot to touch within 30 seconds, followed by a distinct smell of melting plastic or ozone, and the motor stops responding.
Cause: Mechanical binding. If the servo's output horn is physically blocked from reaching its target angle, the internal H-bridge will continuously pump stall current (often 1.5A to 3A) into the motor windings trying to force the movement. Standard RC servos lack thermal fuses.
Fix: Never leave a servo commanded against a hard mechanical stop. In your Arduino code, implement a timeout or use a current-sensing resistor on the ground line to detect stall conditions and cut power via a MOSFET before the windings melt. For heavy industrial loads where binding is expected, abandon standard RC servos and switch to a smart serial bus servo (like the LewanSoul LX-16A) which includes built-in over-temperature and over-current protection.






