Servo control

I know next to nothing about what I need. I have been messing around with a sample sketch from a library for my adafruit PAC9685 servo control. What I want to accomplish is have the servos run a set number of times, stop for a period and repeat. If someone could help me out with this I could stop pulling my hair out…thanks…

Post your best code attempt and a drawing of how you wired/powered things through the PAC9685


This is an example for our Adafruit 16-channel PWM & Servo driver
Servo test - this will drive 8 servos, one after the other on the
first 8 pins of the PCA9685

Pick one up today in the adafruit shop!

These drivers use I2C to communicate, 2 pins are required to

Adafruit invests time and resources providing this open source code,
please support Adafruit and open-source hardware by purchasing
products from Adafruit!

Written by Limor Fried/Ladyada for Adafruit Industries.
BSD license, all text above must be included in any redistribution

#include <Wire.h>
#include <Adafruit_PWMServoDriver.h>

// called this way, it uses the default address 0x40
Adafruit_PWMServoDriver pwm = Adafruit_PWMServoDriver();
// you can also call it with a different address you want
//Adafruit_PWMServoDriver pwm = Adafruit_PWMServoDriver(0x41);
// you can also call it with a different address and I2C interface
//Adafruit_PWMServoDriver pwm = Adafruit_PWMServoDriver(&Wire, 0x40);

// Depending on your servo make, the pulse width min and max may vary, you
// want these to be as small/large as possible without hitting the hard stop
// for max range. You’ll have to tweak them as necessary to match the servos you
// have!
#define SERVOMIN 150 // this is the ‘minimum’ pulse length count (out of 4096)
#define SERVOMAX 600 // this is the ‘maximum’ pulse length count (out of 4096)

// our servo # counter
uint8_t servonum = 0;

void setup() {
Serial.println(“8 channel Servo test!”);


pwm.setPWMFreq(60); // Analog servos run at ~60 Hz updates


// you can use this function if you’d like to set the pulse length in seconds
// e.g. setServoPulse(0, 0.001) is a ~1 millisecond pulse width. its not precise!
void setServoPulse(uint8_t n, double pulse) {
double pulselength;

pulselength = 1000000; // 1,000,000 us per second
pulselength /= 60; // 60 Hz
Serial.print(pulselength); Serial.println(" us per period");
pulselength /= 4096; // 12 bits of resolution
Serial.print(pulselength); Serial.println(" us per bit");
pulse *= 1000000; // convert to us
pulse /= pulselength;
pwm.setPWM(n, 0, pulse);

void loop() {
// Drive each servo one at a time
for (uint16_t pulselen = SERVOMIN; pulselen < SERVOMAX; pulselen++) {
pwm.setPWM(servonum, 0, pulselen);

for (uint16_t pulselen = SERVOMAX; pulselen > SERVOMIN; pulselen–) {
pwm.setPWM(servonum, 0, pulselen);


servonum ++;
if (servonum > 7) servonum = 0;

Did you just copy adafruits’ page (without code tags)? Where is YOUR work?

As a minimum you could at least describe what that code does and exactly what you want it to do differently. Even better you could make some attempt to change it and then post YOUR best effort with a description of what that does.

The way it works round here is you get the best help if you put some effort in yourself. Otherwise people tend to think if you can't be bothered to do any work then we won't bother either.


Welcome to the forum.

Please read the first post in any forum entitled how to use this forum.,148850.0.html then look down to item #7 about how to post your code.
It will be formatted in a scrolling window that makes it easier to read.

Thanks.. Tom.... :slight_smile:

What is connected to the power supply terminals (the 2 screw terminals marked V+ and GND), on the Adafruit board?

What I want to accomplish is have the servos run a set number of times, stop for a period and repeat.

void loop()
  for (int i=0; i < ASetNumberOfTimes; i++)