Código de Pesquisa

Controlando um Motor Servo de 32 usando um Módulo PCA9685 e um ESP32 V4

Controlando um Motor Servo de 32 usando um Módulo PCA9685 e um ESP32 V4

Neste tutorial, você aprenderá como controlar até 32 servomotores usando um microcontrolador ESP32 conectado a um módulo PCA9685. Isso é particularmente útil para projetos que exigem que vários servomotores operem simultaneamente sem o uso de Wi-Fi. O resultado será uma configuração totalmente funcional onde você poderá manipular a posição de cada servomotor individualmente.

PCA9685 module-0

Este tutorial o guiará pelos componentes de hardware necessários, instruções de fiação e uma visão geral do código necessário para alcançar este controle. Para uma demonstração detalhada, considere assistir ao vídeo associado (no vídeo às 00:00).

Hardware Explicado

Os componentes principais utilizados neste projeto são o microcontrolador ESP32 e o módulo driver PWM PCA9685. O ESP32 serve como o controlador principal que envia sinais para o módulo PCA9685, que por sua vez controla os motores servo. O PCA9685 pode controlar até 16 motores servo por módulo, permitindo a conexão de dois módulos para controlar um total de 32 servos.

O módulo PCA9685 opera utilizando comunicação I2C, o que significa que possui dois fios principais para transferência de dados: SDA (linha de dados) e SCL (linha de clock). Ele também requer uma fonte de alimentação para operar os servos, tipicamente a 5V. O ESP32 atua como o dispositivo mestre, fornecendo os sinais de controle necessários para os módulos escravos PCA9685.

Detalhes da Ficha Técnica

Fabricante Adafruit
Número da peça PCA9685
Tensão de lógica/entrada e saída 3,3 V a 5,5 V
Tensão de alimentação 5 V
Corrente de saída (por canal) ~20 mA
Corrente de pico (por canal) ~25 mA
Orientação sobre frequência PWM 60 Hz
Limiares de lógica de entrada 0,3*VDDbaixo, 0,7*VDD(alto)
Queda de tensão / RDS(on)/ saturação 0,5 V máx
Limites térmicos 125 °C
Pacote HTSSOP-28
Notas / variantes Controlador PWM de 16 canais

  • Utilize fonte de alimentação externa para os servos (5V, 2A recomendado).
  • Assegure um aterramento adequado entre o ESP32 e o PCA9685.
  • Verifique as configurações de frequência PWM para um desempenho ideal do servo.
  • Ajuste os limites da largura do pulso com base nas especificações do servo.
  • Tenha cuidado com a corrente quando vários servos estão ativos.

Instruções de Fiação

ESP32 wiring for PCA99685 for 32 sevo motors

Para conectar o PCA9685 ao ESP32, comece ligando a fonte de alimentação e o terra. Conecte o VCCconecte o pino do PCA9685 a uma fonte de alimentação de 5V e conecte o pino GND a um dos pinos GND no ESP32. Isso garante que tanto o módulo quanto o ESP32 compartilhem um terra comum.

Em seguida, para a comunicação I2C, conecte o pino SDA no PCA9685 ao GPIO 21 no ESP32 e o pino SCL ao GPIO 22. Esta configuração permite que o ESP32 se comunique corretamente com o módulo PCA9685. Certifique-se de usar fios curtos para evitar ruídos nas linhas de comunicação, especialmente se você estiver trabalhando com vários servos.

Conectando duas placas PCA9685

Como mostrado na imagem acima, para a placa PCA9685 2 (à esquerda), certifique-se de soldar aquele caminho para definir o endereço I2C para que seja diferente da placa 1 (à direita).

Exemplos de Código e Passo a Passo

O código inicializa os módulos PCA9685 e define a frequência PWM. Os identificadores-chave no código incluemboard1eboard2, que representam os dois módulos PCA9685 conectados ao ESP32. Osetup()a função inicializa o monitor serial e define a frequência PWM para ambas as placas.

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);
}

Este trecho mostra o processo de configuração, onde a comunicação serial é inicializada e a frequência PWM é definida para os drivers de servo. OsetPWMFreq(60)A função garante que os servos recebam a frequência correta para um funcionamento suave.

No loop, um loop for itera por ângulos de 0 a 180 graus, enviando comandos de largura de pulso para os servos conectados a ambas as placas PCA9685. A funçãoangleToPulseconverte o ângulo na largura de pulso correspondente.

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);
}

Este trecho de código demonstra como os servos são controlados em um loop. O ângulo do servo aumenta em 10 graus, e asetPWMa função é chamada para ambas as placas para mover os servos para o ângulo especificado. O atraso permite uma breve pausa entre os movimentos.

Demonstração / O que Esperar

Ao concluir a fiação e carregar o código, você deve ver os servos se movendo em incrementos de 0 a 180 graus. Isso acontecerá para os 32 servos conectados aos dois módulos PCA9685 simultaneamente. Se algum servo não responder, verifique a fonte de alimentação e certifique-se de que todas as conexões estão seguras (no vídeo às 12:30).

Módulo PCA9685
Módulo PCA9685

Carimbos de tempo do vídeo

  • 00:00 Iniciar
  • 00:36 Introdução
  • 04:01 Fiação Explicada (somente ESP32)
  • 06:26 Preparando o Arduino IDE para ESP32
  • 08:34 Código Explicado
  • 13:40 Demonstração de funcionamento de 32 Motores Servo

Imagens

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
Idioma: 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;
}

Coisas que você pode precisar

Recursos e referências

Ainda não há recursos.

Arquivos📁

Bibliotecas do Arduino (zip)