05) 14/09/2017 : Réception du multiplexeur de pilotage des moteurs (MJD 58010)

Troisième maillon dans la chaîne matérielle qui animera JEKERT, le module de multiplexage intervient dans l’interface entre l’ordinateur de bord NANO Arduino et les entrées de pilotage des moteurs. Cette platine électronique est fondamentale. Elle autorise l’envoi de consignes jusqu’à seize moteurs indépendants en ne monopolisant que deux broches analogiques par émulation d’une ligne série au standard I2C. Par ailleurs, ce module électronique nous affranchit d’avoir à générer les seize signaux à 50Hz, avec des rapports cycliques correspondant à la position désirée pour chaque moteur. Le comportement parfait de cette électronique est vital, sans compter le fait que pour la programmation nous devons nous montrer capables de le maitriser pour développer le logiciel. Particulièrement compact, ce module présenté sur la Fig.21 peut être chaîné avec d’autres compères si l’on désire plus de moteurs sur la machine envisagée. Avec seulement douze degrés de mobilité sur JEKERT ce ne sera pas nécessaire.

Les signaux à fournir à la motorisation.

Pour déterminer les caractéristiques des moteurs qui sont à notre disposition, nous nous sommes contentés de faire confiance au programme P01_Commande_Servo_par_Angles.ino  et de tourner le bouton d’un potentiomètre. Peu importe le signal de commande qui était envoyé sur la ligne orange des asservissements. Nous ne sommes pas très à l’aise, car le technicien qui a déballé le multiplexeur PCA9685 nous a tout de suite informé que la documentation qui l’accompagne n’est pas claire et nous a souhaité bon courage. On va faire avec …
Ce jour, en revanche, on n’y coupe pas d’appréhender la façon de faire fonctionner les moteurs, car pour programmer le multiplexeur il nous sera indispensable de savoir ce que doivent générer les sorties 0 à 15 de ce dernier.
Donc, sur le bureau, on farfouille pour trouver la fiche nommée Pilotage des servomoteurs.
Outre la fonction de chacun des trois fils, on comprend finalement qu’il suffit pour chaque individu de lui envoyer en permanence en consigne un « signal binaire carré » à 50Hz dont on modulera la durée à l’état logique « 1 » entre environ 1000µS et 2000µS. C’est exactement ce que devra faire le module de pilotage à seize canaux PCA9685 développé par l’entreprise ADAFRUIT.
Ayant compris ce que devra générer ce circuit électronique, il nous reste à voir comment lui délivrer par logiciel les consignes. Dans ce but, on ne montre pas notre malaise au technicien qui nous observe, et avec autorité et assurance on saisit à son tour la Fiche n°4 nommée :
Méthodes de la bibliothèque Adafruit_PWMServoDriver.h.
L’entreprise ADAFRUIT commercialise toute une variété de petits modules électroniques dédiés pour la famille Arduino. Pour inciter les clients potentiels à acheter ces produits, ils accompagnent leurs références par des bibliothèques bien pensées qui facilitent considérablement la programmation. Vous avez déduit que la fiche mentionnée ci-avant constitue un résumé des fonctions fournies par la bibliothèque associée directement au circuit PCA9685. Avant de détailler le processus de pilotage, examinons l’architecture électronique de la carte PCA9685 :

Structure électronique du multiplexeur et ses branchements.

La Fig.22 résume assez bien les branchements à effectuer et surtout la mission dont s’acquitte le module d’interfaçage. Ce dessin fait apparaître les liaisons filaires électriques à établir. En 1 une petite alimentation alimente la carte Arduino NANO qui ne consomme qu’une énergie dérisoire. (Ce peut être la ligne série USB qui va au P.C. durant la programmation.) On utilise des fils de faible section. En 2 l’alimentation musclée en « gros fils » 3 va directement au bornier. Logiquement en 4 il faudrait établir un lien entre les deux masses de référence. Ce n’est pas indispensable, car en 7 la liaison est établie en interne sur la carte électronique. Notez au passage que les deux lignes de picots du bas pour la masse et pour le +5V de puissance sont réunies, comme sur le petit connecteur de la Fig.18 qui servait aux tests. Ainsi tous les moteurs branchés seront en parallèle comme en 11 sur ces deux lignes d’alimentation. Enfin, chaque ligne orange d’un moteur va sur la sortie 0 à 15 de pilotage qui lui est réservée. L’électronique locale est alimentée par une ligne 5 à part qui logiquement sera reliée à celle de la carte Arduino. Passons à l’étude des signaux électriques qui animent le total :

Fonctionnement de la carte électronique PCA9685.

Lorsque le circuit n’a jamais reçu de consigne pour une ligne de sortie, cette dernière reste au repos à l’état logique « 0 ». Avant de chercher à générer de la PWM sur les diverses sorties du module, on doit préciser la fréquence de répétition désirée avec pwm.setPWMFreq(Fréquence);
Comme on veut commander des servomoteurs l’instruction devient pwm.setPWMFreq(50); car la période T souhaitée est de 20mS. Cette consigne est envoyée sur la ligne I2C en 6 et respecte les protocoles du circuit intégré soudé sur le circuit imprimé. Pour l’instant les seize sorties sont au repos. Pour commander un servomoteur, (Ou tout dispositif branché sur le module.) on désigne la sortie concernée et la durée de l’impulsion à l’état « 1 ». C’est l’instruction de la bibliothèque :
pwm.setPWM(Num_sortie, Ton, Toff); qui se charge de cette mission.
Par exemple pwm.setPWM(12, 0, 465); va immédiatement engendrer sur la sortie 12 le signal qui va par la ligne 9 au servomoteur B. La durée de l’impulsion à l’état « 1 » sera de 2272µS et la fréquence du signal de 50Hz. (2271µS = 465 x 4,884) Le moteur B adopte la position qui en découle. Il la conserve, car, bien que le signal de consigne en 6 ne dure qu’une fraction de seconde, à partir d’une commande de génération PWM la sortie générera le signal découpé jusqu’à ce qu’une nouvelle consigne désignant cette sortie soit envoyée. Si maintenant on active l’instruction suivante :
pwm.setPWM(15, 0, 137); c’est le moteur C qui sur la ligne 10 sera piloté par un signal de fréquence identique 50Hz la durée à l’état logique « 1 » faisant cette fois 669µS. (669µS = 137 x 4,884) Le moteur C tourne rapidement et se positionne à son tour à l’angle de déviation correspondant à ce
rapport cyclique. Enfin, pour ne pas que le troisième moteur ne reste dans une attitude  quelconque, le programme rencontre pwm.setPWM(10, 0, 291); qui imposera un signal à 50Hz d’impulsion positive de 1421µS sur la ligne 8.  (1421µS = 291 x 4,884)
Coupons toutes les alimentations. Débranchons les liaisons entre Arduino NANO et le multiplexeur. Puis réalimentons la carte électronique sans rebrancher les deux lignes de la liaison I2C. L’ensemble de la configuration est rétablie sur le multiplexeur qui conserve dans une mémoire non volatile le contexte qui est mémorisé. Ainsi les moteurs reprennent la même position que celles qu’ils avaient avant la mise hors tension de l’ensemble.

Première mise en Å“uvre de l’interface de motorisation.

Bien qu’initialement les informations fournies avec la bibliothèque étaient trop sommaires, divers essais sur le réel ont permis de dégager les grandes lignes qui sont consignées sur la fiche dédiée. Finalement la mise en service de cette petite merveille d’électronique ne sera pas bien compliquée. Elle va nous permettre de piloter chaque moteur indépendamment des autres. C’est un incontournable pour prétendre programmer à notre désir la mobilité de JEKERT.
La réception des moteurs dans le chapitre n°2 a clairement fait apparaître une dispersion de caractéristique entre les divers individus. Hors, pas question lorsque la sonde sera posée sur Mars, de « voir » un moteur passer en divergence. La mécanique irait en butée ce qui est formellement interdit, la ligne électrique tortillerait des nœuds avant que tout ne se bloque. Aussi, il nous faudra programmer une subroutine de servitude qui pour chaque moteur cantonnera sa plage de rotation dans la fourchette 0° à 180°.
Généralement, comme indiqué en violet sur la Fig.23 les positions angulaires sont repérées entre 0 et 180° avec 90° pour la position centrale. C’est un arbitraire, du reste certains techniciens utilisent le sens inverse. Personnellement, la notion de « neutre opérationnel » est prioritaire, raison pour laquelle je préfère adopter des positions repérées entre -90° et +90°, le neutre valant alors zéro pour satisfaire « mon arbitraire ». Chacun a sa logique propre, j’espère que la mienne ne vous choquera pas. Quand au signe, n’ayant à ce stade aucun critère spécial, j’adopte le moins à gauche et le plus à droite, comme pour des axes trirectangles cartésiens.
Ayant cerné le principe de fonctionnement du circuit PCA9685, c’est avec fierté qu’en présence des techniciens nous téléchargeons P02_Test_de_base_du_Multiplexeur.ino dans le cerveau du petit calculateur. Son comportement est rudimentaire et ressemble à celui de l’expérience décrite sur la Fig.19 sauf que cette fois les commandes des moteurs ne sont plus branchées sur une sortie d’Arduino unique, mais pilotées séparément par les sorties individuelles du multiplexeur. Dans un premier temps on ne branchera qu’un seul moteur à la fois pour en déterminer les caractéristiques pertinentes.
– Ben Totoche, tu perds ton temps, c’est déjà fait dans le chapitre 02, on a tout noté dans le beau tableau plein plein plein de nombres en couleurs !
– Et oui Dudule, c’est la vie du développeur. Quand on a passé tout ce temps à rédiger ce tableau, nous ne savions pas encore quels seraient les paramètres pertinents … et ce ne sont pas les bons.
– Mince alors, quels sont les bons ? Faut tout recommencer ?
– Voui, tout à refaire, il nous faut connaitre les durées d’impulsions à fournir pour chaque moteur quand il se trouve exactement à -90° et +90°.

La suite est ici.

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *