Código de búsqueda

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-PCA9685 video V1: Arduino Code to control 16 servo motor, Basic
Idioma: C++
/*
 * Original source: https://github.com/adafruit/Adafruit-PWM-Servo-Driver-Library
 * This is the Arduino code for the PCA9685 16-channel servo controller.
 * Watch the video for details and demo: http://youtu.be/y8X9X10Tn1k
 *  get code and wiring diagram from http://robojax.com/RTJ27
 
 * Watch the video for this code: 
 * 
 * Related Videos:
V5 video of PCA9685 32 Servo with ESP32 with WiFi: https://youtu.be/bvqfv-FrrLM
V4 video of PCA9685 32 Servo with ESP32 (no WiFi): https://youtu.be/JFdXB8Za5Os
V3 video of PCA9685: how to control 32 servo motors: https://youtu.be/6P21wG7N6t4
V2 Video of PCA9685: 3 different ways to control servo motors: https://youtu.be/bal2STaoQ1M
V1 Video introduction to PCA9685 to control 16 servos: https://youtu.be/y8X9X10Tn1k

 * Written by Ahmad Shamshiri for Robojax Video channel: www.Robojax.com
 * Date: December 16, 2017, in Ajax, Ontario, Canada
 * Permission granted to share this code, given that this
 * note is kept with the code.
 * Disclaimer: This code is "AS IS" and for educational purposes only.
 * This code has been downloaded from https://robojax.com
 * 
 */
/*************************************************** 
  This is an example for our Adafruit 16-channel PWM & Servo driver.
  Servo test - this will drive 16 servos, one after the other.

  Pick one up today in the Adafruit shop!
  ------> http://www.adafruit.com/products/815

  These displays use I2C to communicate; 2 pins are required to  
  interface. For Arduino UNOs, that's SCL -> Analog 5, SDA -> Analog 4.

  Adafruit invests time and resources providing this open source code, 
  please support Adafruit and open-source hardware by purchasing 
  products from Adafruit!

  Written by Limor Fried/Ladyada for Adafruit Industries.  
  BSD license, all text above must be included in any redistribution.
 ****************************************************/

#include <Wire.h>
#include <Adafruit_PWMServoDriver.h>

// called this way, it uses the default address 0x40
Adafruit_PWMServoDriver pwm = Adafruit_PWMServoDriver();
// you can also call it with a different address you want
//Adafruit_PWMServoDriver pwm = 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!
#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)

// our servo # counter
uint8_t servonum = 0;

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

  pwm.begin();
  
  pwm.setPWMFreq(60);  // Analog servos run at ~60 Hz updates

  //yield();
}

// the code inside loop() has been updated by Robojax
void loop() {


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

  delay(1000);
 
}

/*
 * angleToPulse(int ang)
 * gets angle in degrees and returns the pulse width.
 * Also prints the value on the serial 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;
}
37-PCA9685 video V1: Arduino Code with mapping PWM
Idioma: C++
/*
 * Fuente 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.
 * Mira el video para más detalles y demostración: http://youtu.be/y8X9X10Tn1k
 * 
 * Escrito por Ahmad Nejrabi para el canal de video Robojax: www.Robojax.com
 * Fecha: 15 de diciembre de 2017, en Ajax, Ontario, Canadá
 * Se otorga permiso para compartir este código, siempre que esta
 * nota se mantenga con el código.
 * Descargo de responsabilidad: Este código es "EN EL ESTADO EN QUE SE ENCUENTRA" y solo para fines educativos.
 * 
 * /
 * /***************************************************
 * Este es un ejemplo para nuestro controlador PWM y de servos de 16 canales de Adafruit.
 * Prueba de servos - esto manejara 16 servos, uno tras otro.
 * 
 * ¡Consigue uno hoy en la tienda de Adafruit!
 * ------> http://www.adafruit.com/products/815
 * 
 * Estos displays usan I2C para comunicarse; se requieren 2 pines para
 * interfaz. Para Arduino UNOs, eso es SCL -> Analógico 5, SDA -> Analógico 4.
 * 
 * Adafruit invierte tiempo y recursos proporcionando este código de código abierto,
 * por favor apoya a Adafruit y al hardware de código abierto comprando
 * productos de Adafruit.
 * 
 * Escrito por Limor Fried/Ladyada para Adafruit Industries.
 * Licencia BSD, todo el texto anterior debe ser incluido en cualquier redistribución.
 */
#include <Wire.h>
#include <Adafruit_PWMServoDriver.h>

 // llamado de esta manera, utiliza la dirección predeterminada 0x40
Adafruit_PWMServoDriver pwm = Adafruit_PWMServoDriver();
 // también puedes llamarlo con una dirección diferente que desees
 // Adafruit_PWMServoDriver pwm = Adafruit_PWMServoDriver(0x41);

 // Dependiendo de la marca de tu servo, el ancho de pulso mínimo y máximo puede variar; tú
 // quiero que estos sean lo más pequeños/grandes posible sin llegar al límite máximo
 // para el rango máximo. Tendrás que ajustarlos según sea necesario para coincidir con los servos que
 // ¡tengan!
#define SERVOMIN  125 // este es el conteo de longitud de pulso 'mínimo' (de 4096)
#define SERVOMAX  575 // este es el conteo de longitud de pulso 'máximo' (de un total de 4096)

 // nuestro servo # contador
uint8_t servonum = 0;

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

  pwm.begin();

  pwm.setPWMFreq(60); // Los servos analógicos funcionan con actualizaciones de ~60 Hz.

 // yield();
}

 // el código dentro de loop() ha sido actualizado por Robojax
void loop() {

    pwm.setPWM(0, 0, 125 );
	delay(500);
    pwm.setPWM(0, 0, 255 );
	delay(500);
    pwm.setPWM(0, 0, 450 );
	delay(500);
    pwm.setPWM(0, 0, 575 );
	delay(500);


}

Cosas que podrías necesitar

Recursos y referencias

Aún no hay recursos.

Archivos📁

Bibliotecas de Arduino (zip)