✅ Chip Principal: PCA9685
✅ Canales de Control: 16 (PWM)
✅ Protocolo de Comunicación: I2C (2 pines)
✅ Voltaje de Operación: 3.3V y 5V
✅ Frecuencia de PWM: Ajustable
✅ Aplicaciones: Control de servomotores, robots, iluminación LED, brazos robóticos
✅ Compatibilidad: Arduino, Raspberry Pi, ESP32, STM32
El módulo PCA9685 es un driver de control PWM (Modulación por Ancho de Pulso) diseñado para resolver el problema de la falta de pines PWM en microcontroladores como Arduino. Con este módulo, puedes controlar hasta 16 servomotores o LEDs de manera simultánea y precisa utilizando solo dos pines de tu placa (SDA y SCL) gracias al protocolo de comunicación I2C. Esto te permite liberar los pines de tu microcontrolador para otras funciones.
Este módulo es una solución imprescindible para proyectos de robótica, brazos robóticos, o cualquier aplicación que requiera controlar múltiples servos o la intensidad de múltiples LEDs. El chip PCA9685 genera señales PWM de alta resolución (12 bits), lo que se traduce en un movimiento suave y preciso de los servos. Además, es completamente compatible con microcontroladores de 5V y 3.3V, lo que lo hace muy versátil.
Beneficios destacados:
Para conectar el módulo PCA9685 a Arduino, solo hay que seguir estos pasos:
- Conectar el pin VCC del módulo al pin 5V de Arduino.
- Conectar el pin GND del módulo al pin GND de Arduino.
- Conectar el pin SDA del módulo al pin A4 de Arduino (o al pin correspondiente al bus I2C en otros modelos de Arduino).
- Conectar el pin SCL del módulo al pin A5 de Arduino (o al pin correspondiente al bus I2C en otros modelos de Arduino).
- Conectar el pin OE del módulo a tierra si no se va a usar, o a un pin digital de Arduino si se quiere controlar la habilitación de las salidas PWM.
- Conectar los servos a las salidas PWM del módulo, teniendo en cuenta que el cable rojo es el positivo, el cable negro es el negativo y el cable blanco o amarillo es la señal. El positivo y el negativo de los servos se pueden conectar al mismo VCC y GND del módulo, o a una fuente de alimentación externa si se requiere más corriente.
Para programar el módulo PCA9685 para mover los servos con Arduino, hay que seguir estos pasos:
- Instalar la librería Adafruit_PWMServoDriver, que se puede descargar desde este enlace: https://github.com/adafruit/Adafruit-PWM-Servo-Driver-Library
- Incluir la librería en el código con la instrucción #include <Adafruit_PWMServoDriver.h>
- Crear un objeto de la clase Adafruit_PWMServoDriver con la dirección I2C del módulo, que por defecto es 0x40, pero que se puede cambiar mediante los pines A0-A5 del módulo. Por ejemplo: Adafruit_PWMServoDriver pwm = Adafruit_PWMServoDriver(0x40);
- Inicializar el objeto con la instrucción pwm.begin(), que establece la comunicación I2C y configura el oscilador interno del módulo.
- Establecer la frecuencia de las señales PWM con la instrucción pwm.setPWMFreq(frecuencia), donde frecuencia es un valor entre 24 y 1526. Por ejemplo: pwm.setPWMFreq(50); para una frecuencia de 50 Hz, que es la más común para los servos.
- Mover los servos con la instrucción pwm.setPWM(canal, on, off), donde canal es un valor entre 0 y 15 que indica la salida PWM a la que está conectado el servo, on es un valor entre 0 y 4095 que indica el momento en el que se activa el pulso, y off es un valor entre 0 y 4095 que indica el momento en el que se desactiva el pulso. Por ejemplo: pwm.setPWM(0, 0, 150); para mover el servo del canal 0 a un ángulo de unos 45 grados.
A continuación se muestra un ejemplo de código que mueve dos servos conectados a los canales 0 y 1 del módulo PCA9685 con Arduino:
#include <Adafruit_PWMServoDriver.h> // Crea un objeto de la clase Adafruit_PWMServoDriver con la dirección I2C del módulo Adafruit_PWMServoDriver pwm = Adafruit_PWMServoDriver(0x40); // Define los valores de on y off para los ángulos de los servos #define SERVOMIN 150 // Valor mínimo para un ángulo de 0 grados #define SERVOMAX 600 // Valor máximo para un ángulo de 180 grados void setup() { // Inicializa el objeto pwm pwm.begin(); // Establece la frecuencia de las señales PWM a 50 Hz pwm.setPWMFreq(50); } void loop() { // Mueve el servo del canal 0 a un ángulo de 90 grados pwm.setPWM(0, 0, (SERVOMIN + SERVOMAX) / 2); // Mueve el servo del canal 1 a un ángulo de 45 grados pwm.setPWM(1, 0, (SERVOMIN + (SERVOMIN + SERVOMAX) / 2) / 2); // Espera un segundo delay(1000); // Mueve el servo del canal 0 a un ángulo de 180 grados pwm.setPWM(0, 0, SERVOMAX); // Mueve el servo del canal 1 a un ángulo de 135 grados pwm.setPWM(1, 0, ((SERVOMIN + SERVOMAX) / 2 + SERVOMAX) / 2); // Espera un segundo delay(1000); }