Этот учебник является частью: Управление 16 или 32 сервомоторами с помощью PCA9685
Эта подборка обучающих видеороликов поможет вам управлять 32 и более сервомоторами с помощью Arduino UNO, Nano, Mini или ESP32. Все коды прилагаются.
Управление 32 сервомоторами с помощью модуля PCA9685 и ESP32 V4
В этом учебном пособии вы научитесь управлять до 32 сервомоторами, используя микроконтроллер ESP32, подключенный к модулю PCA9685. Это особенно полезно для проектов, которые требуют одновременной работы нескольких сервомоторов без использования Wi-Fi. Результатом станет полностью функциональная установка, где вы сможете управлять положением каждого сервомотора индивидуально.

ЭтотTutorial проведет вас через необходимые аппаратные компоненты, инструкции по проводке и обзор кода, необходимого для достижения этого управления. Для подробной демонстрации рассмотрите возможность просмотра связанного видео (в видео на 00:00).
Аппаратное обеспечение объяснено
Основные компоненты, используемые в этом проекте, это микроконтроллер ESP32 и модуль драйвера ШИМ PCA9685. ESP32 выполняет роль основного контроллера, который отправляет сигналы на модуль PCA9685, который, в свою очередь, управляет сервомоторами. PCA9685 может контролировать до 16 сервомоторов на модуль, что позволяет подключить два модуля для управления в общей сложности 32 сервомоторами.
Модуль PCA9685 работает с использованием I2C-связи, что означает, что у него есть два основных провода для передачи данных: SDA (линия данных) и SCL (тактовая линия). Также требуется источник питания для работы сервоприводов, обычно на 5 В. ESP32 выполняет функции главного устройства, предоставляя необходимые управляющие сигналы подчинённым модулям PCA9685.
Техническое описание
| Производитель | Адафрут |
|---|---|
| Номер детали | PCA9685 |
| Логика/напряжение ввода-вывода | 3.3 В до 5.5 В |
| Напряжение питания | 5 В |
| Текущий выход (на канал) | ~20 мА |
| Пиковый ток (на канал) | ~25 мА |
| Руководство по частоте ШИМ | 60 Гц |
| Входные логические пороги | 0.3*VDD(низкий), 0.7*VDD(высоко) |
| Падение напряжения / RДС(включен)/ насыщение | 0,5 В макс |
| Термические ограничения | 125 °C |
| Пакет | HTSSOP-28 |
| Заметки / варианты | 16-канальный ШИМ-контроллер |
- Используйте внешний источник питания для серводвигателей (рекомендуется 5 В, 2 А).
- Обеспечьте правильное заземление между ESP32 и PCA9685.
- Проверьте настройки частоты ШИМ для оптимальной работы сервопривода.
- Настройте пределы ширины импульса в зависимости от характеристик сервопривода.
- Будьте осторожны с потреблением тока, когда несколько сервоприводов активны.
Инструкции по подключению

Чтобы подключить PCA9685 к ESP32, начните с подключения питания и земли. Подключите VCCподсоедините вывод на PCA9685 к источнику питания 5В, а вывод GND подключите к одному из выводов GND на ESP32. Это гарантирует, что модуль и ESP32 имеют общий ноль.
Далее, для I2C-стойкого соединения подключите контакт SDA на PCA9685 к GPIO 21 на ESP32, а SCL к GPIO 22. Эта схема позволяет ESP32 правильно взаимодействовать с модулем PCA9685. Убедитесь, что используете короткие провода, чтобы избежать помех в линиях связи, особенно если вы работаете с несколькими сервоприводами.
Как показано на изображении выше, для платы PCA9685 2 (слева) убедитесь, что вы припаиваете этот путь, чтобы установить адрес I2C так, чтобы он отличался от платы 1 (справа).
Примеры кода и руководство
Код инициализирует модули PCA9685 и устанавливает частоту ШИМ. Ключевые идентификаторы в коде включаютboard1иboard2, которые представляют собой два модуля PCA9685, подключенных к ESP32.setup()функция инициализирует последовательный монитор и устанавливает частоту ШИМ для обеих плат.
void setup() {
Serial.begin(9600);
Serial.println("32 channel Servo test!");
board1.begin();
board2.begin();
board1.setPWMFreq(60); // Analog servos run at ~60 Hz updates
board2.setPWMFreq(60);
}Этот фрагмент демонстрирует процесс настройки, в котором инициализируется последовательная связь и устанавливается частота ШИМ для сервоприводов.setPWMFreq(60)функция обеспечивает, чтобы сервоприводы получали правильную частоту для плавной работы.
В цикле for происходит итерация по углам от 0 до 180 градусов, отправляя команды ширины импульса на сервоприводы, подключенные к обеим платам PCA9685. ФункцияangleToPulseпревращает угол в соответствующую ширину импульса.
void loop() {
for(int angle = 0; angle < 181; angle += 10) {
for(int i = 0; i < 16; i++) {
board2.setPWM(i, 0, angleToPulse(angle));
board1.setPWM(i, 0, angleToPulse(angle));
}
}
delay(100);
}Этот фрагмент кода демонстрирует, как серводвигатели управляются в цикле. Угол сервопривода увеличивается на 10 градусов, иsetPWMфункция вызывается для обеих плат, чтобы переместить сервоприводы в заданный угол. Задержка позволяет сделать короткую паузу между движениями.
Демонстрация / Что ожидать
После завершения подключения проводки и загрузки кода вы должны увидеть, как сервомеханизмы движутся с шагами от 0 до 180 градусов. Это произойдет со всеми 32 сервомеханизмами, подключенными к двум модулям PCA9685 одновременно. Если какой-либо сервомеханизм не реагирует, проверьте блок питания и убедитесь, что все соединения надежны (в видео на 12:30).
Временные метки видео
- 00:00 Начало
- 00:36 Введение
- 04:01 Объяснение проводки (только ESP32)
- 06:26 Подготовка Arduino IDE для ESP32
- 08:34 Код объяснен
- 13:40 Демонстрация работы 32 сервомоторов
Этот учебник является частью: Управление 16 или 32 сервомоторами с помощью PCA9685
- Код Arduino и видео для сервоконтроллера PCA9685 на 16 каналов с разрешением 12 бит V1
- Управление 16 сервомоторами с помощью модуля PCA9685 и скетча Arduino V2 #1: По одному
- Управление 16 серводвигателями с помощью модуля PCA9685 и скетча Arduino V2: Управление отдельным сервоприводом
- Controlling 16 Servo Motors Using a PCA9685 Module and Arduino V2 Sketch #3: All Servos Together
- Управление 32 сервомотором с использованием модуля PCA9685 и скетча Arduino V3 #1: Все сервы вместе
- Управление 32 сервомоторами по Wi-Fi с использованием ESP32 и PCA9685 через настольный или мобильный телефон V5
/*
* Original library source: https://github.com/adafruit/Adafruit-PWM-Servo-Driver-Library
*
* This is the Arduino code PCA6985 16 channel servo controller
* to control 32 Servo Motors with ESP32 board without WiFi
get this code and wiring from for this video: http://robojax.com/RJT268
*
* This is V4 Video on PCA9685: https://youtu.be/JFdXB8Za5Os
*
* watch the video for details (V1) and demo http://youtu.be/y8X9X10Tn1k
*
* Written/updated by Ahmad Shamshiri for Robojax Video channel www.Robojax.com
* Date: Dec 15, 2019, in Ajax, Ontario, Canada
* Disclaimer: this code is "AS IS" and for educational purpose only.
or make donation using PayPal http://robojax.com/L/?id=64
* * This code is "AS IS" without warranty or liability. Free to be used as long as you keep this note intact.*
* This code has been download from Robojax.com
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
#include <Wire.h>
#include <Adafruit_PWMServoDriver.h>
// called this way, it uses the default address 0x40
Adafruit_PWMServoDriver board1 = Adafruit_PWMServoDriver(0x40);
Adafruit_PWMServoDriver board2 = Adafruit_PWMServoDriver(0x41);
// 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!
// Watch video V1 to understand the two lines below: http://youtu.be/y8X9X10Tn1k
#define SERVOMIN 125 // this is the 'minimum' pulse length count (out of 4096)
#define SERVOMAX 575 // this is the 'maximum' pulse length count (out of 4096)
int servoNumber = 0;
void setup() {
Serial.begin(9600);
Serial.println("32 channel Servo test!");
board1.begin();
board2.begin();
board1.setPWMFreq(60); // Analog servos run at ~60 Hz updates
board2.setPWMFreq(60);
//yield();
}
// the code inside loop() has been updated by Robojax
void loop() {
for( int angle =0; angle<181; angle +=10){
for(int i=0; i<16; i++)
{
board2.setPWM(i, 0, angleToPulse(angle) );
board1.setPWM(i, 0, angleToPulse(angle) );
}
}
// robojax PCA9865 16 channel Servo control
delay(100);
}
/*
* angleToPulse(int ang)
* gets angle in degree and returns the pulse width
* also prints the value on seial monitor
* written by Ahmad Shamshiri for Robojax, Robojax.com
*/
int angleToPulse(int ang){
int pulse = map(ang,0, 180, SERVOMIN,SERVOMAX);// map angle of 0 to 180 to Servo min and Servo max
Serial.print("Angle: ");Serial.print(ang);
Serial.print(" pulse: ");Serial.println(pulse);
return pulse;
}
Вещи, которые могут вам понадобиться
-
АмазонкаКупите PCA9685 на Amazonamzn.to
-
eBayКупите PCA9685 на eBayebay.us
-
АлиЭкспрессКупите PCA9685 на AliExpresss.click.aliexpress.com
-
БанггудПриобретите PCA9685 на Bangoodbanggood.com
Ресурсы и ссылки
Ресурсов пока нет.
Файлы📁
Библиотеки Arduino (zip)
-
Adafruit-PWM-Сервопривод-Менеджер-Библиотека-мастер
Adafruit-PWM-Servo-Driver-Library-master.zip0.02 MB