Управление несколькими сервоприводами с помощью модуля PCA9685 и Arduino
Иногда для проекта требуется подключить несколько сервоприводов к Arduino. Однако прямое подключение нескольких сервоприводов к Arduino имеет свои ограничения. Во-первых, вы быстро исчерпаете доступные PWM-пины на Arduino, особенно если в проекте есть другие компоненты, которым также необходимо управление PWM. Во-вторых, генерация точных PWM-сигналов для сервоприводов может потреблять часть вычислительных ресурсов вашего Arduino.
Лучшее решение — использовать отдельную плату драйвера сервоприводов, например модуль PCA9685. Этот модуль позволяет управлять до 16 сервоприводами, используя всего два пина Arduino. Более того, вы можете соединить в цепочку до 62 таких модулей для управления до 992 сервоприводами, при этом используя только эти два пина! И что самое важное — микросхема PCA9685 сама генерирует PWM-сигналы, что освобождает вычислительные ресурсы вашего Arduino для других важных задач.
Впечатляет, не правда ли? Давайте разберёмся, как подключить и использовать модуль PCA9685 с Arduino.
Обзор оборудования
Модуль PCA9685 — это популярная плата расширения, предназначенная в первую очередь для управления несколькими сервоприводами. Вот подробный обзор его различных компонентов:
Микросхема PCA9685
В основе модуля лежит PCA9685 — 16-канальный 12-битный PWM-драйвер светодиодов/сервоприводов с управлением по шине I2C, разработанный компанией NXP Semiconductors.
Эта микросхема отвечает за генерацию PWM-сигналов, управляющих устройствами (в нашем случае — сервоприводами), подключёнными к модулю. Она имеет 16 независимых PWM-каналов, что означает возможность одновременного управления до 16 сервоприводами. Частота и скважность каждого канала могут быть настроены индивидуально, а диапазон частот составляет приблизительно от 24 Гц до 1526 Гц.
Ещё более впечатляет то, что можно соединить в цепочку до 62 таких модулей для управления до 992 сервоприводами.
Микросхема связывается с микроконтроллером (например, Arduino) по протоколу I2C, используя всего два пина (SDA и SCL). После отправки простой I2C-команды для установки сервопривода в нужное положение, PCA9685 самостоятельно выполняет все необходимые обновления для поддержания этого положения. Это значительно снижает нагрузку на микроконтроллер, освобождая его для выполнения других важных задач в вашем проекте.
Кроме того, PCA9685 имеет встроенный генератор, поэтому для генерации PWM-сигналов не требуется внешний источник тактовых импульсов.
Для получения дополнительной информации о PCA9685, обратитесь к даташиту.
Перемычки выбора I2C-адреса
Модуль PCA9685 оснащён перемычками выбора I2C-адреса в правом верхнем углу. Эти перемычки необходимы для назначения уникального I2C-адреса каждому модулю PCA9685 при подключении нескольких модулей к одной шине I2C. Это предотвращает конфликты и обеспечивает правильную связь.
По умолчанию модуль PCA9685 без подключённых перемычек имеет базовый адрес 0x40. Двоичный адрес, установленный с помощью перемычек, прибавляется к этому базовому I2C-адресу. Например, если замкнуть площадку A0, адрес станет 0x41. Если замкнуть A1, адрес станет 0x42. Замыкание и A0, и A1 приведёт к адресу 0x43. Эта система позволяет настроить уникальные адреса, необходимые для одновременного управления несколькими модулями PCA9685.
На изображении ниже показаны различные комбинации перемычек и соответствующие им I2C-адреса.
Разъёмы для сервоприводов
Модуль оснащён 16 наборами трёхконтактных разъёмов, предназначенных для удобного подключения сервоприводов. Каждый набор содержит контакт земли, контакт питания и контакт PWM-выхода, соответствующий одному из 16 доступных каналов модуля.
Хотя каждый PWM-канал работает независимо, важно помнить, что все 16 каналов должны иметь одинаковую частоту PWM.
Светодиодный индикатор
На модуле есть светодиодный индикатор, который сообщает о наличии питания.
Большой электролитический конденсатор
Двигатели склонны потреблять повышенный ток, что может вызывать колебания напряжения питания. Именно поэтому модуль PCA9685 оснащён большим электролитическим конденсатором.
Этот конденсатор выполняет функцию фильтра и стабилизатора питания, сглаживая колебания и скачки напряжения. Это обеспечивает надёжную и бесперебойную работу как микросхемы PCA9685, так и подключённых устройств, особенно двигателей.
Двухконтактная винтовая клемма питания
Модуль оснащён двухконтактной винтовой клеммой для подключения внешнего источника питания.
Этот вход питания необходим, поскольку управление несколькими сервоприводами требует большего тока, чем может обеспечить микроконтроллер. Используя выделенный вход питания модуля, вы обеспечиваете сервоприводы необходимой мощностью для надёжной работы.
Распиновка модуля PCA9685
Рассмотрим распиновку:
Вход питания двигателей (двухконтактная винтовая клемма)
Сюда подключается внешний источник питания для сервоприводов. Вот описание контактов:
GND — общий контакт заземления.
V+ — распределённое питание сервоприводов. Рекомендуется подавать на этот контакт 5-6В постоянного тока.
Логические подключения (разъём 1×6)
Этот разъём служит для соединения модуля PCA9685 с вашим микроконтроллером (МК). Управляющие сигналы совместимы с логическими уровнями 3,3В и 5В.
GND подключается к контакту земли вашего МК.
OE (Output Enable) может использоваться для быстрого отключения всех выходов. Когда этот вывод подтянут к LOW, все выходы включены. Если подтянуть его к HIGH, выходы отключаются. Поскольку модуль имеет встроенный подтягивающий к земле резистор, выходы по умолчанию включены.
SCL — вывод тактового сигнала I2C, подключается к линии тактового сигнала I2C вашего микроконтроллера. Поддерживает логику 3В или 5В и имеет слабую подтяжку к VCC.
SDA — вывод данных I2C, подключается к линии данных I2C вашего микроконтроллера. Поддерживает логику 3В или 5В и имеет слабую подтяжку к VCC.
VCC — вывод питания логики. Обычно принимает напряжение от 3,3В до 5В. Убедитесь, что оно соответствует логическому уровню вашего микроконтроллера.
V+ — распределённое питание сервоприводов. Рекомендуется подавать на этот контакт 5-6В постоянного тока. Хотя вы можете подключить источник питания непосредственно к этому контакту, предпочтительнее использовать двухконтактную винтовую клемму. Контакты V+ удобны для последовательного соединения нескольких модулей PCA9685 и питания всех сервоприводов от одного источника.
Незаполненный разъём 1×6 на противоположной стороне модуля предназначен для последовательного соединения нескольких модулей PCA9685. Оба разъёма имеют идентичные подключения, поэтому вы можете припаять контакты на незаполненной стороне и использовать её в качестве входа, если это удобнее для компоновки вашего проекта.
Разъёмы для сервоприводов (16 цветных трёхконтактных разъёмов 1×3)
Выходные разъёмы имеют цветовую маркировку, соответствующую стандартным кабелям сервоприводов, для удобного подключения. Они пронумерованы от 0 до 15 на плате, и каждое подключение включает следующие контакты:
PWM подключается к сигнальному контакту сервопривода.
V+ подключается к контакту питания сервопривода.
GND подключается к контакту земли сервопривода.
Подключение сервоприводов к модулю PCA9685 и соединение с Arduino
Сначала подключим сервоприводы к модулю PCA9685.
Каждый сервопривод имеет три провода: коричневый или чёрный — земля (GND), красный — питание (обычно 5В), и оранжевый, жёлтый или белый — сигнал (PWM). Вставьте разъёмы сервоприводов в трёхконтактные колодки модуля PCA9685. Убедитесь, что штекер расположен так, что провод земли совпадает с нижним рядом, а сигнальный провод — с верхним.
Для подключения модуля PCA9685 к Arduino используются выводы I2C. Соедините вывод SDA модуля PCA9685 с выводом SDA Arduino (A4), а вывод SCL — с выводом SCL Arduino (A5). Затем подключите вывод GND модуля PCA9685 к контакту GND Arduino, а вывод VCC — к контакту 5V Arduino.
Большинство сервоприводов рассчитаны на напряжение питания около 5 или 6 В. Имейте в виду, что одновременная работа нескольких сервоприводов может привести к значительному потреблению тока. Даже небольшие сервоприводы потребляют несколько сотен миллиампер (мА) при движении, а мощные сервоприводы могут требовать более 1 ампера каждый под нагрузкой. Не рекомендуется использовать контакт 5V Arduino для питания сервоприводов. Электрические помехи и просадки напряжения от чрезмерного потребления тока могут вызвать нестабильную работу Arduino, перезагрузки и/или перегрев.
Поэтому настоятельно рекомендуется использовать отдельный источник питания для сервоприводов. Подключите его к двухконтактной винтовой клемме модуля PCA9685.
На изображении ниже показана схема подключения.
Последовательное соединение модулей PCA9685
Если для вашего проекта требуется управление более чем 16 сервоприводами, можно легко соединить несколько модулей PCA9685 в цепочку. До 62 плат можно соединить в цепочку для управления до 992 сервоприводами.
Подключение выполняется просто, так как каждая плата имеет разъёмы на обоих концах. Достаточно использовать 6-контактный параллельный кабель для соединения одной платы со следующей. Однако крайне важно помнить о необходимости установки уникального адреса на перемычках каждого модуля. Это предотвращает конфликты на шине I2C, обеспечивая возможность индивидуальной адресации и управления каждым модулем.
Установка библиотеки
Для работы с PCA9685 вам понадобится библиотека Arduino. `Библиотека PCA9685 от NachtRaveVL `_ — популярный выбор.
Для установки библиотеки:
Сначала откройте программу Arduino IDE. Затем нажмите на значок Менеджер библиотек на левой боковой панели.
Введите «PCA9685» в строку поиска для фильтрации результатов.
Найдите PCA9685 16-channel PWM Driver Module Library от NachtRaveVL.
Нажмите кнопку Install, чтобы добавить библиотеку в Arduino IDE.
Код Arduino
Вот простой скетч, который заставляет два сервопривода, подключённые к каналам 0 и 1 модуля PCA9685, совершать возвратно-поступательные движения в диапазоне 180 градусов.
#include <Wire.h>
#include "PCA9685.h"
PCA9685 driver;
// PCA9685 outputs = 12-bit = 4096 steps
// 2.5% of 20ms = 0.5ms ; 12.5% of 20ms = 2.5ms
// 2.5% of 4096 = 102 steps; 12.5% of 4096 = 512 steps
// we will use 112 and 500 to avoid pushing the servo to its physical limits
PCA9685_ServoEval pwmServo(112, 500); // (-90deg, +90deg)
void setup() {
Wire.begin(); // Wire must be started first
driver.resetDevices(); // Software resets all PCA9685 devices on Wire line
driver.init();
driver.setPWMFrequency(50); // Set frequency to 50Hz
}
void loop() {
driver.setChannelPWM(0, pwmServo.pwmForAngle(-90));
driver.setChannelPWM(1, pwmServo.pwmForAngle(-90));
delay(1000);
driver.setChannelPWM(0, pwmServo.pwmForAngle(0));
driver.setChannelPWM(1, pwmServo.pwmForAngle(0));
delay(1000);
driver.setChannelPWM(0, pwmServo.pwmForAngle(90));
driver.setChannelPWM(1, pwmServo.pwmForAngle(90));
delay(1000);
}
Пояснение к коду
Код начинается с подключения двух необходимых библиотек:
Библиотека
Wire.hобеспечивает связь по I2C, через которую Arduino будет взаимодействовать с модулем PCA9685.Библиотека
PCA9685.h— пользовательская библиотека, упрощающая команды управления PCA9685.
#include <Wire.h>
#include "PCA9685.h"
Затем создаётся экземпляр класса PCA9685 с именем driver для взаимодействия с аппаратной частью PCA9685.
PCA9685 driver;
Аналогично создаётся экземпляр класса PCA9685_ServoEval с именем pwmServo, инициализированный параметрами 112 и 500. Эти параметры определяют границы PWM-импульсов, соответствующие положениям сервопривода -90 и +90 градусов. Значения рассчитаны на основе цикла 20 мс (частота 50 Гц), типичного для управления сервоприводами, где 0,5 мс (~112 шагов) и 2,5 мс (~500 шагов) соответствуют длительностям импульсов для крайних положений сервопривода.
// PCA9685 outputs = 12-bit = 4096 steps
// 2.5% of 20ms = 0.5ms ; 12.5% of 20ms = 2.5ms
// 2.5% of 4096 = 102 steps; 12.5% of 4096 = 512 steps
// we will use 112 and 500 to avoid pushing the servo to its physical limits
PCA9685_ServoEval pwmServo(112, 500); // (-90deg, +90deg)
Функция setup() выполняет подготовку. Она запускает связь I2C, отправляет сигнал сброса всем подключённым модулям PCA9685, инициализирует объект driver для связи с PCA9685 и, наконец, устанавливает частоту PWM для всех каналов на 50 Гц — типичную частоту для управления сервоприводами.
void setup() {
Wire.begin(); // Wire must be started first
driver.resetDevices(); // Software resets all PCA9685 devices on Wire line
driver.init();
driver.setPWMFrequency(50); // Set frequency to 50Hz
}
Основной цикл loop() — это место, где происходит действие. Он последовательно устанавливает PWM-значения для каналов 0 и 1, перемещая их через последовательность положений: сначала в -90 градусов (крайнее левое), затем пауза на секунду, потом в 0 градусов (центр), ещё одна пауза и, наконец, в 90 градусов (крайнее правое). Этот цикл повторяется бесконечно, заставляя сервоприводы совершать возвратно-поступательные движения.
void loop() {
driver.setChannelPWM(0, pwmServo.pwmForAngle(-90));
driver.setChannelPWM(1, pwmServo.pwmForAngle(-90));
delay(1000);
driver.setChannelPWM(0, pwmServo.pwmForAngle(0));
driver.setChannelPWM(1, pwmServo.pwmForAngle(0));
delay(1000);
driver.setChannelPWM(0, pwmServo.pwmForAngle(90));
driver.setChannelPWM(1, pwmServo.pwmForAngle(90));
delay(1000);
}