Código y vídeo de Arduino para el controlador de servos PCA9685 de 16 canales y 12 bits V1

Código y vídeo de Arduino para el controlador de servos PCA9685 de 16 canales y 12 bits V1

En este tutorial exploraremos cómo usar el controlador de servos PCA9685 de 16 canales y 12 bits de NXP Semiconductor. Este módulo permite controlar hasta 16 servos o atenuar un banco de LED con precisión mediante modulación por ancho de pulso (PWM). Al final de este tutorial, tendrás una configuración funcional que podrá controlar múltiples servos de forma individual o simultánea.

PCA9685 module-0

Para aclarar aún más el contenido del tutorial, te animo a ver el video adjunto (en el video a las 00:00) para una demostración visual del proceso de configuración y de codificación.

Hardware explicado

El módulo PCA9685 es una placa compacta que puede controlar múltiples servos mediante comunicación I2C. Cuenta con 16 canales, lo que le permite conectar hasta 16 servos, cada uno con su propia señal de control. El módulo funciona con una alimentación de 5V y está diseñado para manejar señales PWM, que son esenciales para controlar con precisión la posición de los servos.

La placa incluye pines dedicados para alimentación (VCC), tierra (GND) y comunicación (SDA y SCL). El pin SDA se utiliza para la transmisión de datos, mientras que el pin SCL es la señal de reloj, ambos se conectan a los pines analógicos A4 y A5 del Arduino, respectivamente. Esta configuración garantiza una comunicación fiable entre el Arduino y el módulo PCA9685.

Detalles de la ficha técnica

FabricanteNXP Semiconductor
Número de piezaPCA9685
Tensión lógica/E/S3.3 V a 5.5 V
Tensión de alimentación2.3 V a 5.5 V
Corriente de salida (por canal)25 mA máx.
Corriente de pico (por canal)100 mA máx.
Guía de frecuencia PWM24 Hz a 1.6 kHz
Umbrales lógicos de entrada0.3 V (bajo) / 0.7 V (alto)
Caída de tensión / RDS(en conducción) / saturación0.5 V máx.
Límites térmicos-40 °C a 125 °C
PaqueteHTSSOP-28
Notas / variantesControlador PWM de 16 canales

  • Asegúrese de contar con una fuente de alimentación de 5V con corriente suficiente (se recomienda 1A).
  • No alimente los servos directamente desde el Arduino para evitar daños.
  • Utiliza los pines I2C correctos: SDA en A4 y SCL en A5.
  • Ajuste los valores de ancho de pulso según sus servos específicos.
  • Compruebe el cableado para la polaridad correcta: GND, VCC y la señal.
  • Considere el uso de disipadores para aplicaciones de alta corriente.

Instrucciones de cableado

Arduino wiring for PCA9685 to control 16 servo motors
Arduino wiring for PCA9685 to control 16 servo motors

Para cablear el PCA9685 a tu Arduino, empieza conectando la alimentación y la masa. Conecta el pin VCC del PCA9685 a la salida de 5V del Arduino. Luego conecta el pin GND del PCA9685 al GND del Arduino. A continuación, conecta el pin SDA del PCA9685 al pin A4 del Arduino y el pin SCL al pin A5.

Para los servos, conecte el cable de señal al canal correspondiente en el PCA9685 (p. ej., CH0 para el primer servo), el cable de alimentación a una fuente de alimentación separada (ya que los servos pueden requerir más corriente de la que el Arduino puede suministrar) y el cable de tierra a la masa común compartida con el PCA9685. Asegúrese de que los cables de señal, alimentación y tierra estén correctamente alineados para evitar dañar sus componentes.

Ejemplos de código y guía paso a paso

En la sección de configuración del código, inicializamos el módulo PCA9685 conpwm.begin()y establecer la frecuencia PWM conpwm.setPWMFreq(60);. Esto establece la frecuencia de comunicación para los servos.

void setup() {
  Serial.begin(9600);
  Serial.println("16 channel Servo test!");
  pwm.begin();
  pwm.setPWMFreq(60);  // Analog servos run at ~60 Hz updates
}

Dentro del bucle, controlamos los servos ajustando los valores PWM correspondientes a los ángulos deseados. La funciónangleToPulse(int ang)mapea el ángulo al ancho de pulso apropiado, lo cual es esencial para el posicionamiento preciso del servo.

void loop() {
  for( int angle =0; angle<181; angle +=20){
    delay(500);
    pwm.setPWM(0, 0, angleToPulse(angle) );
  }
}

Finalmente, la funciónangleToPulse(int ang)Convierte el ángulo en ancho de pulso utilizando las longitudes de pulso mínimas y máximas definidas. Esto le permite controlar fácilmente la posición del servo en función del ángulo que desea alcanzar.

int angleToPulse(int ang){
   int pulse = map(ang,0, 180, SERVOMIN,SERVOMAX);
   Serial.print("Angle: ");Serial.print(ang);
   Serial.print(" pulse: ");Serial.println(pulse);
   return pulse;
}

Demostración / Qué esperar

Una vez que todo esté cableado correctamente y el código cargado, deberías ver el servo moviéndose a través de los ángulos especificados en incrementos de 20 grados. Si el servo no se comporta como se espera, revisa el cableado para comprobar las conexiones correctas y asegúrate de que la fuente de alimentación sea adecuada (en el video a las 12:30).

Marcas de tiempo del vídeo

  • 00:00- Introducción al PCA9685
  • 02:30- Instrucciones de cableado
  • 05:00- Recorrido del código
  • 10:15- Demostración del control del servomotor
  • 12:30- Solución de problemas comunes

Imágenes

PCA9685 module-0
PCA9685 module-0
PCA9685 module-1
PCA9685 module-1
PCA9685 module-2
PCA9685 module-2
PCA9685 module-3
PCA9685 module-3
PCA9685 module
PCA9685 module
Arduino wiring for PCA9685 to control 16 servo motors
Arduino wiring for PCA9685 to control 16 servo motors
36-Resources for this sketch
Idioma: C++
37-PCA6985 16-channel 12-bit servo controller, simple code
Idioma: C++
¡Copiado!

Recursos y referencias

Aún no hay recursos.

Archivos📁

No hay archivos disponibles.