mercredi 13 janvier 2021

Contrôler plusieurs servomoteurs avec le PCA9685

Certains projets de robotique nécessitent le contrôle simultanés de plusieurs servomoteurs: bras robotique, robot marcheur, etc. Pour ce genre de projet, un module PWM/Servo PCA9685 peut se révéler très utile.


Un seul de ces modules peut contrôler jusqu'à 16 servomoteurs simultanément, en n'utilisant que les deux broches I2C du microcontrôleur. Et si ce n'est pas suffisant, il est possible de connecter plusieurs modules PCA9685 au même microcontrôleur grâce à un système qui permet de modifier assez facilement l'adresse I2C. 


Le module comporte pas moins de 62 connecteurs, qu'il faut souder soi-même.

Du côté gauche de la photo, vous pouvez voir les connecteurs qui se branchent au microcontrôleur:

  • Broche GND - la masse
  • Broche OE - "output enable": permet de désactiver tous les servomoteurs en la mettant au niveau logique HAUT. Il n'est pas nécessaire de la brancher si on n'en a pas besoin.
  • Broche SCL - signal d'horloge I2C
  • Broche SDA - transfert de données I2C
  • Broche VCC - Alimentation logique: 5 V pour les microcontrôleurs qui fonctionnent à un niveau logique de 5 V, et 3,3 V pour les microcontrôleurs qui fonctionnent à un niveau logique de 3,3 V
  • Broche V+ : Alimentation des servomoteurs (5 V); ce connecteur est également présent sous la forme d'un bornier à vis.
La même série de connecteurs est répétée de l'autre côté du module, pour faciliter la connexion de plusieurs modules (au cas où votre projet nécessiterait plus que 16 servomoteurs).

Finalement, 16 groupes de 3 connecteurs permettent de branchement des servomoteurs, du canal numéro 0 (à gauche) jusqu'au canal numéro 15 (à droite).

J'ai testé le module sur les cartes suivantes: Arduino Uno, ESP32, ESP8266, STM32 Nucleo et STM32 Blue Pill. Dans chaque cas, il s'agit de connaître la position des broches I2C, et de prendre soint d'utiliser une alimentation VCC de même valeur que le niveau logique du microconrôleur.

Branchement du module PCA9685 à un Arduino Uno

  • Broche GND du module PCA9685 : Broche GND de l'Arduino
  • Broche SCL du module PCA9685: Broche A5 de l'Arduino
  • Broche SDA du module PCA9685: Broche A4 de l'Arduino
  • Broche VCC: sortie 5 Vde l'Arduino

Branchement du module PCA9685 à un ESP8266

  • Broche GND du module PCA9685 : GND
  • Broche SCL du module PCA9685: Broche GPIO 5 de l'ESP8266
  • Broche SDA du module PCA9685: Broche GPIO 4 de l'ESP8266
  • Broche VCC: 3,3 V

Branchement du module PCA9685 à un ESP32

  • Broche GND du module PCA9685 : GND
  • Broche SCL du module PCA9685: Broche D22 de l'ESP32
  • Broche SDA du module PCA9685: Broche D21 de l'ESP32
  • Broche VCC: 3,3 V


Branchement du module PCA9685 à un STM32 F103C8 "Blue Pill"

  • Broche GND du module PCA9685 : GND
  • Broche SCL du module PCA9685: Broche B6 de la Blue Pill
  • Broche SDA du module PCA9685: Broche B7 de la Blue Pill
  • Broche VCC: 3,3 V

Branchement du module PCA9685 à un STM32 Nucleo

  • Broche GND du module PCA9685 : GND
  • Broche SCL du module PCA9685: Broche SCL/D15 du Nucleo
  • Broche SDA du module PCA9685: Broche SDA/D14 du Nucleo
  • Broche VCC: 3,3 V

Installation de la bibliothèque PWM Servo Driver

J'ai ensuite installé la bibliothèque PWM Servo Driver par Adafruit dans l'IDE Arduino, ce qui peut être fait par l'entremise du gestionnaire de bibliothèques.

Exemple de sketch

Le sketch ci-dessous contrôle 3 servomoteurs respectivement branchés aux canaux 0, 1 et 2 du module (je ne disposais malheureusement pas de 16 servomoteurs). Le servomoteur branché au canal 0 fait un mouvement lent entre ses deux positions extrêmes, celui du canal 1 va plus vite dans un sens que dans l'autre, alors que celui du canal 2 prend une position aléatoire qui change toutes les deux secondes.

La méthode setPWM permet de régler la positon des servomoteurs. Puisque le signal PWM généré est de 12 bits, une période complète peut être séparée en 4096 valeurs différentes. Le premier paramètre indique le numéro du canal (de 0 à 15), le deuxième paramètre indique à quel moment le signal PWM devient haut (de 0 à 4095), et le troisième paramètre indique à quel moment le signal PWM devient bas (de 0 à 4095).

Par exemple, pwm.setPWM(2, 0, 160) règle le signal du canal 2 de façon à ce qu'il devienne haut au tout début d'un cycle (0/4095), et qu'il devienne bas à 160/4095 d'un cycle. Il s'agit donc d'un rapport cyclique d'environ 4%.

-

-

Vidéo

Voici finalement une courte vidéo qui montre le mouvement des trois servomoteurs.



Yves Pelletier (TwitterFacebook

1 commentaire:

  1. Bonjour,
    j'essaie de me servir de ce module, malheureusement, rien ne fonctionne.
    En fait, je viens de remarquer que la ligne du +vcc des servos ne délivre que 0,25v max
    J'ai une alim indépendante sur le bornier de puissance : 5v 1,5A


    La led de mise sous tension est rouge. En général, les leds témoin sont jaunes ou vertes. Est-ce normal, ou est-ce que cela indique un défaut dans la carte ?

    Autre question : tous les schémas liant une arduino à un PCA9685 indiquent de se brancher sur les bornes A5 (clock SCL) & A4 (data SDA). Pourtant, sur l'arduino, il existe 2 broches spéciales I2C, à coté du bouton reset, et c'est là que je branche mes autres périphériques I2C. Je suppose que l'utilisation de A4 A5 vient de la librairie Adafruit et qu'il faut bien respecter ce branchement ?

    Merci pour vos conseils

    RépondreSupprimer