Ce tutoriel fait partie de: Commande de 16 ou 32 servomoteurs avec PCA9685
Cette collection de tutoriels vidéo vous aide à contrôler 32 servomoteurs ou plus à l'aide d'Arduino UNO, Nano, Mini ou ESP32. Tous les codes sont fournis.
Contrôler un moteur servo 32 à l'aide d'un module PCA9685 et d'un ESP32 V4
Dans ce tutoriel, vous apprendrez à contrôler jusqu'à 32 servomoteurs en utilisant un microcontrôleur ESP32 connecté à un module PCA9685. Cela est particulièrement utile pour des projets nécessitant le fonctionnement simultané de plusieurs servomoteurs sans utiliser le Wi-Fi. Le résultat sera une configuration entièrement fonctionnelle où vous pourrez manipuler la position de chaque servomoteur individuellement.

Ce tutoriel vous guidera à travers les composants matériels nécessaires, les instructions de câblage et un aperçu du code requis pour réaliser ce contrôle. Pour une démonstration détaillée, envisagez de regarder la vidéo associée (dans la vidéo à 00:00).
Matériel expliqué
Les composants principaux utilisés dans ce projet sont le microcontrôleur ESP32 et le module de pilote PWM PCA9685. L'ESP32 sert de contrôleur principal qui envoie des signaux au module PCA9685, qui à son tour contrôle les moteurs servo. Le PCA9685 peut gérer jusqu'à 16 moteurs servo par module, permettant ainsi la connexion de deux modules pour contrôler un total de 32 servos.
Le module PCA9685 fonctionne à l'aide de la communication I2C, ce qui signifie qu'il a deux fils principaux pour le transfert de données : SDA (ligne de données) et SCL (ligne d'horloge). Il nécessite également une alimentation pour faire fonctionner les servomoteurs, généralement à 5V. L'ESP32 agit comme le dispositif maître, fournissant les signaux de contrôle nécessaires aux modules esclaves PCA9685.
Détails de la fiche technique
| Fabricant | Adafruit |
|---|---|
| Numéro de pièce | PCA9685 |
| Tension logique/IO | 3,3 V à 5,5 V |
| Tension d'alimentation | 5 V |
| Courant de sortie (par canal) | ~20 mA |
| Courant de pointe (par canal) | ~25 mA |
| Guide de fréquence PWM | 60 Hz |
| Seuils logiques d'entrée | 0,3*VDD(bas), 0,7*VDD(élevé) |
| Chute de tension / RDS(on)/ saturation | 0,5 V max |
| Limites thermiques | 125 °C |
| Paquet | HTSSOP-28 |
| Remarques / variantes | Contrôleur PWM à 16 canaux |
- Utilisez une alimentation externe pour les servos (5V, 2A recommandé).
- Assurez un bon raccordement entre l'ESP32 et le PCA9685.
- Vérifiez les paramètres de fréquence PWM pour un performance optimale des servos.
- Ajustez les limites de largeur d'impulsion en fonction des spécifications du servo.
- Faites attention à la consommation de courant lorsque plusieurs servo-moteurs sont actifs.
Instructions de câblage

Pour câbler le PCA9685 à l'ESP32, commencez par connecter l'alimentation et la masse. Connectez le VCCconnectez la broche du PCA9685 à une source d'alimentation de 5V et connectez la broche GND à l'une des broches GND de l'ESP32. Cela garantit que le module et l'ESP32 partagent une masse commune.
Ensuite, pour la communication I2C, connectez la pin SDA sur le PCA9685 à la GPIO 21 sur l'ESP32 et la pin SCL à la GPIO 22. Cette configuration permet à l'ESP32 de communiquer correctement avec le module PCA9685. Assurez-vous d'utiliser des fils courts pour éviter le bruit dans les lignes de communication, surtout si vous travaillez avec plusieurs servos.
Comme indiqué dans l'image ci-dessus, pour la carte PCA9685 2 (à gauche), assurez-vous de souder ce chemin pour définir l'adresse I2C afin qu'elle soit différente de la carte 1 (à droite).
Exemples de code et guide étape par étape
Le code initialise les modules PCA9685 et définit la fréquence PWM. Les identifiants clés dans le code incluentboard1etboard2, qui représentent les deux modules PCA9685 connectés à l'ESP32. Lesetup()la fonction initialise le moniteur série et définit la fréquence PWM pour les deux cartes.
void setup() {
Serial.begin(9600);
Serial.println("32 channel Servo test!");
board1.begin();
board2.begin();
board1.setPWMFreq(60); // Analog servos run at ~60 Hz updates
board2.setPWMFreq(60);
}Cet extrait montre le processus de configuration, où la communication série est initialisée et la fréquence PWM est réglée pour les pilotes de servo. LesetPWMFreq(60)la fonction garantit que les servos reçoivent la fréquence correcte pour un fonctionnement fluide.
Dans la boucle, une boucle for parcourt les angles de 0 à 180 degrés, envoyant des commandes de largeur d'impulsion aux servos connectés aux deux cartes PCA9685. La fonctionangleToPulseconvertit l'angle en largeur d'impulsion correspondante.
void loop() {
for(int angle = 0; angle < 181; angle += 10) {
for(int i = 0; i < 16; i++) {
board2.setPWM(i, 0, angleToPulse(angle));
board1.setPWM(i, 0, angleToPulse(angle));
}
}
delay(100);
}Ce code extrait montre comment les servomoteurs sont contrôlés dans une boucle. L'angle du servomoteur augmente de 10 degrés, et lesetPWMLa fonction est appelée pour les deux cartes afin de déplacer les servos à l'angle spécifié. Le délai permet une courte pause entre les mouvements.
Démonstration / Ce à quoi s'attendre
Une fois le câblage terminé et le code téléchargé, vous devriez voir les servos se déplacer par incréments de 0 à 180 degrés. Cela se produira pour les 32 servos connectés aux deux modules PCA9685 simultanément. Si un servo ne répond pas, vérifiez l'alimentation et assurez-vous que toutes les connexions sont sécurisées (dans la vidéo à 12:30).
Horodatages vidéo
- 00:00 Début
- 00:36 Introduction
- 04:01 Explication du câblage (uniquement pour l'ESP32)
- 06:26 Préparation de l'IDE Arduino pour l'ESP32
- 08:34 Code expliqué
- 13:40 Démonstration du fonctionnement de 32 moteurs servo
Ce tutoriel fait partie de: Commande de 16 ou 32 servomoteurs avec PCA9685
- Code Arduino et vidéo pour le contrôleur de servomoteurs PCA9685 16 canaux 12 bits V1
- Contrôlez 16 servomoteurs à l'aide d'un module PCA9685 et du croquis Arduino V2 #1 : Un par un
- Contrôler 16 moteurs servo à l'aide d'un module PCA9685 et d'un croquis Arduino V2 : Contrôle individuel des servos
- Controlling 16 Servo Motors Using a PCA9685 Module and Arduino V2 Sketch #3: All Servos Together
- Contrôler un moteur servo 32 en utilisant un module PCA9685 et un croquis Arduino V3 #1 : Tous les servos ensemble
- Contrôlez 32 servomoteurs via Wi-Fi en utilisant ESP32 et PCA9685 depuis un ordinateur de bureau ou un téléphone mobile V5
/*
* Source de la bibliothèque originale : https://github.com/adafruit/Adafruit-PWM-Servo-Driver-Library
*
* Voici le code Arduino pour le contrôleur de servo PCA6985 à 16 canaux pour contrôler 32 moteurs servo avec une carte ESP32 sans WiFi.
*
* Obtenez ce code et ce câblage pour cette vidéo : http://robojax.com/RJT268
*
* Voici la vidéo V4 sur le PCA9685 : https://youtu.be/JFdXB8Za5Os
*
* Regardez la vidéo pour les détails (V1) et la démonstration http://youtu.be/y8X9X10Tn1k
*
* Écrit/mis à jour par Ahmad Shamshiri pour la chaîne vidéo Robojax www.Robojax.com
* Date : 15 décembre 2019, à Ajax, Ontario, Canada
*
* Avertissement : ce code est "EN L'ÉTAT" et à des fins éducatives uniquement.
*
* ou faites un don en utilisant PayPal http://robojax.com/L/?id=64
*
* Ce code est "EN L'ÉTAT" sans garantie ni responsabilité. Libre d'utilisation tant que vous gardez cette note intacte.
* Ce code a été téléchargé depuis Robojax.com
* Ce programme est un logiciel libre : vous pouvez le redistribuer et/ou le modifier
* sous les termes de la GNU General Public License telle que publiée par
* la Free Software Foundation, soit la version 3 de la licence, ou
* (selon votre choix) toute version ultérieure.
*
* Ce programme est distribué dans l'espoir qu'il sera utile,
* mais SANS AUCUNE GARANTIE ; même sans la garantie implicite de
* QUALITÉ MARCHANDE ou D'ADÉQUATION À UN OBJECTIF PARTICULIER. Voir la
* GNU General Public License pour plus de détails.
*
* Vous devriez avoir reçu une copie de la GNU General Public License
* avec ce programme. Si ce n'est pas le cas, voir <https://www.gnu.org/licenses/>.
*/
#include <Wire.h>
#include <Adafruit_PWMServoDriver.h>
// appelée de cette manière, elle utilise l'adresse par défaut 0x40
Adafruit_PWMServoDriver board1 = Adafruit_PWMServoDriver(0x40);
Adafruit_PWMServoDriver board2 = Adafruit_PWMServoDriver(0x41);
// En fonction de la marque de votre servo, la largeur d'impulsion min et max peut varier, vous
// je veux que ceux-ci soient aussi petits/grands que possible sans atteindre l'arrêt brutal
// pour la portée maximale. Vous devrez les ajuster si nécessaire pour correspondre aux servos que vous
// avoir!
// Regardez la vidéo V1 pour comprendre les deux lignes ci-dessous : http://youtu.be/y8X9X10Tn1k
#define SERVOMIN 125 // c'est le nombre de longueur de pulsation 'minimum' (sur 4096)
#define SERVOMAX 575 // il s'agit du nombre maximum de longueurs d'impulsion (sur 4096)
int servoNumber = 0;
void setup() {
Serial.begin(9600);
Serial.println("32 channel Servo test!");
board1.begin();
board2.begin();
board1.setPWMFreq(60); // Les servos analogiques fonctionnent avec des mises à jour d'environ 60 Hz.
board2.setPWMFreq(60);
// yield();
}
// le code à l'intérieur de loop() a été mis à jour par Robojax
void loop() {
for( int angle =0; angle<181; angle +=10){
for(int i=0; i<16; i++)
{
board2.setPWM(i, 0, angleToPulse(angle) );
board1.setPWM(i, 0, angleToPulse(angle) );
}
}
// robojax PCA9865 16 canaux de contrôle de servo
delay(100);
}
/*
* angleToPulse(int ang)
* prend l'angle en degrés et renvoie la largeur d'impulsion
* imprime également la valeur sur le moniteur sériel
* écrit par Ahmad Shamshiri pour Robojax, Robojax.com
*/
int angleToPulse(int ang){
int pulse = map(ang,0, 180, SERVOMIN,SERVOMAX); // mapper l'angle de 0 à 180 aux valeurs min et max du servo
Serial.print("Angle: ");Serial.print(ang);
Serial.print(" pulse: ");Serial.println(pulse);
return pulse;
}
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