Code de recherche

Contrôler un moteur servo 32 à l'aide d'un module PCA9685 et d'un ESP32 V4

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.

PCA9685 module-0

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

ESP32 wiring for PCA99685 for 32 sevo motors

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.

Connexion de deux cartes PCA9685

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).

Module PCA9685
module PCA9685

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

Images

PCA9685 module-0
PCA9685 module-0
PCA9685 module-2
PCA9685 module-2
PCA9685 module-3
PCA9685 module-3
PCA9685 module
PCA9685 module
Connecting two PCA9685 board
Connecting two PCA9685 board
ESP32 wiring for PCA99685 for 32 sevo motors
ESP32 wiring for PCA99685 for 32 sevo motors
880-new- PCA9685 Video V4, Arduino ESP32 Code : Controlling all 32 servo motor wihtout WiFi
Langue: C++
/*
 * 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

Ressources et références

Aucune ressource pour le moment.

Fichiers📁

Bibliothèques Arduino (zip)