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
/*
* 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
-
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