# Servos with an ESP32 or Arduino: power them right

> SG90, MG90S and MG996R from the makers: an MG996R draws 1.4 A at stall. Separate supply, common ground, signal pin choice, PCA9685 and calibration.

[HTML version](https://soldr.ai/blog/servo-esp32-power-wiring)

8 November 2026 · Soldr

**Short answer:** give servos their own 5 to 6 V supply, join its ground to the board's ground, and send only the signal wire to the board. An MG996R draws 170 mA moving with no load and 1,400 mA at stall, per its maker. That's more than a USB port or a board's 5 V pin should feed. For more than a few servos, a PCA9685 driver gives you 16 channels over I2C.

Servos are the classic way to make a project move, and the classic cause of "it works until the servo moves, then the board resets". The fix is almost always power, not code. Here's what the makers' own pages say about the three servos we stock most, and how to wire them so the board survives.

## What the makers publish

Hobby servos don't come with full datasheets. The figures below are from TowerPro's product pages, cited on our reference pages, and those pages are also honest about what's missing.

- [SG90](https://soldr.ai/docs/components/sg90) (9 g micro servo): 1.8 kg/cm stall torque at 4.8 V. Operating voltage is listed as a single value, 4.8 V. Power "through external adapter". No stall current or pulse range is published.

- [MG90S](https://soldr.ai/docs/components/mg90s) (metal-gear micro servo): 1.8 kg/cm at 4.8 V, 2.2 kg/cm at 6.6 V. Also "through external adapter". No current is published.

- [MG996R](https://soldr.ai/docs/components/mg996r-servo) (high-torque metal gear): 4.8 to 6.6 V. Idle 10 mA, **170 mA** moving with no load, **1,400 mA at stall**. 9.4 kg/cm at 4.8 V and 11 kg/cm at 6.0 V.

"Stall" isn't a rare event. It's what happens whenever the servo pushes against something it can't move, or starts from rest under load. A robot arm lifting an object stalls its servos briefly on every move.

## Why the board resets

When a servo starts or stalls, its current jumps. If it shares the board's supply, the voltage dips for a moment and the microcontroller browns out and restarts. With an ESP32 it's worse, because Wi-Fi transmit already takes bursts of up to 240 mA. We walk through the full failure in [why your ESP32 reboots the moment the motor starts](https://soldr.ai/docs/esp32-reboots-when-motor-starts), and how to add the numbers up in [the power budget guide](https://soldr.ai/blog/esp32-arduino-power-budget-usb).

## Wiring that works

- **A separate supply for the servos**, 5 to 6 V, rated for the stall current of every servo that can stall at once. For one MG996R that's 1.4 A; for four, plan for several amps.

- **Servo power to that supply**: the servo's power and ground wires go there, not to the board's 5 V pin.

- **Grounds joined**: the supply's ground connects to the board's ground. Without a common ground the signal has no reference, and the servo twitches or ignores it.

- **Signal to a PWM-capable pin.** On an Uno, any pin the servo library supports. On an ESP32, most output-capable GPIOs; avoid the boot-mode pins (GPIO0, 2, 12, 15) and the input-only pins.

- **A capacitor across the servo supply** near the servos helps smooth the start-up spikes.

A note on wire colours: the maker pages don't publish them, so the usual brown/red/orange convention is exactly that, a convention. Check the label or listing for your servo.

## Logic level: does a 3.3 V signal drive a 5 V servo?

Usually, yes. Most hobby servos read a 3.3 V control pulse as high even when powered from 5 V. But the maker pages don't specify the signal levels, so treat it as something to test. If a servo jitters on an ESP32 and works on an Uno, a level shifter or a PCA9685 driver solves it.

## More than a few servos: the PCA9685

The [PCA9685](https://soldr.ai/docs/components/pca9685-pwm-driver) is a 16-channel, 12-bit PWM driver controlled over I2C. Its datasheet gives a 2.3 to 5.5 V logic supply and 5.5 V-tolerant inputs and outputs, so it works with both 3.3 V and 5 V boards. Six address pins let you chain many of them on one bus. The board sends I2C commands and the PCA9685 keeps every servo pulse steady, which frees the microcontroller's own timers and pins.

The servo power rail on a PCA9685 module is the module's own design, not part of the chip datasheet. Feed that rail from the separate servo supply, and keep the chip's logic supply on the board's 3.3 V or 5 V.

## Calibrate before you trust the angles

None of the three maker pages publishes a pulse-width range or a sweep angle. Code that assumes "0 to 180 degrees" may push a servo against its internal end stop, where it stalls and draws its full stall current. Start with small moves around the centre, find the real end points of your unit, and limit the code to them.

## How Soldr plans servo power

The project ideas on our servo reference pages power servos from a separate 5 V supply with a common ground, following the makers' "external adapter" guidance. Each build shows a power budget, and the chat explains the power plan: whether it's sized for USB, a bench supply or a battery. Check that plan against the stall currents above before you wire.

Servos on Compoden: [SG90](https://compoden.com/products/sg90-servo-motor-9g-micro-servo-for-robotics-arduino), [MG90S](https://compoden.com/products/mg90s-metal-gear-micro-servo-18kg-cm-torque), [MG996R](https://compoden.com/products/mg996r-servo-high-torque-metal-gear-digital-servo), and the [PCA9685 servo driver](https://compoden.com/products/pca9685-16-channel-12-bit-pwm-servo-driver-module-for-arduino-raspberry-pi).

Describe your moving project on [app.soldr.ai](https://app.soldr.ai). Sign in and get 100 credits free.
