When controlling servo with Arduino, your default pick for light, intermittent loads under 2 kg-cm is the $3 TowerPro SG90. For continuous, high-torque, or precision loads, you must step up to a metal-gear digital servo like the $15 DS3218 (20 kg-cm) driven by an external PCA9685 PWM board. Never power high-torque servos directly from the Arduino's onboard 5V regulator; the current spikes will cause brownouts and erratic behavior.
This guide cuts through the guesswork of motor selection. We will map your mechanical load to the correct motor topology, calculate the exact torque requirements with a safety margin, wire the terminals correctly, and diagnose the physical failure signatures that destroy hobbyist builds.
Motor Type Comparison: Servo vs. Stepper vs. DC
Before writing a single line of code, you must match the motor topology to your mechanical load profile. Hobbyists often treat steppers and servos as interchangeable, which leads to stripped gears or missed steps. Here is how they actually perform under load.
| Criteria | RC Servo (Closed-Loop) | Stepper Motor (Open-Loop) | Brushed DC Motor |
|---|---|---|---|
| Torque Curve | Peak torque at zero speed (stall); drops as speed increases. | High holding torque; drops sharply at higher RPMs. | Low starting torque; peaks at mid-range RPM. |
| Control Needs | Simple 50Hz PWM pulse (1-2ms). Internal potentiometer handles feedback. | Requires precise step/direction pulses and an H-bridge driver (e.g., A4988). | Requires an H-bridge for direction; needs an external encoder for position control. |
| Cost & Complexity | $3 - $25. Extremely low wiring complexity. | $10 - $40. Moderate complexity; requires tuning of current limits. | $2 - $15. High complexity if positional accuracy is required. |
| Best Load Profile | Robotic arms, camera gimbals, RC steering (short throw, high force). | 3D printer axes, CNC routers (continuous precise movement). | Wheels, conveyors, fans (continuous rotation, speed over position). |
The Verdict: If your application requires moving a specific angular distance (e.g., 0 to 180 degrees) and holding it there against gravity or a spring load, the servo is the only correct choice. Steppers will overheat trying to hold a static load against gravity without complex closed-loop drivers, and DC motors lack inherent positional feedback.
Sizing Rule of Thumb and Worked Load Example
Servo manufacturers rate their products using stall torque (usually in kg-cm or oz-in). This is the absolute maximum force the motor can exert before it stops moving. Running a servo at its stall torque will draw maximum current, overheat the internal H-bridge, and strip the plastic gears.
Worked Example: Sizing a Robotic Arm Joint
Let's calculate the shoulder joint for a small robotic arm. The arm segment is 15 cm long and weighs 100g (center of mass at 7.5 cm). It needs to lift a 200g payload at the very tip (15 cm).
- Payload Torque: 200g (0.2 kg) × 15 cm = 3.0 kg-cm
- Arm Weight Torque: 100g (0.1 kg) × 7.5 cm = 0.75 kg-cm
- Total Dynamic Torque Required: 3.0 + 0.75 = 3.75 kg-cm
- Apply 50% Safety Margin: 3.75 kg-cm × 2 = 7.5 kg-cm minimum stall rating
A standard micro servo like the SG90 (rated at 1.8 kg-cm) will instantly stall and burn out. The TowerPro MG996R (rated at 13 kg-cm) is the correct, cost-effective pick here, providing ample headroom for acceleration forces and friction.
Wiring Terminals and the PCA9685 Driver Demand
Standard hobby servos use a 3-wire interface. While the physical connector is standardized (JR/Futaba pitch), the wire colors vary by manufacturer. Always verify the pinout before applying power; reversing VCC and GND will instantly fry the servo's internal control IC.
| Function | JR Style (Most Common) | Futaba Style | Hitec Style |
|---|---|---|---|
| Ground (GND) | Brown | Black | Black |
| Power (VCC) | Red | Red | Red |
| Signal (PWM) | Orange | White | Yellow |
The signal wire expects a 50Hz PWM signal with a pulse width between 1.0ms (0 degrees) and 2.0ms (180 degrees). The Arduino Servo Library handles this timing automatically via the write() function.
Why You Need an External Driver
An Arduino Uno's onboard 5V regulator is typically rated for 500mA to 1A, and that current is shared with the ATmega328P microcontroller. A single MG996R servo can draw 2.5 Amps during a stall or rapid direction change. If you wire this directly to the Arduino's 5V pin, the voltage will sag, causing the microcontroller to reset, the USB connection to drop, or the onboard regulator to melt.
For projects requiring multiple servos (like hexapods or robotic hands), do not use the Arduino's digital pins directly. Use a PCA9685 16-channel PWM driver board. It communicates via I2C (using only two Arduino pins) and handles the strict 50Hz timing in hardware, freeing up your microcontroller and providing dedicated, high-current terminal blocks for servo power.
Failure Signatures: Diagnosing Hum, Overheat, and Stall
Servos fail in predictable ways. Recognizing these physical signatures will save you from burning through replacement parts.
- The 'Hum' or Jitter: The servo vibrates rapidly around the target position without settling.
Cause: This is almost always power sag or a dirty internal potentiometer. Measure the voltage at the servo's VCC/GND terminals with a multimeter while it is under load. If it drops below 4.5V, your power supply is undersized or your wires are too thin (use at least 20 AWG for high-torque servos). - Overheat (Hot to the touch): The servo casing is too hot to hold after a few minutes.
Cause: The servo is being commanded to a position it cannot physically reach (e.g., commanding 180 degrees when the mechanical limit is 170 degrees). The motor is locked in a stall state, drawing maximum current continuously. Fix: Reduce your software limits or check for mechanical binding. - Stall and Gear Stripping: A loud grinding noise followed by the servo spinning freely without moving the output shaft.
Cause: Exceeding the dynamic torque rating, causing the internal nylon gears to shear. Fix: Upgrade to a servo with metal gears (look for 'MG' in the part number, like the MG996R) or redesign the mechanical linkage to reduce the lever arm.
Decision Tree: Select Your Exact Servo and Driver
Stop guessing. Follow this decision path to select the exact hardware for your next build.
| If Your Load Profile Is... | Then Choose This Servo | And This Driver Setup |
|---|---|---|
| Under 1.5 kg-cm, low cost, indoor/light duty (e.g., pan/tilt for a lightweight webcam). | TowerPro SG90 (9g, Plastic gears, ~$3) | Direct to Arduino 5V pin (1 servo only) or external 5V USB bank. |
| 2 to 10 kg-cm, moderate shock loads, robotic arms or RC car steering. | TowerPro MG996R (55g, Metal gears, 13 kg-cm, ~$8) | External 5V 3A PSU + Common Ground. Arduino digital pin for PWM. |
| 10 to 25 kg-cm, high precision, heavy lifting, or continuous holding. | DS3218 Digital Servo (Metal gears, 20 kg-cm, ~$15) | External 5V 10A PSU + PCA9685 I2C Driver Board. |
| Continuous rotation (wheels, winches) where absolute position is not needed. | FS90R (Continuous rotation micro servo, ~$5) | Direct to Arduino 5V pin. Use writeMicroseconds() for speed control. |
For deeper technical specifications on RC servo pulse timing and current draw characteristics, refer to the Pololu RC Servo Guide. Always verify your specific mechanical linkage math before ordering hardware; a 50% safety margin is your best defense against stripped gears and melted H-bridges.






