Ce tutoriel fait partie de: servomoteurs
Vous trouverez ici une liste de toutes les vidéos relatives aux servomoteurs. D'autres liens vers ces vidéos sont disponibles plus bas.
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.

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
| Fabricant | NXP Semiconductor |
|---|---|
| Numéro de pièce | PCA9685 |
| Tension logique/E/S | 3,3 V à 5,5 V |
| Tension d'alimentation | 2.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 PWM | 24 Hz à 1,6 kHz |
| Seuils logiques d'entrée | 0,3 V (bas) / 0,7 V (haut) |
| Chute de tension / RDS(on)/ saturation | 0,5 V max |
| Limites thermiques | de -40 °C à 125 °C |
| Paquet | HTSSOP-28 |
| Notes / variantes | Contrô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

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
Ce tutoriel fait partie de: servomoteurs
- Contrôler un servomoteur avec des boutons-poussoirs à l'aide d'un Arduino
- Control a Servo Motor with a Push Button: Move Servo and Return SPB-1
- Control a Servo Motor with a Push Button: Move Servo in One Direction SPB-2
- Controlling a Servo Motor with a Push Button: Move Servo While Button Is Pressed (SPB-3)
- Contrôler un servomoteur avec un potentiomètre à l'aide d'un Arduino
- Contrôler un servomoteur avec un potentiomètre et un écran LCD1602 à l'aide d'un Arduino
- Contrôler des servomoteurs à l'aide d'une télécommande infrarouge avec Arduino
- Contrôle de moteur servo Arduino à l'aide d'un potentiomètre
- Contrôle de la position du servo avec des gestes de la main pour Arduino
- Controlling Two or More Servos with Potentiometers Using an Arduino
- How to Control a 360° Servo with Three Push-Button Switches
- How to Use Continuous 360° Servo with Arduino
- Build an Arduino Servo Toggle Switch with a Push Button
/*
* 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;
}
/*
* 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
-
AmazonAcheter le PCA9685 sur Amazonamzn.to
-
eBayAchetez le PCA9685 sur eBayebay.us
-
AliExpressAcheter PCA9685 sur AliExpresss.click.aliexpress.com
-
BanggoodAcheter PCA9685 sur Bangoodbanggood.com
Ressources et références
Aucune ressource pour le moment.
Fichiers📁
Bibliothèques Arduino (zip)
-
Adafruit-PWM-Servo-Driver-Library-master
Adafruit-PWM-Servo-Driver-Library-master.zip0.02 MB