The PCA9685 needs its own servo supply on the V+ terminal, in addition to the 3.3 V or 5 V logic supply. Without it the chip answers over I2C but the servos stay dead.
What the message means
The board carries the PWM chip and passes the servo supply to the connectors. The logic power from your microcontroller runs only the chip.
Fix it in this order
- Run an I2C scanner. The default address is 0x40.
- Connect a 5 V to 6 V supply that can give enough current to the V+ terminal, and join the grounds.
- Set the PWM frequency to 50 Hz for hobby servos.
- Check the pulse values you send. The values are counts out of 4096 per period, not microseconds.
- Leave the OE pin low or unconnected. A high level disables all outputs.
- Add a large capacitor across the V+ supply to cut start-up dips.
Why it happens
The PCA9685 board needs its own servo power on the V+ terminal as well as logic power on VCC. Without V+ the servos stay still even when I2C works. The OE pin must be low, the I2C address is usually 0x40, and the PWM frequency for hobby servos is 50 Hz.
Run an I2C scanner to confirm the address, set the frequency to 50 Hz and use pulse values for roughly 1 to 2 ms, which is about 205 to 410 counts out of 4096 at 50 Hz. Use a separate supply for the servos and join the grounds.
If you see this, do this
| You see | Do this |
|---|---|
| Scanner finds 0x40 but no movement | V+ supply missing, or OE high. |
| Servos buzz at one end | Pulse values out of the servo range. |
Related
servo does not move on ESP32, servo pulse calculator, servo jitter.
Last reviewed: November 2026. These are the usual causes and the order that finds them fastest. Test on your own board; clones and cables differ.
Why this happens
The PCA9685 board has two separate power paths. The chip itself runs from the logic supply on VCC and answers on I2C. The servos are powered from the V+ terminal, and the board only passes that voltage to the connectors. If V+ is not connected, I2C works, a scanner finds the board, and the servos still do nothing.
The pulse information is also unusual. The chip divides each period into 4096 counts, and you tell it at which count the signal goes high and low. At 50 Hz the period is 20 ms, so one count is about 4.88 microseconds. A servo expects a pulse of roughly 1 to 2 ms, which is around 205 to 410 counts.
How to confirm the cause
- Run an I2C scanner. Finding 0x40 (or the address you set with the solder jumpers) proves the logic side works.
- Measure the voltage on the V+ terminal and across the servo connector with the board powered. It should be the servo supply, typically 5 V to 6 V.
- Check the OE pin. A high level on it turns off all outputs.
- Send a pulse of 307 counts, which is about 1.5 ms, on one channel and see whether the servo goes to the centre.
- Check that grounds of the servo supply and the controller are joined.
Worked example
Centring the servo on channel 0 with the Adafruit library:
#include <Adafruit_PWMServoDriver.h>
Adafruit_PWMServoDriver pwm(0x40);
void setup() {
pwm.begin();
pwm.setPWMFreq(50); // 50 Hz = 20 ms period
pwm.setPWM(0, 0, 307); // 307 / 4096 x 20 ms = 1.5 ms
}
void loop() {}Common mistakes
- Powering several servos from the board’s logic pin or the USB port of the controller.
- Sending values in microseconds to a function that expects counts.
- Using channel numbers above 15.
- Forgetting that the chip’s internal oscillator is not exact, so the real pulse differs from the calculation; adjust by testing.
- Skipping the large capacitor across the servo supply, so start-up current dips reset the controller.
If this did not fix it
- A servo supply that cannot deliver the stall current of several servos at once.
- Wrong address because of changed solder jumpers on the board.
- SDA and SCL wired to the wrong pins for your microcontroller.