Инструменты пользователя

Инструменты сайта


pca9685

Информация

PCA9685 — это 16-ти канальный 12-разрядный контроллер с настраиваемой частотой ШИМ-а в пределах от 24 до 1526 Гц. С помощью ШИМ контроллера можно управлять яркостью светодиодов, сервоприводами, и другими устройствами, где в качестве управляющего сигналы применяется ШИМ сигнал.

Для управления PCA9685 используется шина I2C, на этой плате есть две группы разъемов для шины I2C с двух сторон. Это позволяет подключать на одной шине несколько плат последовательно или подключать другие I2C устройства.

На плате есть перемычки, с помощью которых можно установить адрес устройства отличный от стандартного. Поэтому если 16 каналов Вам мало можно последовательно включить несколько таких плат, установив перемычками на каждой свой адрес. Конструкция позволяет каскадирование и управление 992 сервоприводами или 62 платами. Питание контроллера и выходов ШИМ каналов разделено и может быть от 3 до 5 вольт. Для ШИМ каналов допускается максимальное напряжение 6 Вольт. Питание для ШИМ каналов можно подавать на штырьки (V+) или через клему. На плате есть фильтрующий конденсатор — это помогает при больших нагрузках, когда питание может быть не стабильным, что может отрицательно сказываться на работе управляемых устройств.

Принципиальная схема PCA9685

Распиновка

Система установки I2C адреса на PCA9685

Данная плата имеет 16 ШИМ-выходов, то есть можно подключить 16 сервоприводов. Но, если и этого будет недостаточно – на плате есть свободные контакты GND, OE, SCL, SDA, VCC, V+, к которым при помощи 6-жильного кабеля-дюпона можно подключить еще один контроллер PCA9685, а к нему, в свою очередь, еще один. Каждой плате в цепочке должен быть присвоен свой уникальный адрес. Это можно сделать при помощи адресных контактов A0, A1, A2, A3, A4, A5. Базовый адрес для каждой платы является 0x40. Для присвоения уникального адреса нужно использовать капли припоя, чтобы присвоить соответствующий адрес для каждого контроллера. Программно это будет выглядеть так:

Плата 0: Адрес = 0x40 Смещение = binary ‭01000000‬ (плата, которая присоединена к Arduino, без припоя); Плата 1: Адрес = 0x41 Смещение = binary 01000001 (припой на А0); Плата 2: Адрес = 0x42 Смещение = binary 01000010 (припой на А1); Плата 3: Адрес = 0x43 Смещение = binary 01000011 (припой на А0, А1); Плата 4: Адрес = 0x44 Смещение = binary 01000100 (припой на А2) и т.д.

таким образом можно подключить до 62 устройств на одну шину и получить 992 ШИМ выходов.

Дополнительные адреса чипа

Чип может иметь до 3х дополнительных адресов, которые устанавливаются путём записи 7ми битных чисел в регистры SUBADR1, SUBADR2, SUBADR3. Число записывается в старшие 7 бит регистра, младший бит регистра всегда равен «0» и не доступен для записи. Дополнительные адреса действуют как основной, но могут совпадать у нескольких групп чипов на одной шине, что дает возможность передавать команды сразу группе ведомых чипов. Так как чипу доступны 3 дополнительных адреса, то он может находиться сразу в трех разных группах. Для разрешения чипу реагировать на дополнительный адрес, необходимо установить соответствующий флаг SUB1, SUB2, SUB3.

Адреса общего вызова

Адрес общего вызова это число, записываемое в старшие 7 бит регистра ALLCALLADR, младший бит регистра всегда равен «0» и не доступен для записи. Адрес действует по аналогии с дополнительными адресами, но предназначен для всех чипов на шине, хотя и может использоваться как 4 группа. Для разрешения чипу реагировать на адрес общего вызова, необходимо установить флаг ALLCALL. Не рекомендуется указывать адреса, зарезервированные протоколом I2C:

адреса 11110XX – используются устройствами с 10-битной схемой адресации; адрес 0000000 – предназначен для вызова всех устройств на шине; мастер-код 00001XX – указывает о желании мастера перевести шину в высокоскоростной HS-режим.

Описание регистров PCA9685

Блок-диаграмма микросхемы PCA9685

Подключение

Сервопривод подключаются с помощью 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);
}

Разбор скетча

Скетч начинается с подключаем библиотеки для работы с шиной I2C «Wire» и библиотеку «Adafruit_PWMServoDriver » и указанием адреса модуля.

#include <Wire.h> 
#include <Adafruit_PWMServoDriver.h>
 Adafruit_PWMServoDriver pwm = Adafruit_PWMServoDriver(0x40);

Далее мы задаем минимальный и максимальный поворот сервопривода, для каждого сервопривода, оно разное в противном случаи можно повредить его. Командой #define SERVO_1 мы указываем какому порту подключен сервопривод, диапазон от 0 до 15.

#define SERVOMIN 150  
#define SERVOMAX 600 
#define SERVO_1 0 
#define SERVO_2 4

В функции setup мы инициализируем библиотеку и задаем частоту повторения ШИМ, у меня это 60 Гц и небольшая пауза.

 pwm.begin();                         
 pwm.setPWMFreq(60);                   
 delay(10);

В основной части программы мы используем оператор for. Первым делом создаем переменную pulselen и задаем начальное число «SERVOMIN», затем после каждого цикла мы увеличиваем переменную «pulselen» на «1«, пока не получим значение «SERVOMAX» то есть 600. Во второй части программы мы делаем все на оборот.

 for (uint16_t pulselen = SERVOMIN; pulselen < SERVOMAX; pulselen++) 
  {
    pwm.setPWM(SERVO_1, 0, pulselen);
  }
pca9685.txt · Последнее изменение: 2021/03/21 19:50 — admin

Инструменты страницы