Подключение PCA9685 к Arduino

Необходимо:
► Arduino UNO x 1 шт.
► Контроллер PCA9685 16 каналов x 1 шт.
► Провода дюпон M-F, 20 см x 1 шт.

Описание
В этом примере показано управление двумя сервоприводами SC90 с помощью Arduino. В качестве источника питания для сервоприводов используем питание от Arduino, но в готовых проектах рекомендую использовать отдельное питание на 5В.

Подключение
Сервопривод подключаются с помощью 3-проводного разъема BLS, в гнездо 0 и 4. Далее подключаем линию I2C, SDA к А4 (Arduino) и SCL к A5 (Arduino), затем подключаем питание логической части схемы GND и Vcc и в конце подключаем питание сервоприводов. Для удобства привел схему подключения ниже.

Установка библиотеки
Для работы скетча необходимо библиотека «Wire» и «Adafruit_PWMServoDriver«, последняя библиотека не входит в среду разработки IDE Arduino необходимо дополнительно скачать с «Менеджера библиотек«.

Далее вводим в поиск «PWM» и устанавливаем указанную библиотеку.

 

Программа
Теперь можно приступить к скетчу, скачиваем или копируем его в среду разработки Arduino IDE.

#include <Wire.h> // Подключаем библиотеку Wire
#include <Adafruit_PWMServoDriver.h> // Подключаем библиотеку Adafruit_PWMServoDriver

Adafruit_PWMServoDriver pwm = Adafruit_PWMServoDriver(0x40); // Установка адреса I2C 0x40

#define SERVOMIN 150 // Минимальная длительность импульса для сервопривода
#define SERVOMAX 600 // Максимальная длина импульса для сервопривода
#define SERVO_1 0 // Номер порта (0 – 15)
#define SERVO_2 4 // Номер порта (0 – 15)

void setup()
{
pwm.begin(); // Инициализация
pwm.setPWMFreq(60); // Частота следования импульсов 60 Гц
delay(10); // Пауза
}

void loop()
{
// Вращение сервопривода 1 влево
for (uint16_t pulselen = SERVOMIN; pulselen < SERVOMAX; pulselen++)
{
pwm.setPWM(SERVO_1, 0, pulselen);
}
delay(250);
// Вращение сервопривода 1 вправо
for (uint16_t pulselen = SERVOMAX; pulselen > SERVOMIN; pulselen–)
{
pwm.setPWM(SERVO_1, 0, pulselen);
}
delay(250);

// Вращение сервопривода 2 влево
for (uint16_t pulselen = SERVOMIN; pulselen < SERVOMAX; pulselen++)
{
pwm.setPWM(SERVO_2, 0, pulselen);
}
delay(250);
// Вращение сервопривода 2 вправо
for (uint16_t pulselen = SERVOMAX; pulselen > SERVOMIN; pulselen–)
{
pwm.setPWM(SERVO_2, 0, pulselen);
}
delay(250);
}