Club robotique de Sophia-Antipolis

Accueil > POBOTpedia > Actionneurs > Les moteurs électriques > Les servomoteurs > Servomoteurs à commande numérique

Servomoteurs à commande numérique

jeudi 10 janvier 2013, par Eric P.

Dans cet article, nous allons nous intéresser à ce que nous considérons parfois comme la Rolls-Royce des servos de format radio-commande, à savoir les servos à commande numérique.

En bref il s’agit de servos qui ne se commandent plus par le classique système de modulation en largeur d’impulsions périodiques, mais par un jeu de commandes qui circulent sur un bus numérique. Et quand on parle de bus et de commandes, cela veut aussi dire la connexion de plusieurs servos via un bus unique et des possibilités de retour d’information du servo vers le contrôleur.

Il faut d’ailleurs différencier l’appellation "servo à commande numérique" de "servo numérique", ces derniers conservant une commande analogique par impulsions, mais ayant remplacé l’asservissement par ampli-op par un asservissement numérique, plus précis et éventuellement configurable.

Nous allons illustrer cela avec le modèle AX-12A de la gamme Dynamixel de marque Robotis. [1]

Un avant-propos de la plus haute importance :

Avant d’aller plus loin, sachez que ces expérimentations nous ont été rendues plus accessibles grâce à la générosité de la société Génération Robots, qui nous a purement et simplement offert un lot de 6 servos AX-12A ainsi qu’un assortiment d’éléments de montage à titre de sponsoring de notre robot pour la coupe de France 2013.

En plus de cela, il faut souligner la qualité de leur accueil et de leurs compétences : on sent bien qu’on a en face des gens passionnés par leur domaine d’activité. Jérôme, Yassine (ainsi que les autres membres que je ne connais pas encore de votre petite mais hyper-active équipe) : un grand merci à vous.

Lecteur qui parcourez ces lignes, n’hésitez pas à aller visiter leur site et leur boutique, et à leur demander des conseils : même si ce qui vous intéresse n’apparaît pas sur leurs pages, il y a de très fortes chances qu’ils puissent vous le procurer quand même et que suite à votre demande l’article se trouve ajouté au catalogue (ça a été le cas pour les deux produits mentionnés ci-dessus).

Le AX-12A en quelques mots

Je ne vais pas ici vous recopier la documentation du produit, que vous trouverez sans difficulté chez son constructeur Robotis, ou même, encore plus simple, sur le site de Génération Robots, à la page du produit.

Quelques caractéristiques rapides néanmoins pour fixer un peu les idées, tirées de la documentation constructeur et incluses ci-après par commodité :

Amplitude 300° ou rotation continue
Couple 16 kg.cm sous 10 V
Vitesse 0.2 s/deg sous 10V
Consignes position et vitesse
Résolution les consignes sont quantifiées sur 1024 pas (soit 0.35° en position)
Réglages vitesse, couple maximum, courbes d’évolution du couple à l’approche de la position cible, dead zone,...
Feedback position, vitesse, charge mécanique, température, tension
Alarmes et sécurités tension, température, couple
Communication bus 3 fils TTL multi-drop, débit jusqu’à 1Mbps
Divers possibilité de synchronisation des mouvements de plusieurs servos par bufferisation des commandes respectives et déclenchement synchronisé des mouvements

Lorsqu’on compare aux servos que nous avons l’habitude d’utiliser, on se rend compte immédiatement qu’on est dans un autre monde à la simple manipulation de l’objet, : aucun jeu n’est perceptible lorsqu’on actionne le palonnier de sortie à la main. De plus, on perçoit très bien lors d’une rotation manuelle le plus grand taux de démultiplication de la transmission.

Qui dit haute qualité, dit aussi prix en proportion, et le qualificatif de "Rolls-Royce" en introduction a dû vous faire frémir (dans le mauvais sens du terme). La bonne nouvelle c’est que certes les AX-12 sont plus chers qu’un servo classique d’entrée de gamme, mais dans des proportions correctes eu égard à la différence de classe.

Par exemple, un servo Hitec d’entrée de gamme comme le HS-422 coûte dans les 16 Euros alors qu’un AX-12A en vaut 39. Mais un servo Hitec de ce prix ne vous fournira qu’un couple de 4 kg.cm environ, un débattement de 180°, aucun retour d’information, la rotation continue au prix de la modification du servo, et sans plus pouvoir l’utiliser en débattement limité, sans parler du fait qu’il faut lui générer des impulsions en permanence, qu’il consomme un fil de commande par servo, que la précision angulaire est sans commune mesure et qu’il n’y a aucun paramétrage possible. Bon, ok, j’arrête la comparaison, elle n’est pas équitable, vu l’écart de prix.

Si on monte en gamme chez Hitec pour avoisiner le prix de l’AX-12A, on tombe sur le HS-5496MH par exemple, qui dispose d’un couple de 7.2 kg.cm (c’est toujours inférieur à l’AX12, même en alimentant celui-ci seulement en 7V) et nous sommes de toute manière toujours dans une commande de type analogique et sans feedback.

Un autre avantage important de l’AX-12 sur son cousin analogique se situe au niveau mécanique : les multiples possibilités de fixation de la bête sur la structure dans laquelle il s’insère, ainsi que la précision des assemblages résultants. Une impressionnante série de points de fixation est présente sur plusieurs de ses faces, ces fixations étant en réalité des logements pour des écrous métalliques. Le palonnier de sortie n’est pas en reste, car outre le fait que son accouplement à l’axe est d’une rigidité absolue, les trous de fixation pour les éléments mécaniques entraînés sont filetés (point de vis auto-foreuses ici, mais du boulon mécanique M2).

Du coup, même à prix égal, on commence à se poser de sérieuses questions.

Vous l’avez compris, mon choix est donc fait dès lors qu’on a besoin de quelque chose de plus évolué qu’un simple mouvement d’actionneur sans besoin de précision et de contrôle élevés, car d’une part les performances sont largement supérieures, mais de plus l’éventail de fonctionnalités est incomparable.

Avant de me faire pourrir comme un malpropre par la communauté radio-modéliste, avec qui nous entretenons de très bons rapports, étant donné que nous avons des radio-modélistes parmi nos membres, il faut quand même préciser que les AX-12 et consorts sont alimentés en tension plus élevée que les servos de modélisme classiques, puisque nous pouvons aller jusqu’à 10V pour les AX12, voire plus pour des modèles au-dessus, alors qu’un servo conventionnel est alimenté en 5-6V maximum. Il est évident que cela a une incidence non négligeable sur le couple résultant. Ceci étant, si on ne considère que l’objectif visé, et que la manière de l’atteindre importe peu, à budget équivalent le comparatif se tient. Le propos n’est évidemment pas le même dans le cas où les contraintes d’embarquement font que la tension disponible est limitée (maquettes volantes de petite ou moyenne taille par exemple).

Un dernier mot concernant l’AX-12A dont il va être question ici, par rapport aux autres AX-12 de la gamme. Le 12A est l’évolution du 12+ (lui-même successeur du 12 tout court). Il présente un certain nombre d’améliorations mécaniques et conceptuelles au niveau des fixations du corps du servo, mais aussi du palonnier. Il est bien entendu strictement compatible au niveau dimensionnel et contrôle. Comme d’habitude, "Google est ton ami" pour retrouver les détails concernant ces évolutions. Si je me mets à tout dire ici, nous y serons encore dans 6 mois et l’article va peser 50 pages.

La communication

Comme introduit plus haut, le contrôle des AX-12 se fait via un bus TTL half-duplex 3 fils. C’est également le cas des modèles AX-12W, AX18A, ainsi que des modèles MX-28, MX-64 et MX-106, qui acceptent aussi bien le bus TTL 3 fils que le bus RS485 4 fils full-duplex.

Tous les servos de la gamme disposent de deux connecteurs pour le bus, ce qui permet de faire un câblage en daisy-chain. Il est également possible de configurer les connexions en étoile, à l’aide d’une tout petit PCB fourni dans le set de mécanique de montage, qui constitue une sorte de multi-prise pour bus Dynamixel. On a donc une flexibilité maximale quant à la topologie du câblage.

La photo ci-après illustre une configuration courante dans le cas d’une configuration d’actionneurs en série. On peut également y voir différents types de montures d’assemblage, ce qui donne un aperçu de l’étendue des possibilités sur ce plan.

Le contrôle

OK, nous savons par quel moyen physique les données circulent. Maintenant, comment les produire ?

Plusieurs options se présentent :
 utiliser un des contrôleurs Robotis de la gamme CM-x. Il s’agit ni plus ni moins d’un micro-contrôleur capable d’exécuter des programmes de mouvements (et plus) qu’on développe à l’aide d’un atelier gratuit et très complet [2] disponible chez Robotis, et qu’on y télécharge via une liaison série [3]
 utiliser un PC ou une carte de type micro-PC et s’interfacer avec le bus via un adaptateur USB comme l’USB2Dynamixel de Robotis
 générer soi-même les signaux du bus via les GPIO ou l’UART d’un micro-contrôleur, ou d’une carte qui y donne accès (ex : la RasPi)

Un autre article vous présentera la troisième option, mais pour ma part, j’ai choisi la deuxième, en achetant également chez Génération Robots un USB2Dynamixel [4].

Cet accessoire est très pratique pour des expérimentations sur table, car il offre les interfaces vers tous les types de connexions utilisés par les produits de la gamme :
 TTL half-duplex 3 fils
 RS485 full-duplex 4 fils
 RS232

[EDIT 16/01/2019] ce produit semble avoir été remplacé depuis par l’adaptateur U2D2

OK, le dernier ne sert pas à grand-chose lorsqu’on a déjà dans un coin des câbles FDTI (et c’est aussi vrai pour le RS485), mais bon, c’est pratique d’avoir tout sous la main avec un seul outil lorsqu’on expérimente. En fait, on peut le considérer comme une sorte de couteau suisse pour bus Dynamixel et produits associés.

Pour l’installation de tout cela à bord du robot 2013, j’utiliserai une autre interface, limitée au bus TTL et plus compacte (très certainement l’USB2AX proposée par Xevel, bien connu de nos services ;)

L’alimentation

L’interface USB2Dynamixel ne fournit pas l’alimentation du bus. N’importe quelle solution pratique convient, mais j’ai choisi la solution de facilité avec l’accessoire SMPS2Dynamixel.

Pour 6 Euros et des poussières, ce n’est même pas le prix des composants, du PCB et du temps pour le fabriquer. Alors autant faire tourner l’économie tant qu’on peut se le permettre.

Les expérimentations maintenant

Bon, ok, on a tout cela sur la table. On fait quoi maintenant ?

Mon but étant de contrôler tout cela avec une RasPi dans le robot, et de le faire via du code Python, et bien nous allons nous enquérir sur le champ de la librairie adéquate et idoine [5].

La recherche ne fut pas bien longue, et je suis rapidement tombé sur pydynamixel via un banal Google("dynamixel python"). C’est le premier hit du résultat et c’est le bon. Si vous avez la curiosité de lire un peu ce qui est écrit au sujet de PyDynamixel sur le site [6], vous pourrez constater que c’est issu de travaux assez sérieux de gens qui entre autres choses font du ROS, de l’OpenCV,... Prenez la peine de visiter leur site, il en vaut la peine.

Une fois en possession de l’archive de l’installeur, aucun problème particulier pour installer la lib et ses exemples, en suivant servilement les quelques instructions données sur son site Web. Vous voilà maintenant en mesure d’accéder au Graal via un banal :
import dynamixel
en tête de script (ou de session interactive Python).

Les deux exemples fournis permettent de comprendre la mise en oeuvre assez rapidement, d’autant que les sources de la libs étant pourvus de leur docstrings réglementaires, pydoc ou la fonction help vous donneront sur le champ les détails pour telle ou telle méthode.

A noter que l’écriture des exemples est parfois un peu surprenante et complexe sans raison spéciale. C’est pourquoi je me suis permis d’inclure en archive jointe une version revue et corrigée par mes soins.

Cadeau bonus

Un petit utilitaire Python pour afficher en clair (avec décodage le cas échéant) des registres d’un servo connecté via la méthode décrite plus haut. J’ai essayé de le faire le plus pédagogiquement possible, mais aussi pour qu’il soit le plus utile possible en tant qu’outil. Dans ce but, des valeurs par défaut sont définies pour les différents paramètres, mais sont tous modifiables à l’appel via les options décrites dans l’aide intégrée :

$ ./regs-display.py --help
usage: regs-display.py [-h] [-p PORT] [-i ID] [-b BAUDRATE]

Displays current settings of Dynamixel servo registers.

optional arguments:
  -h, --help            show this help message and exit
  -p PORT, --port PORT  the serial port of the bus interface
                        [default=/dev/ttyUSB0]
  -i ID, --id ID        the AX12 id [default=1]
  -b BAUDRATE, --baudrate BAUDRATE
                        the bus speed [default=1000000]

Au fait, désolé pour les Windowsiens concernant la valeur par défaut de l’option "port", mais comme ils ont droit eux à un clicodrome gratuit fourni par Robotis, j’ai pensé aux autres avant tout.

Voici le source du script en question :

Et voici un exemple de sortie :

$ ./regs-display.py 
[ 0] Model Number              :    12 (0x0c)
[ 2] Firmware Version          :    24 (0x18)
[ 3] Id                        :     1 (0x01)
[ 4] Baud Rate                 :     1 (Baud_1000000)
[ 5] Return Delay              :   250 (0xfa)
[ 6] CW Angle Limit            :     0 (0x00)
[ 8] CCW Angle Limit           :  1023 (0x3ff)
[11] Temperature Limit         :    70 (0x46)
[12] Low Voltage Limit         :    60 (0x3c)
[13] High Voltage Limit        :   140 (0x8c)
[14] Max Torque                :   800 (0x320)
[16] Status Return Level       :     2 (RespondToAll)
[17] Alarm Led                 :    36 (Overheating,Overload)
[18] Alarm Shutdown            :    36 (Overheating,Overload)
[20] Down Calibration          :    51 (0x33)
[22] Up Calibration            :   979 (0x3d3)
[24] Torque Enable             :     0 (0x00)
[25] LED                       :     0 (0x00)
[26] CW Compliance Margin      :     1 (0x01)
[27] CCW Compliance Margin     :     1 (0x01)
[28] CW Compliance Slope       :    32 (0x20)
[29] CCW Compliance Slope      :    32 (0x20)
[30] Goal Position             :     0 (0x00)
[32] Moving Speed              :     0 (0x00)
[34] Torque Limit              :   800 (0x320)
[36] Current Position          :     0 (0x00)
[38] Current Speed             :     0 (0x00)
[40] Current Load              :     0 (0x00)
[42] Current Voltage           :   100 (0x64)
[43] Current Temperature       :    25 (0x19)
[44] Registered Instruction    :     0 (-none-)
[46] Moving                    :     0 (0x00)
[47] Lock                      :     0 (0x00)
[48] Punch                     :    32 (0x20)

Conclusion

Une fois les différentes manips effectuées sur ma machine de développement, j’ai reproduit l’ensemble sur la RasPi. Hormis le fait qu’il a fallu y installer la lib pySerial (qui existait par défaut sur la configuration Ubuntu desktop), le reste s’est déroulé à l’identique et sans problème. C’est de plutôt de bon augure pour notre killer de la Coupe ;)

Et pour clôturer ce premier volet, une petite vidéo des tous premiers mouvements d’un AX-12A piloté en Python sous Linux par votre serviteur.

OK, ça ne casse pas 3 pattes à un canard, mais d’un autre côté je n’ai pas le coeur à faire du mal à une pauvre bête.

Stay tuned ;)


[1A noter qu’il existe une gamme "pro" de marque Dynamixel, destinée aux robots de grande taille. Comme quoi ce sont des gens sérieux

[2mais Windows only

[3à noter qu’une possibilité de liaison sans fil est également disponible via des modules complémentaires appropriés

[4en fait, j’ai mentionné le cadeau fait par Génération Robots à POBOT, mais il faut savoir que j’ai investi à titre personnel par la même occasion dans les mêmes produits, ainsi que dans quelques accessoires complémentaires. J’ai fait un peu fumer ma carte de crédit pour Noël dernier...

[5y cause classieux le Monsieur, hein ?

[6au lieu de vous précipiter comme des bêtes sur l’installation

Un message, un commentaire ?

modération a priori

Attention, votre message n’apparaîtra qu’après avoir été relu et approuvé.

Qui êtes-vous ?

Pour afficher votre trombine avec votre message, enregistrez-la d’abord sur gravatar.com (gratuit et indolore) et n’oubliez pas d’indiquer votre adresse e-mail ici.

Ajoutez votre commentaire ici

Ce champ accepte les raccourcis SPIP {{gras}} {italique} -*liste [texte->url] <quote> <code> et le code HTML <q> <del> <ins>. Pour créer des paragraphes, laissez simplement des lignes vides.