Code de recherche

Code Arduino et vidéo pour le contrôleur de servomoteurs PCA9685 16 canaux 12 bits V1

Code Arduino et vidéo pour le contrôleur de servomoteurs PCA9685 16 canaux 12 bits V1

Dans ce tutoriel, nous allons explorer comment utiliser le contrôleur de servomoteurs PCA9685 16 canaux 12 bits de NXP Semiconductor. Ce module vous permet de contrôler jusqu'à 16 servomoteurs ou d'atténuer un banc de LED avec précision grâce à la modulation de largeur d'impulsion (PWM). À la fin de ce tutoriel, vous disposerez d'une configuration fonctionnelle capable de contrôler plusieurs servomoteurs individuellement ou simultanément.

PCA9685 module-0

Pour clarifier davantage le contenu du tutoriel, je vous encourage à regarder la vidéo d'accompagnement (dans la vidéo à 00:00) pour une démonstration visuelle de la configuration et du processus de codage.

Le matériel expliqué

Le module PCA9685 est une carte compacte qui peut contrôler plusieurs servomoteurs via la communication I2C. Il dispose de 16 canaux, permettant de connecter jusqu'à 16 servomoteurs, chacun disposant de son propre signal de commande. Le module fonctionne sous une alimentation de 5 V et est conçu pour gérer des signaux PWM, essentiels pour contrôler avec précision la position des servomoteurs.

La carte comprend des broches dédiées pour l'alimentation (VCC), la masse (GND) et la communication (SDA et SCL). La broche SDA est utilisée pour la transmission des données, tandis que la broche SCL est le signal d'horloge, toutes deux se connectant respectivement aux broches analogiques A4 et A5 de l'Arduino. Cette configuration assure une communication fiable entre l'Arduino et le module PCA9685.

Détails de la fiche technique

FabricantNXP Semiconductor
Numéro de piècePCA9685
Tension logique/E/S3,3 V à 5,5 V
Tension d'alimentation2.3 V à 5.5 V
Courant de sortie (par canal)25 mA maximum
Courant de crête (par canal)100 mA max.
Directives de fréquence PWM24 Hz à 1,6 kHz
Seuils logiques d'entrée0,3 V (bas) / 0,7 V (haut)
Chute de tension / RDS(on)/ saturation0,5 V max
Limites thermiquesde -40 °C à 125 °C
PaquetHTSSOP-28
Notes / variantesContrôleur PWM à 16 canaux

  • Assurez-vous d'une alimentation 5 V avec un courant suffisant (1 A recommandé).
  • Ne alimentez pas les servos directement depuis l'Arduino afin d'éviter tout dommage.
  • Utilisez les broches I2C correctes : SDA sur A4 et SCL sur A5.
  • Ajustez les valeurs de largeur d'impulsion en fonction de vos servomoteurs.
  • Vérifiez le câblage pour la polarité correcte : GND, VCC et le signal.
  • Prévoyez un dissipateur thermique pour les applications à fort courant.

Instructions de câblage

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

Pour câbler le PCA9685 à votre Arduino, commencez par connecter l'alimentation et la masse. Connectez la broche VCC du PCA9685 à la sortie 5V de l'Arduino. Ensuite, connectez la broche GND du PCA9685 à la masse (GND) de l'Arduino. Enfin, connectez la broche SDA du PCA9685 à la broche A4 de l'Arduino et la broche SCL à la broche A5.

Pour les servos, connectez le fil de signal au canal correspondant sur le PCA9685 (par ex. CH0 pour le premier servo), le fil d'alimentation à une alimentation séparée (car les servos peuvent nécessiter plus de courant que ce que l'Arduino peut fournir), et le fil de masse au point de masse commun partagé avec le PCA9685. Assurez-vous que les fils de signal, d'alimentation et de masse sont correctement connectés afin d'éviter d'endommager vos composants.

Exemples de code et guide pas à pas

Dans la section d'initialisation du code, nous initialisons le module PCA9685 avecpwm.begin()et régler la fréquence PWM avecpwm.setPWMFreq(60);. Cela définit la fréquence de communication des servomoteurs.

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

Dans la boucle, nous contrôlons les servomoteurs en réglant les valeurs PWM correspondant aux angles souhaités. La fonctionangleToPulse(int ang)associe l'angle à la largeur d'impulsion appropriée, ce qui est essentiel pour un positionnement précis du servomoteur.

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

Enfin, la fonctionangleToPulse(int ang)convertit l'angle en largeur d'impulsion en utilisant les longueurs d'impulsion minimales et maximales définies. Cela vous permet de contrôler facilement la position du servomoteur en fonction de l'angle que vous souhaitez atteindre.

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;
}

Démonstration / À quoi s'attendre

Une fois que tout est correctement câblé et que le code est téléversé, vous devriez voir le servo parcourir les angles spécifiés par pas de 20 degrés. Si le servo ne se comporte pas comme prévu, vérifiez le câblage pour vous assurer que les connexions sont correctes et que l'alimentation est adéquate (dans la vidéo à 12:30).

Horodatages vidéo

  • 00:00- Introduction au PCA9685
  • 02:30- Instructions de câblage
  • 05:00- Revue de code
  • 10:15- Démonstration du contrôle d'un servomoteur
  • 12:30- Dépannage des problèmes courants

Images

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
Langue: 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
Langue: C++
/*
 * Source original : https://github.com/adafruit/Adafruit-PWM-Servo-Driver-Library  
 * Voici le code Arduino pour le contrôleur de servos PCA9685 à 16 canaux.  
 * Regardez la vidéo pour des détails et une démo : http://youtu.be/y8X9X10Tn1k  
 * 
 * Écrit par Ahmad Nejrabi pour la chaîne vidéo Robojax : www.Robojax.com  
 * Date : 15 décembre 2017, à Ajax, Ontario, Canada  
 * Permission accordée pour partager ce code, à condition que cette  
 * note soit conservée avec le code.  
 * Avertissement : Ce code est "EN L'ÉTAT" et uniquement à des fins éducatives.  
 * 
 * /  
 * /***************************************************  
 * Ceci est un exemple pour notre pilote PWM et Servo à 16 canaux Adafruit.  
 * Test de servo - ceci va piloter 16 servos, un après l'autre.  
 * 
 * Prenez-en un aujourd'hui dans la boutique Adafruit !  
 * ------> http://www.adafruit.com/products/815  
 * 
 * Ces affichages utilisent I2C pour communiquer ; 2 broches sont requises pour  
 * l'interface. Pour les Arduino UNOs, cela correspond à SCL -> Analog 5, SDA -> Analog 4.  
 * 
 * Adafruit investit du temps et des ressources pour fournir ce code open source,  
 * veuillez soutenir Adafruit et le matériel open-source en achetant  
 * des produits d'Adafruit !  
 * 
 * Écrit par Limor Fried/Ladyada pour Adafruit Industries.  
 * Licence BSD, tout le texte ci-dessus doit être inclus dans toute redistribution
 */
#include <Wire.h>
#include <Adafruit_PWMServoDriver.h>

 // appelée de cette manière, elle utilise l'adresse par défaut 0x40
Adafruit_PWMServoDriver pwm = Adafruit_PWMServoDriver();
 // vous pouvez également l'appeler avec une autre adresse que vous souhaitez
 //  Adafruit_PWMServoDriver pwm = Adafruit_PWMServoDriver(0x41);

 // Selon la marque de votre servo, la largeur d'impulsion minimale et maximale peut varier ; vous
 // je veux que ceux-ci soient aussi petits/grands que possible sans atteindre la limite stricte
 // pour une portée maximale. Vous devrez les ajuster si nécessaire pour correspondre aux servos que vous
 // avoir !
#define SERVOMIN  125 // c'est le compte de longueur d'impulsion 'minimum' (sur 4096)
#define SERVOMAX  575 // c'est le nombre de longueurs d'impulsions 'maximum' (sur 4096)

 // notre servo # compteur
uint8_t servonum = 0;

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

  pwm.begin();

  pwm.setPWMFreq(60); // Les servos analogiques fonctionnent avec des mises à jour d'environ 60 Hz.

 // yield();
}

 // le code à l'intérieur de loop() a été mis à jour par 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);


}

Ce dont vous pourriez avoir besoin

Ressources et références

Aucune ressource pour le moment.

Fichiers📁

Bibliothèques Arduino (zip)