Código de búsqueda

Controlando un motor servo de 32 utilizando un módulo PCA9685 y un ESP32 V4

Controlando un motor servo de 32 utilizando un módulo PCA9685 y un ESP32 V4

En este tutorial, aprenderás a controlar hasta 32 servomotores utilizando un microcontrolador ESP32 conectado a un módulo PCA9685. Esto es especialmente útil para proyectos que requieren que múltiples servomotores operen simultáneamente sin el uso de Wi-Fi. El resultado será una configuración completamente funcional donde podrás manipular la posición de cada servomotor de forma individual.

PCA9685 module-0

Este tutorial te guiará a través de los componentes de hardware necesarios, las instrucciones de cableado y una visión general del código requerido para lograr este control. Para una demostración detallada, considera ver el video asociado (en el video a :00).

Hardware Explicado

Los componentes principales utilizados en este proyecto son el microcontrolador ESP32 y el módulo controlador PWM PCA9685. El ESP32 sirve como el controlador principal que envía señales al módulo PCA9685, que a su vez controla los servomotores. El PCA9685 puede manejar hasta 16 servomotores por módulo, lo que permite la conexión de dos módulos para controlar un total de 32 servos.

El módulo PCA9685 opera utilizando comunicación I2C, lo que significa que tiene dos cables principales para la transferencia de datos: SDA (línea de datos) y SCL (línea de reloj). También requiere una fuente de alimentación para operar los servos, típicamente a 5V. El ESP32 actúa como el dispositivo maestro, proporcionando las señales de control necesarias a los módulos esclavos PCA9685.

Detalles de la hoja de datos

Fabricante Adafruit
Número de pieza PCA9685
Voltaje de lógica/entrada/salida 3.3 V a 5.5 V
Tensión de alimentación 5 V
Corriente de salida (por canal) ~20 mA
Corriente pico (por canal) ~25 mA
Guía de frecuencia PWM 60 Hz
Umbrales de lógica de entrada 0.3*VDD(bajo), 0.7*VDD(alto)
Caída de tensión / RDS(on)/ saturación 0.5 V máx
Límites térmicos 125 °C
Paquete HTSSOP-28
Notas / variantes controlador PWM de 16 canales

  • Utilice una fuente de alimentación externa para los servos (5V, 2A recomendado).
  • Asegúrese de tener una conexión a tierra adecuada entre el ESP32 y el PCA9685.
  • Verifica la configuración de frecuencia PWM para un rendimiento óptimo del servo.
  • Ajuste los límites del ancho de pulso según las especificaciones del servo.
  • Ten cuidado con el consumo de corriente cuando múltiples servos están activos.

Instrucciones de cableado

ESP32 wiring for PCA99685 for 32 sevo motors

Para conectar el PCA9685 al ESP32, comienza por conectar la alimentación y tierra. Conecta el VCCconectar el pin del PCA9685 a una fuente de alimentación de 5V y conectar el pin GND a uno de los pines GND en el ESP32. Esto asegura que tanto el módulo como el ESP32 compartan una tierra común.

A continuación, para la comunicación I2C, conecta el pin SDA en el PCA9685 al GPIO 21 en el ESP32 y el pin SCL al GPIO 22. Esta configuración permite que el ESP32 se comunique correctamente con el módulo PCA9685. Asegúrate de usar cables cortos para evitar ruido en las líneas de comunicación, especialmente si estás trabajando con múltiples servos.

Conectando dos placas PCA9685

Como se muestra en la imagen arriba, para la placa PCA9685 2 (a la izquierda), asegúrate de soldar ese camino para establecer la dirección I2C, de modo que sea diferente de la placa 1 (a la derecha).

Ejemplos de código y guía

El código inicializa los módulos PCA9685 y establece la frecuencia de PWM. Los identificadores clave en el código incluyenboard1yboard2, que representan los dos módulos PCA9685 conectados al ESP32. Elsetup()La función inicializa el monitor serie y establece la frecuencia PWM para ambas 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 extracto muestra el proceso de configuración, donde se inicializa la comunicación serial y se establece la frecuencia PWM para los controladores de servo. ElsetPWMFreq(60)la función garantiza que los servos reciban la frecuencia correcta para un funcionamiento suave.

En el bucle, un bucle for itera a través de ángulos de 0 a 180 grados, enviando comandos de ancho de pulso a los servos conectados a ambas placas PCA9685. La funciónangleToPulseconvierte el ángulo a la correspondiente anchura de pulso.

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 extracto de código demuestra cómo se controlan los servos en un bucle. El ángulo del servo se incrementa en 10 grados, y elsetPWMse llama a la función para ambas placas para mover los servos al ángulo especificado. La demora permite una breve pausa entre movimientos.

Demostración / Qué Esperar

Al completar el cableado y cargar el código, deberías ver los servos moviéndose en incrementos de 0 a 180 grados. Esto sucederá para los 32 servos conectados a los dos módulos PCA9685 simultáneamente. Si algún servo no responde, verifica la fuente de alimentación y asegúrate de que todas las conexiones estén seguras (en el video a las 12:30).

módulo PCA9685
módulo PCA9685

Marcas de tiempo en video

  • 00:00 Comenzar
  • 00:36 Introducción
  • 04:01 Explicación del cableado (solo ESP32)
  • 06:26 Preparando Arduino IDE para ESP32
  • 08:34 Código explicado
  • 13:40 Demostración de 32 motores servo en funcionamiento

Imágenes

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

Cosas que podrías necesitar

Recursos y referencias

Aún no hay recursos.

Archivos📁

Bibliotecas de Arduino (zip)