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++
/*
 * Fuente de la biblioteca original: https://github.com/adafruit/Adafruit-PWM-Servo-Driver-Library
 * 
 * Este es el código de Arduino para el controlador de servos de 16 canales PCA9685
 * para controlar 32 motores servo con la placa ESP32 sin WiFi.
 * 
 * Obtén este código y el cableado para este video: http://robojax.com/RJT268
 * 
 * Este es el Video V4 sobre PCA9685: https://youtu.be/JFdXB8Za5Os
 * 
 * Mira el video para más detalles (V1) y la demostración http://youtu.be/y8X9X10Tn1k
 * 
 * Escrito/actualizado por Ahmad Shamshiri para el canal de video Robojax www.Robojax.com
 * Fecha: 15 de diciembre de 2019, en Ajax, Ontario, Canadá.
 * 
 * Descargo de responsabilidad: este código está "TAL CUAL" y es solo para fines educativos.
 * 
 * O haz una donación utilizando PayPal http://robojax.com/L/?id=64
 * 
 * Este código está "TAL CUAL" sin garantía ni responsabilidad. Libre para ser usado siempre que mantengas esta nota intacta.*
 * Este código ha sido descargado de Robojax.com
 * Este programa es software gratuito: puedes redistribuirlo y/o modificarlo
 * bajo los términos de la Licencia Pública General de GNU tal como lo publica
 * la Free Software Foundation, ya sea la versión 3 de la Licencia, o
 * (a tu elección) cualquier versión posterior.
 * 
 * Este programa se distribuye con la esperanza de que sea útil,
 * pero SIN NINGUNA GARANTÍA; sin siquiera la garantía implícita de
 * COMERCIALIZACIÓN o ADECUACIÓN PARA UN PROPÓSITO PARTICULAR. Consulta la
 * Licencia Pública General de GNU para más detalles.
 * 
 * Deberías haber recibido una copia de la Licencia Pública General de GNU
 * junto con este programa. Si no, consulta <https://www.gnu.org/licenses/>.
 */
#include <Wire.h>

#include <Adafruit_PWMServoDriver.h>

 // llamada de esta manera, utiliza la dirección predeterminada 0x40
Adafruit_PWMServoDriver board1 = Adafruit_PWMServoDriver(0x40);
Adafruit_PWMServoDriver board2 = Adafruit_PWMServoDriver(0x41);

 // Dependiendo de la marca de tu servo, el ancho de pulso mínimo y máximo puede variar, tú
 // quiero que sean lo más pequeños/grandes posible sin llegar al límite duro
 // para el rango máximo. Tendrás que ajustarlos según sea necesario para que coincidan con los servos que
 // ¡tener!
 // Mira el video V1 para entender las dos líneas a continuación: http://youtu.be/y8X9X10Tn1k
#define SERVOMIN  125 // este es el conteo de longitud de pulso 'mínima' (de 4096)
#define SERVOMAX  575 // este es el conteo de longitud de pulso 'máximo' (de un total de 4096)


int servoNumber = 0;

void setup() {
  Serial.begin(9600);
  Serial.println("32 channel Servo test!");

  board1.begin();
  board2.begin();
  board1.setPWMFreq(60); // Los servos analógicos funcionan con actualizaciones de ~60 Hz.
  board2.setPWMFreq(60);
 // yield();
}

 // el código dentro de loop() ha sido actualizado por 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 control de servo de 16 canales
  delay(100);

}

/*
 * angleToPulse(int ang)
 * obtiene el ángulo en grados y devuelve el ancho del pulso
 * también imprime el valor en el monitor serie
 * escrito por Ahmad Shamshiri para Robojax, Robojax.com
 */
int angleToPulse(int ang){
   int pulse = map(ang,0, 180, SERVOMIN,SERVOMAX); // mapear un ángulo de 0 a 180 a Servo min y 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)