For precise angular positioning (0-180°) under moderate loads without complex external feedback loops, standard RC servos are the default choice for Arduino projects. Unlike raw DC motors or open-loop steppers, an RC servo packs the motor, reduction gearbox, and a potentiometer for closed-loop positional feedback into a single, standardized housing. However, treating an RC servo like a generic DC motor is a fast track to melted jumper wires and stripped gears. Successful Arduino RC servo control requires matching the motor's torque curve to your mechanical load, providing adequate peak current, and understanding the distinct failure modes of internal potentiometer feedback.
Motor Selection Matrix: Why Choose an RC Servo?
Before wiring up a microcontroller, you must verify that an RC servo actually fits your load profile. A common mistake in embedded prototyping is treating steppers and servos as interchangeable. They are not. A stepper motor excels at holding a static load and precise continuous rotation but suffers a massive torque drop-off at higher speeds. An RC servo delivers peak torque at zero speed (stall) and maintains it through its angular range, but it cannot rotate continuously (unless specifically modified) and will overheat if forced to hold a heavy static load for extended periods.
| Motor Type | Torque Curve Profile | Control Needs | Typical Cost (USD) | Best Load Profile |
|---|---|---|---|---|
| Standard RC Servo | High stall torque, flat across angular range | 50Hz PWM pulse (500-2400µs) | $3 - $25 | Angular positioning (0-180°), moderate dynamic loads, robotic joints |
| Stepper (NEMA 17) | High holding torque, drops sharply at speed | Step/Direction pulses via H-bridge driver | $12 - $35 | Static holding, CNC/3D printer axes, continuous precise rotation |
| Brushed DC Motor | Low stall torque, peaks at mid-speed | PWM speed control via MOSFET/H-bridge | $5 - $15 | Continuous rotation, high-speed low-load applications (wheels, fans) |
| Brushless (BLDC) | High torque across wide speed range | 3-phase ESC with commutation logic | $30 - $80+ | High-speed propulsion, drones, high-load continuous conveyors |
If your application requires moving a joint to a specific angle and holding it briefly before moving again (like a robotic arm or a camera pan-tilt mechanism), the RC servo is the correct choice. If you need to hold a 5kg load perfectly still for hours, use a stepper motor or add a mechanical brake to your servo system.
Sizing Your Servo: Torque, Load, and the 50% Rule
RC servo torque is universally rated in kilogram-centimeters (kg-cm) or ounce-inches (oz-in) at stall. The golden rule of servo sizing is the 50% Rule: your calculated continuous dynamic load should never exceed 50% of the servo's rated stall torque. Running a servo near its stall limit causes massive current spikes, rapid internal heating, and premature potentiometer wear.
Worked Load Example: Robotic Forearm
Let's size a servo for a robotic forearm. The forearm is 10cm long and weighs 150g (center of mass at 5cm). It needs to lift a 200g payload at the very end of the 10cm arm.
- Arm Weight Torque: 0.15kg × 5cm = 0.75 kg-cm
- Payload Torque: 0.20kg × 10cm = 2.00 kg-cm
- Total Static Torque: 2.75 kg-cm
- Dynamic Multiplier: Add 20% for acceleration forces = 3.30 kg-cm
- Apply 50% Rule: 3.30 kg-cm × 2 = 6.60 kg-cm minimum required stall torque.
Based on this math, a standard SG90 (1.8 kg-cm) will instantly strip its plastic gears. An MG90S (2.2 kg-cm) will stall and overheat. You need a servo like the MG996R or DS3218. According to Pololu's RC servo fundamentals, always factor in the voltage drop of your wiring when calculating real-world torque, as a 6.0V servo running at 4.8V loses roughly 20% of its rated torque.
| Model | Stall Torque (4.8V) | Stall Torque (6.0V) | Gear Material | Stall Current Draw | Price Range |
|---|---|---|---|---|---|
| TowerPro SG90 | 1.8 kg-cm | 2.2 kg-cm | Plastic | ~700 mA | $2 - $4 |
| TowerPro MG90S | 2.2 kg-cm | 2.8 kg-cm | Metal | ~1.2 A | $4 - $7 |
| TowerPro MG996R | 10.0 kg-cm | 13.0 kg-cm | Metal | ~2.5 A | $8 - $14 |
| Waveshare DS3218 | 15.0 kg-cm | 20.0 kg-cm | Metal | ~3.0 A | $15 - $22 |
Wiring, Control, and Driver Requirements
An RC servo demands a 50Hz PWM signal with a pulse width between 500µs and 2400µs to dictate its angular position. While the Arduino Servo.h library handles the timing, the physical wiring and power delivery are where most projects fail.
- Brown or Black: Ground (GND). Must be shared with the Arduino and power supply.
- Red: VCC (Power). Requires 4.8V to 6.0V DC. Never connect high-torque servos to the Arduino 5V pin.
- Orange, Yellow, or White: PWM Signal. Connect to an Arduino digital pin (or PCA9685 output).
What Driver/Controller Does It Demand?
If you are driving one or two micro servos (like the SG90), you can sometimes power them directly from the Arduino's 5V rail, provided your USB source or barrel jack can supply the peak current. However, for high-torque metal-gear servos (MG996R) or arrays of more than three servos, you must use an external Battery Eliminator Circuit (BEC) or a dedicated 5V/6V power supply capable of delivering the summed stall currents.
Furthermore, generating multiple 50Hz PWM signals via software on an Arduino Uno can cause interrupt conflicts, leading to servo jitter. The industry-standard solution is the PCA9685 16-Channel PWM/Servo Driver. This I2C board offloads the PWM generation to dedicated hardware. As detailed in the Adafruit PCA9685 guide, the board features separate terminal blocks for logic power (VCC, 3.3V-5V) and servo power (V+, 5V-6V). Crucial mistake to avoid: Do not bridge VCC and V+ on the PCA9685 if you are feeding 6V into V+; you will back-feed 6V into your Arduino's I2C lines and fry the microcontroller's logic level.
For basic single-servo code using the Arduino Servo Library, the implementation is straightforward:
#include <Servo.h>
Servo myServo;
void setup() {
// Attach servo to Pin 9.
// The 500, 2400 parameters map the physical pulse limits to 0-180 degrees.
myServo.attach(9, 500, 2400);
}
void loop() {
myServo.write(90); // Move to center
delay(1000);
myServo.write(0); // Move to min limit
delay(1000);
}
Diagnosing Failure Signatures: Hum, Overheat, and Stall
When an Arduino RC servo control circuit misbehaves, the motor will physically communicate the failure mode before it catastrophically breaks. Recognizing these signatures saves you from replacing perfectly good electronics.
1. The 'Hum' or Jitter
Symptom: The servo vibrates rapidly in place, emitting an audible buzzing sound, even when the Arduino is commanding a static position.
Cause: This is almost never a mechanical issue; it is an electrical one. It indicates PWM signal jitter or a ground loop. If you are powering the servo from a switching power supply with high ripple, or if the ground wire between the Arduino and the servo power supply is too thin (creating a voltage differential), the servo's internal comparator misreads the potentiometer voltage.
Fix: Bond the grounds directly at the power supply terminals using thick wire (18 AWG minimum for high-torque arrays). Add a 100µF electrolytic capacitor across the VCC and GND pins at the servo connector to smooth out voltage sags during direction changes.
2. Overheat and Thermal Shutdown
Symptom: The servo casing becomes too hot to touch within 30 seconds, and it may emit a faint smell of hot plastic or ozone. The current draw spikes to the stall rating continuously.
Cause: You are asking the servo to hold a static load that exceeds its continuous torque rating, or the mechanical linkage is binding. Because the servo is closed-loop, if the external force pushes the output shaft away from the target position, the internal H-bridge applies full stall voltage to the motor to correct it. Unlike a stepper motor which handles holding current gracefully, an RC servo motor is not designed for continuous stall current.
Fix: Redesign the mechanism to be mechanically balanced (use counterweights or gas springs) so the servo only exerts force during movement, not during holding. If static holding is mandatory, switch to a NEMA 17 stepper motor.
3. Stall and Clicking (Gear Slip)
Symptom: A loud, rhythmic clicking or grinding noise from the servo housing. The output shaft does not move, but the motor is clearly spinning.
Cause: The load has exceeded the mechanical limits of the gearbox. In plastic-gear servos (SG90), the teeth shear off the main output gear. In metal-gear servos (MG996R), the motor will simply stall, drawing 2.5A+ continuously until the battery sags or the motor windings melt.
Fix: If you hear clicking, immediately cut power via your code or a physical switch. You must either reduce the payload, increase the mechanical advantage (gear down the output), or upgrade to a higher-torque servo class (e.g., moving from a 13kg-cm to a 20kg-cm digital servo). Never rely on software current limiting to save a stalled RC servo; the thermal mass of the motor heats up faster than an Arduino's ADC can read a shunt resistor and cut a MOSFET.






