Composant · Pilote

PCA9685 Servo Driver

Le PCA9685 pilote 16 servos ou sorties PWM en I²C depuis deux broches — la façon standard de faire marcher un bras ou des servos sans surcharger le processeur.

Présentation

Le PCA9685 est un multiplicateur de servomoteurs. Un microcontrôleur n’a qu’une poignée de canaux PWM matériels, donc piloter les six servomoteurs d’un bras robotique — sans parler des dix-huit d’un hexapode — épuise vite ses broches et minuteurs. Cette petite carte prend ce travail : elle génère 16 signaux PWM indépendants en matériel, et vous les commandez tous sur deux fils I²C. C’est la carte derrière la plupart des robots multi-servos.

Schéma légendé d'une carte contrôleur PWM/servomoteurs PCA9685 16 canaux : une rangée de seize barrettes servo trois broches (PWM, V+, GND) le long du haut dans un boîtier noir, la puce PCA9685 et des passifs au centre, une barrette de commande I²C cinq broches (OE, SCL, SDA, GND, VCC) à gauche, des cavaliers d'adresse à souder, et un bornier à vis V+ pour l'alimentation des servos à droite.
Seize canaux PWM en matériel, pilotés sur deux broches I²C ; le courant des servos vient du bornier V+ séparé, pas du microcontrôleur. Télécharger le SVG

Fonctionnement

Vous parlez au PCA9685 en I²C — les mêmes deux broches (SCL/SDA) peuvent aussi porter d’autres capteurs. Vous fixez une fréquence PWM pour toute la puce (50 Hz pour les servomoteurs hobby), puis la largeur d’impulsion de chaque canal pour placer son servomoteur. Comme la puce tient les 16 signaux en matériel, le microcontrôleur envoie juste « canal 3 → 1,5 ms » et passe à autre chose ; il n’a jamais à générer la temporisation lui-même. C’est ce qui garde chaque servomoteur doux même quand les 16 bougent. L’idée largeur-d’impulsion-vers-angle est la même que celle de la page du servomoteur SG90.

Quand l’utiliser

Prenez un PCA9685 dès qu’un robot a plus de servomoteurs que le microcontrôleur n’a de broches PWM, ou quand vous voulez des servomoteurs parfaitement stables :

  • Bras robotiques — plusieurs servomoteurs d’articulations bougeant ensemble (associez-le à la cinématique inverse).
  • Hexapodes / quadrupèdes — une douzaine ou plus de servomoteurs de pattes.
  • Tourelles pan-tilt et montures caméra — libérant les minuteurs du microcontrôleur pour autre chose.

Pour un seul servomoteur de balayage — comme le scan ultrason d’un éviteur d’obstacles — inutile ; le microcontrôleur peut piloter un servomoteur directement.

Câblage et pièges

  • Deux rails d’alimentation. Logique (VCC) depuis le microcontrôleur ; puissance des servos depuis le bornier V+. Ne faites jamais passer le courant de 16 servomoteurs par le 5 V de l’Arduino.
  • Dimensionnez V+ pour le blocage, pas le repos. Seize servomoteurs peuvent tirer plusieurs ampères ensemble ; une alimentation sous-dimensionnée s’affaisse et toute la carte tremble.
  • Fixez des adresses uniques en chaînant des cartes, via les cavaliers à souder.
  • Ajoutez un condensateur sur V+ pour absorber les pics de courant au démarrage des servos.

Brochage

Trois groupes de connexions : une barrette de commande câblée au microcontrôleur, seize barrettes servo, et un bornier d’alimentation à ne pas confondre avec le premier.

Groupe Broche Rôle
Commande VCC Logique seulement, 3,3 V ou 5 V depuis le microcontrôleur. Pas l’alimentation des servos
Commande GND Masse — doit être commune au microcontrôleur et à l’alimentation des servos
Commande SCL Horloge I²C
Commande SDA Données I²C
Commande OE Validation des sorties, active au bas. Laissée flottante elle est tirée au bas, donc sorties actives
Alimentation V+ (bornier à vis) Courant des servos. Jusqu’à 6 V sur la carte courante
Sorties 0–15 Trois broches chacune : signal PWM, V+, GND — ordre servo standard
Adresse A0–A5 (pastilles à souder) Six cavaliers choisissent l’adresse I²C, 0x40 par défaut

Le fait le plus lourd de conséquences sur cette carte est que VCC et V+ sont des rails différents. VCC fait marcher la puce ; V+ fait marcher les servos. Les ponter fait passer le courant de blocage des servos dans le régulateur du microcontrôleur, soit le moyen le plus rapide de faire décrocher un Arduino.

Le câbler à un Arduino

PCA9685 Arduino Uno ESP32 Note
VCC 5 V 3,3 V Quelques milliampères — logique seulement
GND GND GND Aussi commune avec la masse de l’alimentation des servos
SDA A4 GPIO 21 La carte a des pull-ups 10 kΩ montées
SCL A5 GPIO 22 Idem
V+ pas l’Arduino pas l’ESP32 Une alimentation 5–6 V séparée dimensionnée pour le courant de blocage
OE Laisser libre Laisser libre Ou pilotez-la depuis une broche pour tuer les seize sorties d’un coup

OE est plus utile qu’il n’y paraît. La tirer au haut coupe les seize sorties en matériel, instantanément, sans transaction I²C. Sur un bras qui peut tomber par gravité, c’est un vrai arrêt d’urgence, et il marche même si votre code s’est bloqué.

Dimensionner l’alimentation des servos

C’est là que la plupart des projets PCA9685 échouent, et l’arithmétique n’est pas dure.

Un servomoteur hobby tire environ :

Servo Repos En mouvement, sans charge Bloqué
SG90 (9 g) ~10 mA ~150–250 mA ~650 mA
MG90S (engrenages métal) ~10 mA ~250–400 mA ~800 mA
MG996R (taille standard) ~10 mA ~500–900 mA ~2,5 A

Quatre SG90 sur un petit bras, bougeant tous ensemble, font confortablement 1 A et peuvent culminer près de 2,6 A s’ils bloquent tous ensemble — soit exactement ce qui arrive quand le bras cogne son propre cadre. Un chargeur de téléphone 1 A ne suffira pas. Dimensionnez pour tous vos servomoteurs bloqués simultanément, ou au minimum pour tous en mouvement plus un bloqué.

Le symptôme d’une alimentation sous-dimensionnée est distinctif et déroutant : les servos tremblent, la carte peut redémarrer, et cela ressemble à un problème I²C ou de code. Ce n’en est pas un. Mettez un multimètre sur V+ pendant que le bras bouge et regardez-le s’affaisser.

Ajoutez un condensateur sur V+. Quelque chose entre 470–1000 µF, près du bornier. Il ne peut pas porter un blocage soutenu — un condensateur de 1000 µF fournissant 1 A chute d’un volt chaque milliseconde — mais il absorbe le pic de courant franc à l’instant où un servo démarre, ce qui se couple sinon dans le rail logique.

Comment le PWM est réellement généré

Comprendre deux nombres ici rend tout problème de contrôleur de servos plus facile à diagnostiquer.

La puce tourne sur un oscillateur interne 25 MHz et le divise avec un prédiviseur :

prescale = round(25000000 / (4096 x frequency)) - 1

Pour le 50 Hz que veulent les servos hobby, cela fait round(25000000 / 204800) - 1 = 121.

Chaque période est ensuite divisée en 4096 pas (12 bits). À 50 Hz la période fait 20 ms, donc un pas fait 20 ms / 4096 = 4,88 µs. Cela convertit les largeurs d’impulsion servo qui comptent vraiment en comptes à écrire :

Largeur d’impulsion Signification Comptes à 50 Hz
1,0 ms Une fin de course 205
1,5 ms Centre 307
2,0 ms L’autre fin 410

Deux conséquences en découlent directement. D’abord, on obtient environ 205 comptes sur les 180° complets d’un servo, soit juste moins d’un compte par degré — la résolution 12 bits du PCA9685 n’est pas le facteur limitant d’un servo hobby, la zone morte du servo lui-même l’est. Ensuite, le prédiviseur ne s’écrit que puce en mode sommeil, c’est pourquoi toute bibliothèque bascule MODE1 autour d’un changement de fréquence.

L’oscillateur ne fait pas exactement 25 MHz

Les vraies cartes tournent à quelques pour cent du nominal, de façon stable par carte. Si vos servos sont systématiquement courts de leur angle commandé aux deux bouts, la correction n’est pas de trafiquer les largeurs d’impulsion — c’est de mesurer et corriger l’horloge :

pwm.begin();
pwm.setOscillatorFrequency(26075000);  // measured, not the 25 MHz nominal
pwm.setPWMFreq(50);

Mesurez-la en commandant 50 Hz, en mettant un oscilloscope ou un analyseur logique sur une sortie, et en lisant la vraie période. Mettez à l’échelle le 25 MHz nominal par le rapport fréquence commandée sur fréquence mesurée. Faites cela une fois par carte et écrivez le nombre en commentaire.

Code minimal fonctionnel

#include <Wire.h>
#include <Adafruit_PWMServoDriver.h>

Adafruit_PWMServoDriver pwm = Adafruit_PWMServoDriver(0x40);

// Per-servo calibration. These are NOT universal — measure your own.
const int SERVO_MIN = 150;   // counts at one end stop
const int SERVO_MAX = 600;   // counts at the other

int countsFor(int degrees) {
  return map(constrain(degrees, 0, 180), 0, 180, SERVO_MIN, SERVO_MAX);
}

void setup() {
  pwm.begin();
  pwm.setOscillatorFrequency(25000000);  // replace with your measured value
  pwm.setPWMFreq(50);                    // hobby servos want 50 Hz
  delay(10);
}

void loop() {
  for (int a = 0; a <= 180; a += 5) {    // sweep, don't jump
    pwm.setPWM(0, 0, countsFor(a));
    delay(20);
  }
  for (int a = 180; a >= 0; a -= 5) {
    pwm.setPWM(0, 0, countsFor(a));
    delay(20);
  }
}

Les constantes SERVO_MIN/SERVO_MAX sont l’étalonnage, et elles diffèrent par servo — même entre deux du même modèle du même sachet. Trouvez-les en avançant lentement vers l’extérieur depuis 307 et en vous arrêtant dès que le servo bourdonne sans bouger, signe qu’il pousse contre sa propre butée en tirant du courant de blocage pour rien.

Notez aussi le balayage plutôt qu’un saut. setPWM change la position commandée instantanément, et le servo la tentera à pleine vitesse — ce qui sur un bras signifie un mouvement violent et un pic de courant. Avancer la consigne par pas est le profil de mouvement du pauvre, et cela vaut la peine même dans du code de test.

Chaîner des cartes

Chaque carte a six pastilles à souder, A0 à A5, donnant 64 adresses depuis 0x40. Pontez une combinaison différente sur chaque carte :

Cavaliers pontés Adresse
aucun 0x40
A0 0x41
A1 0x42
A0 + A1 0x43
A5 0x60

62 cartes est le maximum documenté — 0x70 est réservé à l’adresse d’appel général I²C, c’est pourquoi ce n’est pas 64 au complet. En pratique, la limite arrive bien plus tôt : 62 cartes font 992 servos, et l’alimentation pour cela est un problème d’ingénierie bien plus gros que le bus.

Un point à surveiller en chaînant : chaque carte porte ses propres pull-ups I²C 10 kΩ, et elles se mettent en parallèle. Dix cartes donnent 1 kΩ, ce qui commence à peser pour un bus 5 V. Passé une poignée de cartes, coupez les cavaliers de pull-up sur toutes sauf une.

Dépannage

Symptôme Cause probable Solution
Rien ne bouge du tout Pas d’alimentation servo sur V+ V+ est un rail séparé ; VCC alimente seulement la puce
Les servos tremblent en permanence Alimentation qui s’affaisse en charge Dimensionnez V+ pour le courant de blocage ; ajoutez un condensateur 470–1000 µF
Les servos ne tremblent que quand plusieurs bougent Idem, mais limite Comme ci-dessus — mesurez V+ au multimètre en bougeant
Un servo bourdonne et chauffe Commandé passé sa butée Resserrez le SERVO_MIN/SERVO_MAX de ce canal
Tous les angles courts systématiquement L’oscillateur ne fait pas exactement 25 MHz Mesurez la vraie fréquence de sortie et appelez setOscillatorFrequency
Carte introuvable sur le bus Mauvaise adresse, ou pas d’alimentation logique Scannez le bus ; vérifiez VCC et que les cavaliers d’adresse correspondent au code
Deux cartes, une seule répond Les deux sur le 0x40 par défaut Pontez les cavaliers d’adresse pour unicité
L’Arduino redémarre quand le bras bouge Courant servo passant par la carte V+ doit venir de sa propre alimentation, masse seule commune
Sorties mortes mais I²C OK OE maintenue au haut Laissez OE flottante, ou pilotez-la au bas

PCA9685 ou PWM direct du microcontrôleur ?

Broches PWM directes PCA9685
Canaux 6 sur un Uno, et la bibliothèque Servo vole un minuteur 16 par carte, 62 cartes sur un bus
Broches utilisées Une par servo Deux, au total, pour tous
Temporisation Générée par le microcontrôleur — tremble quand la boucle est occupée Générée en matériel — stable quel que soit votre code
Chemin d’alimentation Ce que vous câblez, souvent mal Un bornier V+ dédié qui rend la bonne réponse évidente
Surcoût Aucun Quelques dollars, plus une adresse I²C

Le seuil honnête : un ou deux servos, pilotez-les directement. Une tête de détection pivotante sur un éviteur d’obstacles n’a pas besoin de cette carte. Trois ou plus, ou tout servo dont la douceur compte, et le PCA9685 se paie aussitôt — non pour le nombre de broches, mais parce que le microcontrôleur cesse d’être responsable de la temporisation. Un servo piloté par la bibliothèque Servo tressaillira dès que votre boucle cale ; un piloté par un PCA9685 non.

Explorer le graphe

Utilisé dans ces réalisations

Projets, parcours d'apprentissage et simulateurs qui intègrent le composant PCA9685 Servo Driver.

Questions

FAQ : PCA9685 Servo Driver

Qu'est-ce qu'un PCA9685 ?

Le PCA9685 est un contrôleur PWM 16 canaux en 12 bits que l'on commande en I²C. Il sert le plus souvent de contrôleur de servomoteurs — une petite carte fait marcher jusqu'à 16 servomoteurs depuis juste deux broches de microcontrôleur, c'est pourquoi c'est le choix standard pour bras robotiques, hexapodes et tourelles pan-tilt.

Combien de servomoteurs un PCA9685 peut-il piloter ?

16 par carte, et on peut chaîner jusqu'à 62 cartes sur un bus I²C pour 992 canaux. La limite en pratique est l'alimentation, pas les canaux — 16 servomoteurs bougeant ensemble peuvent tirer plusieurs ampères, qui doivent venir du bornier V+ séparé, pas du microcontrôleur.

Le PCA9685 a-t-il besoin d'une alimentation séparée ?

Oui, pour les servomoteurs. La logique de la puce marche en 3,3–5 V depuis le microcontrôleur, mais les servomoteurs tirent leur courant du bornier V+ dédié — câblez-y une alimentation capable de fournir le courant de blocage de tous vos servomoteurs à la fois, sinon ils décrocheront et trembleront.

Comment connecter un PCA9685 à un Arduino ?

Câblez-le en I²C — SDA et SCL aux broches I²C de l'Arduino, plus VCC et GND pour la logique de la puce. Connectez ensuite une alimentation séparée au bornier V+ pour les servomoteurs, et branchez chaque servomoteur sur une barrette de canal. Une bibliothèque (comme celle d'Adafruit) permet de fixer l'angle de chaque canal dans le code.

Comment chaîner des cartes PCA9685 ?

Chaque carte a six pastilles à souder qui fixent son adresse I²C. Pontez une combinaison différente sur chaque carte pour que chacune ait une adresse unique, puis câblez-les toutes aux mêmes deux lignes I²C — jusqu'à 62 cartes, 992 canaux, sur un bus.

Pour aller plus loin

Références