Код для поиска

Управление 32 сервомоторами с помощью модуля PCA9685 и ESP32 V4

Управление 32 сервомоторами с помощью модуля PCA9685 и ESP32 V4

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

PCA9685 module-0

Этот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.
  • Проверьте настройки частоты ШИМ для оптимальной работы сервопривода.
  • Настройте пределы ширины импульса в зависимости от характеристик сервопривода.
  • Будьте осторожны с потреблением тока, когда несколько сервоприводов активны.

Инструкции по подключению

ESP32 wiring for PCA99685 for 32 sevo motors

Чтобы подключить PCA9685 к ESP32, начните с подключения питания и земли. Подключите VCCподсоедините вывод на PCA9685 к источнику питания 5В, а вывод GND подключите к одному из выводов GND на ESP32. Это гарантирует, что модуль и ESP32 имеют общий ноль.

Далее, для I2C-стойкого соединения подключите контакт SDA на PCA9685 к GPIO 21 на ESP32, а SCL к GPIO 22. Эта схема позволяет ESP32 правильно взаимодействовать с модулем PCA9685. Убедитесь, что используете короткие провода, чтобы избежать помех в линиях связи, особенно если вы работаете с несколькими сервоприводами.

Соединение двух плат 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).

модуль PCA9685
Модуль PCA9685

Временные метки видео

  • 00:00 Начало
  • 00:36 Введение
  • 04:01 Объяснение проводки (только ESP32)
  • 06:26 Подготовка Arduino IDE для ESP32
  • 08:34 Код объяснен
  • 13:40 Демонстрация работы 32 сервомоторов

Изображения

PCA9685 module-0
PCA9685 module-0
PCA9685 module-2
PCA9685 module-2
PCA9685 module-3
PCA9685 module-3
PCA9685 module
PCA9685 module
Connecting two PCA9685 board
Connecting two PCA9685 board
ESP32 wiring for PCA99685 for 32 sevo motors
ESP32 wiring for PCA99685 for 32 sevo motors
880-new- PCA9685 Video V4, Arduino ESP32 Code : Controlling all 32 servo motor wihtout WiFi
Язык: C++
/*
 * 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;
}

Вещи, которые могут вам понадобиться

Ресурсы и ссылки

Ресурсов пока нет.

Файлы📁

Библиотеки Arduino (zip)