When executing basic servo Arduino wiring for a single micro servo like the SG90, you can often get away with plugging the power, ground, and signal pins directly into the microcontroller. But the moment you scale up to high-torque metal-gear servos (10 kg-cm and above) or add multiple actuators to a robotic arm, direct wiring becomes a fast track to brownouts, jitter, and fried voltage regulators.
The direct answer for standard hobby servos is a 3-pin connection: Brown/Black to GND, Red to 5V-6V, and Orange/Yellow/White to a PWM-capable GPIO pin. However, any servo drawing more than 500mA under load requires an external power supply and a dedicated PWM driver like the PCA9685. Below, we break down how to select the right motor for your load profile, how to wire it safely without destroying your Arduino, and how to size your actuator using real-world physics.
Motor Selection: Which Actuator Fits Your Load Profile?
A common mistake in embedded robotics is treating steppers and servos as interchangeable. They are not. Steppers excel at open-loop, continuous-rotation precision and holding torque at zero speed, but they lose torque rapidly as RPM increases. Servos are closed-loop systems (using an internal potentiometer or magnetic encoder) optimized for high torque at specific angular positions, typically within a 180° or 270° sweep.
Use the comparison table below to match your mechanical load profile to the correct motor topology.
| Motor Type | Torque Profile | Control Needs | Typical Cost | Best Use Case |
|---|---|---|---|---|
| Standard RC Servo (e.g., SG90, MG90S) | Low stall torque (1.5–2.5 kg-cm); drops off near mechanical limits. | Direct GPIO 50Hz PWM (1-2ms pulse). No driver needed for 1-2 units. | $2 – $6 | Pan/tilt camera mounts, RC steering, lightweight grippers. |
| High-Torque Digital Servo (e.g., DS3218, MG996R) | High stall torque (10–35 kg-cm); maintains torque across the 180° sweep. | External 5V/6V PSU (3A+), I2C PWM driver (PCA9685) recommended. | $12 – $28 | Robotic arm joints, heavy-duty rover steering, automated valves. |
| NEMA 17 Stepper (e.g., 17HS4401) | High holding torque at standstill; severe torque drop-off above 300 RPM. | Stepper driver (A4988, TMC2209), STEP/DIR pins, microstepping config. | $10 – $18 | 3D printer axes, CNC routers, continuous conveyors. |
| Brushed DC w/ Encoder | Linear torque curve; requires PID tuning to hold position. | H-Bridge (L298N, DRV8871), quadrature encoder decoding, PID loop. | $15 – $35 | Drive wheels, continuous winches, high-speed linear actuators. |
If your application requires moving a heavy payload to a specific angle and holding it there against gravity, the high-torque digital servo is your only logical choice. Steppers will overheat trying to hold a static load against gravity without massive current, and standard DC motors require complex software PID loops just to stop at a target angle.
Servo Arduino Wiring: Terminals, Drivers, and Power Injection
Every standard hobby servo uses a 3-wire interface. While color codes vary slightly by manufacturer (Futaba, JR, Hitec), the terminal identification remains universal:
- Ground (GND): Usually Brown or Black. Connects to the common ground of your system.
- Power (VCC): Usually Red. Requires 4.8V to 6.0V DC. Never exceed 6.0V on standard hobby servos unless explicitly rated for 7.4V (LiPo) operation.
- Signal (PWM): Usually Orange, Yellow, or White. Expects a 50Hz PWM signal with a pulse width between 500µs (0°) and 2500µs (180°).
When using an external power supply for your servos, you must connect the GND of the external power supply to the GND of the Arduino. If you omit this shared ground, the PWM signal from the Arduino has no reference voltage. The servo will interpret the floating signal as noise, resulting in violent twitching that can strip the internal gears.
Direct GPIO vs. PCA9685 I2C Driver
The Arduino Uno's ATmega328P has hardware PWM on pins 3, 5, 6, 9, 10, and 11. The native Arduino Servo Library handles the 50Hz timing via interrupts. For a single MG996R servo, wiring the signal pin to Pin 9 and powering the servo from an external 5V 2A buck converter works perfectly.
However, if you are building a 4-DOF robotic arm, direct wiring fails for two reasons:
- Pin Exhaustion: You run out of hardware PWM pins.
- Interrupt Jitter: The software-driven Servo library can suffer from microsecond jitter when the Arduino is simultaneously handling I2C sensors or serial communication. This jitter translates directly into physical servo shaking.
The solution is the PCA9685 16-Channel PWM Driver. This I2C breakout board handles the 50Hz pulse generation in dedicated hardware, freeing your Arduino to just send angle commands over the I2C bus. As detailed in the Adafruit PCA9685 guide, you wire the Arduino SDA/SCL pins to the driver, and connect your heavy-gauge servo power directly to the driver's blue V+ terminal block. The driver board optically isolates the I2C logic from the high-current motor power, protecting your microcontroller from voltage spikes generated by the servo's internal DC motor.
Spec-Sheet Breakdown: Common High-Torque Servos
| Model | Stall Torque (6V) | Stall Current | Gear Material | Dead Band |
|---|---|---|---|---|
| MG996R | 10 kg-cm | 2.5A | Brass/Steel | ~5µs |
| DS3218 (270°) | 20 kg-cm | 3.0A | Hardened Steel | ~2µs |
| LH-038A | 35 kg-cm | 4.5A | Hardened Steel | ~1µs |
| HS-805BB | 24 kg-cm | 3.8A | Steel/Aluminum | ~3µs |
Sizing Servos: Rules of Thumb and Worked Load Examples
According to the SparkFun Motor Selection Guide, sizing a motor requires calculating the worst-case static load. For servos, the golden rule of thumb is the 50% Safety Margin: Never select a servo whose rated stall torque exactly matches your calculated load. Continuous operation at or near stall torque will overheat the internal DC motor, melt the plastic casing, and rapidly degrade the potentiometer.
Worked Load Example: Robotic Arm Elbow Joint
Let’s size a servo for the elbow joint of a desktop robotic arm.
- Forearm length (Distance): 20 cm (0.2 m)
- Payload mass: 300 g (0.3 kg)
- Forearm structure mass: 150 g (0.15 kg), acting at the center of gravity (10 cm)
Step 1: Calculate the required torque.
Servo manufacturers use kg-cm rather than Newton-meters. We calculate the torque contribution of both the payload and the arm structure:
- Payload Torque = 0.3 kg × 20 cm = 6.0 kg-cm
- Structure Torque = 0.15 kg × 10 cm = 1.5 kg-cm
- Total Static Torque = 7.5 kg-cm
Step 2: Apply the 50% safety factor.
Required Servo Rating = 7.5 kg-cm / 0.50 = 15.0 kg-cm.
Step 3: Select the motor.
An MG996R (10 kg-cm) is severely undersized and will fail. The DS3218 (20 kg-cm) is the correct choice, providing a comfortable 25% overhead beyond our safety-adjusted requirement. Because the DS3218 pulls up to 3.0A at stall, you must wire it to a 5V power supply rated for at least 4A to handle transient current spikes during direction reversals.
Diagnosing Failure Signatures
When your servo Arduino wiring or mechanical sizing is incorrect, the hardware will communicate the failure through distinct physical signatures:
- Humming and Jitter: The servo vibrates in place without moving to the target angle. Cause: Insufficient current from the power supply causing voltage sag below 4.8V, or a noisy PWM signal (common when using software PWM on non-hardware pins). Fix: Upgrade the PSU and verify you are using hardware-driven PWM or a PCA9685.
- Overheat and Shutdown: The servo casing becomes too hot to touch, and the Arduino randomly resets. Cause: The servo is being commanded to a position beyond its physical mechanical stop, causing it to draw continuous stall current (often 2.5A+). This massive current draw collapses the voltage rail, triggering a brownout on the Arduino. Fix: Calibrate your software limits (e.g., constrain angles to 10°–170° instead of 0°–180°) and ensure your PSU has adequate headroom.
- Stall and Clicking: The servo attempts to move but stops, accompanied by a rhythmic clicking sound. Cause: Mechanical binding in your linkage, or stripped internal nylon gears due to shock-loading. Fix: Disconnect the mechanical load and test the servo bare. If it moves freely, redesign your linkage to eliminate binding. If it still clicks, replace the gearset.






