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++
/*
 * Original library source: https://github.com/adafruit/Adafruit-PWM-Servo-Driver-Library
 * 
 * This is the Arduino code PCA6985 16 channel servo controller
 * to control 32 Servo Motors with ESP32 board without WiFi

  get this code and wiring from for this video:  http://robojax.com/RJT268
 * 
 * This is V4 Video on PCA9685: https://youtu.be/JFdXB8Za5Os
 * 
 * watch the video for details (V1) and demo http://youtu.be/y8X9X10Tn1k

 *  
   
 * Written/updated by Ahmad Shamshiri for Robojax Video channel www.Robojax.com
 * Date: Dec 15, 2019, in Ajax, Ontario, Canada

 * Disclaimer: this code is "AS IS" and for educational purpose only.


or make donation using PayPal http://robojax.com/L/?id=64

 *  * This code is "AS IS" without warranty or liability. Free to be used as long as you keep this note intact.* 
 * This code has been download from Robojax.com
    This program is free software: you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation, either version 3 of the License, or
    (at your option) any later version.

    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.

    You should have received a copy of the GNU General Public License
    along with this program.  If not, see <https://www.gnu.org/licenses/>.
 */
#include <Wire.h>

#include <Adafruit_PWMServoDriver.h>

// called this way, it uses the default address 0x40
Adafruit_PWMServoDriver board1 = Adafruit_PWMServoDriver(0x40);
Adafruit_PWMServoDriver board2 = 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!
// Watch video V1 to understand the two lines below: http://youtu.be/y8X9X10Tn1k
#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)


int servoNumber = 0;

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);
  //yield();
}

// the code inside loop() has been updated by 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 channel Servo control
  delay(100);
 
}

/*
 * angleToPulse(int ang)
 * gets angle in degree and returns the pulse width
 * also prints the value on seial 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;
}

Ce dont vous pourriez avoir besoin

Ressources et références

Aucune ressource pour le moment.

Fichiers📁

Bibliothèques Arduino (zip)