Este tutorial es parte de: Control de 16 o 32 servomotores con PCA9685
Esta colección de tutoriales con video te ayuda a controlar 32 o más servomotores con Arduino UNO, Nano, Mini o ESP32. Se proporcionan todos los códigos.
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.

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

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.
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).
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
Este tutorial es parte de: Control de 16 o 32 servomotores con PCA9685
- Código y vídeo de Arduino para el controlador de servos PCA9685 de 16 canales y 12 bits V1
- Controla 16 servomotores utilizando un módulo PCA9685 y un sketch de Arduino V2 #1: Uno por uno.
- Controlando 16 Servomotores utilizando un módulo PCA9685 y el sketch de Arduino V2: Control individual de servos.
- Controlling 16 Servo Motors Using a PCA9685 Module and Arduino V2 Sketch #3: All Servos Together
- Controlando un motor servo de 32 utilizando un módulo PCA9685 y el sketch de Arduino V3 #1: Todos los servos juntos
- Controla 32 servos por Wi-Fi utilizando ESP32 y PCA9685 a través de escritorio o teléfono móvil V5
/*
* 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
-
AmazonasCompra PCA9685 en Amazonamzn.to
-
eBayCompra PCA9685 en eBayebay.us
-
AliExpressCompra PCA9685 en AliExpresss.click.aliexpress.com
-
BanggoodComprar PCA9685 en Banggoodbanggood.com
Recursos y referencias
Aún no hay recursos.
Archivos📁
Bibliotecas de Arduino (zip)
-
Adafruit-PWM-Servo-Driver-Library-master
Adafruit-PWM-Servo-Driver-Library-master.zip0.02 MB