When pairing an Arduino and servo motor, the immediate bottleneck is rarely the microcontroller code—it is almost always power delivery and torque sizing. A standard Arduino Uno can easily output the 50Hz PWM signal required to command a servo's position, but its onboard 5V regulator cannot source the 2.5A stall current a high-torque metal-gear servo demands. Attempting to drive a load-bearing servo directly from the Arduino's 5V pin will result in immediate brownouts, erratic behavior, and potentially a fried ATmega328P voltage regulator.
This guide breaks down how to select, size, and wire servos for embedded projects, providing the exact calculations and wiring topologies needed to avoid the mechanical and electrical failures that plague beginner builds.
Motor Type Comparison: Why Choose a Servo?
Before committing to a servo, it is critical to understand where it fits in the motion control landscape. Hobby and industrial servos are fundamentally closed-loop position controllers, whereas steppers and DC motors require different drive architectures. Treating a stepper and a servo as interchangeable will lead to severe control logic errors and hardware mismatches.
| Motor Type | Torque Curve & Holding | Control Needs & Driver | Cost (Typical Hobby Scale) | Best Load Profile |
|---|---|---|---|---|
| Brushed DC | Peak torque at stall, drops linearly with speed. Zero holding torque without power. | H-Bridge (e.g., L298N, DRV8871). Requires external quadrature encoder for position feedback. | $3 - $15 | Continuous rotation, high-speed conveyors, drive wheels. |
| Stepper | High holding torque at zero speed. Torque drops sharply at higher RPMs. | Stepper driver (e.g., A4988, TMC2209). Open-loop control; misses steps if overloaded. | $10 - $25 | CNC routers, 3D printer axes, precise low-speed linear motion. |
| Hobby Servo (RC) | High torque at low speeds. Internal potentiometer provides closed-loop position feedback. | Direct 50Hz PWM from MCU. Integrated internal H-bridge and control loop. | $5 - $30 | Robotic arms, pan/tilt gimbals, RC steering, low-speed articulation. |
| AC Industrial Servo | Flat torque curve up to rated speed. High dynamic response and precision. | Dedicated servo drive (e.g., Delta ASDA). Requires complex PID tuning and absolute encoders. | $300+ | Industrial pick-and-place, high-speed packaging, CNC spindles. |
For an Arduino-based robotic arm or camera gimbal, the Hobby Servo wins because the driver, gearbox, and feedback sensor are integrated into a single package. You only need to supply power and a PWM signal. However, this integration means you cannot easily repair or tune the internal control loop if the load exceeds the motor's physical limits.
Sizing Your Arduino and Servo Motor for the Load
The most common mistake in embedded motion design is sizing a servo based on the static weight of the payload. Servos must overcome inertia during acceleration and absorb shock loads during deceleration.
Worked Load Example: Robotic Arm Segment
Imagine you are building a robotic arm. The forearm segment is 12 cm long, and it needs to lift a 500 g (0.5 kg) payload at its furthest tip.
- Calculate Static Torque: Torque = Force × Distance. In hobby servo terms, we use kg-cm.
0.5 kg × 12 cm = 6 kg-cm. - Apply Dynamic Safety Factor: To account for the acceleration of the arm and the weight of the arm segment itself, multiply by 3.0.
6 kg-cm × 3.0 = 18 kg-cm. - Select the Servo: You need a servo rated for at least 18 kg-cm of stall torque. A standard MG996R (rated ~10-13 kg-cm) will strip its gears or stall. You must step up to a DS3218 or PDI-6225MG.
| Model | Stall Torque (at 6V) | Stall Current | Idle Current | Typical Price (2026) |
|---|---|---|---|---|
| TowerPro SG90 (Micro) | 1.8 kg-cm | ~700 mA | ~10 mA | $2.50 |
| TowerPro MG996R (Standard) | 13.0 kg-cm | ~2.5 A | ~50 mA | $6.00 |
| DS3218 (Large/Metal) | 20.0 kg-cm | ~3.2 A | ~80 mA | $14.00 |
| PowerHD DSS-M02S | 25.0 kg-cm | ~4.0 A | ~100 mA | $28.00 |
Notice the stall current column. An Arduino Uno's onboard 5V regulator is typically rated for 500mA to 800mA maximum, and that must be shared with the ATmega chip and any sensors. If an MG996R hits a mechanical bind and draws 2.5A, the Arduino's thermal shutdown will trigger, or the regulator will fail catastrophically.
Wiring, Terminals, and Power Delivery
Standard hobby servos use a 3-pin JR or Futaba connector. Identifying the terminals correctly is critical, as reversing VCC and Signal will instantly destroy the servo's internal control IC.
- Brown or Black Wire: Ground (GND). Must be shared with the Arduino GND.
- Red Wire: Power (VCC). Nominally 4.8V to 6.0V. Never connect to the Arduino 5V pin for servos larger than an SG90.
- Orange, Yellow, or White Wire: PWM Signal. Connect to any Arduino digital pin capable of PWM (e.g., Pin 9).
The 50Hz PWM Requirement
Hobby servos do not interpret standard analog-style PWM duty cycles. They expect a 50Hz signal (a 20ms period) where the pulse width dictates the angle: 1.0ms is typically 0°, 1.5ms is 90°, and 2.0ms is 180°. If you use the Arduino analogWrite() function, which defaults to ~490Hz, the servo will vibrate violently and overheat. You must use the official Arduino Servo Library, which reconfigures the hardware timers to output the correct 50Hz pulse train.
External Power Topology
For any servo drawing more than 1A, use a dedicated power supply. A common, cost-effective solution is an LM2596 buck converter module stepped down to 5.0V from a 12V wall adapter or LiPo battery. For mobile robots, use an RC BEC (Battery Eliminator Circuit) rated for at least 5A continuous output.
Critical Wiring Rule: The ground of the external 5V power supply must be tied directly to the Arduino's GND pin. Without a common ground reference, the PWM signal from the Arduino will float, causing the servo to jitter or sweep randomly. For digital servos (which update internally at ~300Hz and draw sharp current spikes), solder a 470µF low-ESR electrolytic capacitor across the VCC and GND rails near the servo to prevent voltage sags.
Failure Signatures: Hum, Overheat, and Stall
When an Arduino and servo motor setup fails, the hardware usually provides physical feedback before permanent damage occurs. Recognizing these signatures allows you to diagnose the root cause without burning out components.
| Symptom | Probable Cause | Measurement / Fix |
|---|---|---|
| Constant Humming / Jitter | Ground loop noise, inadequate power supply capacitance, or mechanical binding near the target position. | Measure VCC with an oscilloscope. If you see >200mV ripple during movement, add bulk capacitance or upgrade the BEC. Check for physical obstructions. |
| Rapid Overheating (Hot to touch in < 1 min) | Continuous stall condition, or PWM frequency mismatch (e.g., using analogWrite instead of Servo.write). |
Verify code uses <Servo.h>. Measure current with a multimeter; if it reads near the stall current rating while stationary, the mechanical load is too high or the gearbox is jammed. |
| Audible Clicking / Stripped Gears | Shock load exceeding the dynamic torque rating, or metal fatigue in plastic-gear servos (like the SG90). | Replace with metal-gear variants (MG series). Implement software acceleration ramping to prevent instant 0-to-180° commands that cause inertial shock. |
| Arduino Resets Randomly | Voltage brownout on the 5V rail caused by servo stall current pulling down the shared power bus. | Separate the servo power supply from the Arduino power supply. Ensure only the PWM signal and a shared GND connect between the two systems. |
By treating the servo not just as a code-driven component, but as a high-current electromechanical load, you ensure reliable operation. Always verify your torque margins, isolate your power rails, and monitor the physical temperature of the motor casing during your first high-load test cycles.
For deeper technical specifications on RC servo pulse timing and internal potentiometer tolerances, refer to the Pololu RC Servo Basics Guide.






