Se connecter

S'inscrire

PCA9685: Contrôle de 16 servomoteurs (et+) avec un même chip (alimentation séparée)

Dans ce tutoriel, j’essaie de vous expliquer le fonctionnement des registres interne du chip PCA9685, pour cela je vais utiliser la carte Adafruit PCA9685, elle est conçue initialement pour contrôler des diodes électroluminescentes. Elle peut être aussi utilisée pour des servomoteurs ou des moteurs à courant continue de faibles puissances.

L’élément électronique central de cette carte est le circuit intégré PCA9685 de NXP Semi-conducteurs, la communication avec ce circuit se fait par l’intermédiaire d’un bus I2C, cela vous permet de contrôler 16 moteurs par carte électronique, chacune a une adresse sur le bus I2C, on peut ainsi mettre plusieurs cartes PCA9685 en série sur le même bus I2C.

 


1 - Changer le "Slave Address"

L’adresse I2C par défaut du circuit PCA9685 est 0x40 en hexadécimal, cette adresse est stockée sur 8 bits à l’intérieur du circuit et ne peut pas être changée par des méthodes logiciels, il est donc nécessaire d’appliquer une tension sur certain pins du circuit réservé à l’adressage pour pouvoir changer cette adresse, le Chip PCA9685 contient 6 pins d’adressage notés (A1,A2,…,A6). Sur la carte Adafruit, on peut changer l’adresse juste en soudant les pins d’adressage marqués sur la carte.


2 - Exemple adressage

Si aucuns des emplacements A1,A2,…,A6 n’est soudé, l’adresse du chip PCA9685 sera 10000000 en binaire, le bit numéro 0 ( à droit) est réservé, il ne sera pas pris en compte , cette adresse correspond à l’adresse par défaut du chip soit 0x40 en hexadécimal. Si maintenant, on soude le pin A0, l’adresse sera 10000010 soit 0x41 en hexadécimal, ce cas est celui illustré sur la figure de la partie précédente. Si les pins A1 et A2 sont soudés, l’adresse serai 10000110 soit 0x43 en hexadécimal.


3 - Mise en série de modules PCA9685

il est possible de mettre plusieurs cartes PCA9685 en série, les adresses sur le bus I2C doivent être impérativement différentes car dans le cas contraire, il y aura des conflits d’adressage sur le bus I2C. La figure suivante montre 3 cartes PCA9685 montées en série, la première carte PCA9685 est connectée à l’arduino via 4 connections, l’alimentation 5V (Vcc) le négative de la carte ou ground (GND) et les deux fils du bus I2C (SDA et SCL), sur la deuxième, le pin A1 est soudé donc l’adresse est 0x41, sur la troisième carte le pin A2 est soudé donc l’adresse est 0x42.

pca1

On remarque sur le schéma de la figure qu’il y a un fil de couleur bleu connectant les trois cartes avec le pin OE, ce fil permet de passer l’information sur la tension de référence de la première carte qui est connectée directement à l’Arduino. Un autre fil de couleur orange relie les 3 cartes via le pin V+, celui-là va conduire l’alimentation séparée des servomoteurs, cette alimentation est assurée par une batterie extérieur qui peut fournir des courant plus important que la carte Arduino, la batterie sera connectée à la borne en bleu clair d’une des trois cartes.


4 - Connection des moteurs avec la PCA9685

La carte PCA9685 offre 16 connections numérotées de 0 à 15 sur la carte, elles sont prévues pour connecter des servomoteurs est non pas des moteurs DC, mais il est toujours possible de connecter des moteurs DC avec les pins V+ et PMW de chaque connexion, le chip PCA9685 contient un registre qui peut permettre un passage entre les deux types de connexions, seul inconvénient est la limitation de courant à chaque pins du chip PCA9685, sa valeur maximale est de 25mA chacun. Cela  pose un sérieux challenge pour le choix du moteur car cela limite la puissance maximale à 125mW vu que la tension de l’alimentation extérieure ne peut pas excéder les 5V.

pca2

Le mode choisi pour la connexion des moteurs DC est celui à la droite de la figure, LED0 est le pin PMW de la carte PCA9685, +Vdd correspond au pin de l’alimentation V+, les moteurs sont schématisés avec une led en série avec une résistance, ce schéma ne correspond pas un vrai modèle de nos moteurs mais cela ne nous gêne pas pour la réalisation de notre prototype vu que la partie non résistive de nos moteurs est petite. Pour mettre la carte dans ce mode, il faut changer la valeur du registre MODE2 d’adresse 0x01, ce registre contient deux bits réservés au choix du mode INVRT et OUTDRV. Pour le mode à gauche de la figure les valeurs sont (INVRT = 0, OUTDRV=1), pour le mode du milieu (INVRT = 1, OUTDRV=1) et pour celui de droite (INVRT = 1, OUTDRV=0).

 

 


5 - Puissance des sorties

Le signal des pins du chip PCA9685 sont de type PMW, donc la tension entre les deux fils de chaque moteurs est égale soit à 5V ou 0V, mais vu que le signal PMW est périodique, on peut jouer sur le rapport entre la durée de la tension 5V par rapport à la durée d’une période du signal, si ce rapport est égal à 1, un moteur DC sentira une tension de 5V, si le rapport est égale à 0.5, le moteur sentira 2.5 volts…

Il y a quatre registres réservés pour le contrôle de chaque moteur, par exemple, pour le moteurs numéro 0, on trouve les registres : LED0_ON_L, LED0_ON_H, LED0_OFF_L, LED0_OFF_H. Il faut noter que les paramètres de la tension sont stockés sur 12bits ce qui nous permet de varier la tension de sortie avec des pas de 5/4096 Volt soit 1,22mV chaque pas.


6 - Exemple d’encodage des registres

Je vais donner ici un exemple d’encodage des registres pour une sortie bien donnée, mais cela ne sera pas la configuration choisie pour alimenter des moteurs dc.

 

pca3

Deux paramètres seront codés sur les quatre registres, deux pour chacun

  1. Le temps avant que le signal passe de la valeur 0V à 5V au début de chaque période (égale à 409 dans l’exemple de la figure).
  2. Le temps avant que le signal passe de la valeur 5V à 0V au début de chaque période (égale à 1228 dans l’exemple de la figure).

 

Dans l’exemple suivant, je veux que le signal de sortie reste à la tension 0V au début 10% du temps d’une période avant de passer à 5V. Puisque une période est codé de 0 à 4095 (12 bits), 10% correspond à 410 pas, cette valeur est de 0x199 en hexadécimal, elle sera stockés sur les deux registres :

LED0_ON_L = 0x99

LED0_ON_H = 0x01

On veut aussi que la durée de la largeur du signal porte soit de 20% du temps d’une période, ce qui correspond à 819 pas, il faut ajouter le temps calculé précédemment et soustraire 1 à la fin

410+819-1 = 1228, cette valeur est de 0x4CC en hexadécimal, elle sera stockés sur les deux registres :

LED0_OFF_L = 0xCC

LED0_OFF_H = 0x04

Pour avoir une tension de sortie de 3V par exemple, il faut pas, cette valeur est de 0x99B, elle sera stockée sur les deux registres :

LED0_OFF_L = 0x9B

LED0_OFF_H = 0x09


7 - Documents et liens utiles

Datasheet PCA9685:   Datasheet_PCA9685

Schéma du module Adafruit (Avec Eagle) :  EAGLE

Lien vers site marchant d’adafruit : https://www.adafruit.com/product/815


PCA9685: Contrôle de 16 servomoteurs (et+) avec un même chip (alimentation séparée)

Réalisé par , mise en ligne le 27 juin 2016 - Dernière modification : 27 juin 2016

Documenter