HerkuleXLib: exemple d’utilisation

Dans cet article la librairie HerkuleXLib est utilisée dans sa version 1.1 et Arduino IDE dans sa version 1.6.5.

Cet article donne des exemples d’utilisation de servomoteurs HerkuleX DRS-0101 avec une carte Arduino MEGA. Pour plus de détails sur les fonctions de la librairie, reportez-vous à la documentation utilisateur (téléchargeable et consultable en ligne). Pour plus de détails sur le fonctionnement des servomoteurs, reportez-vous au manuel utilisateur (téléchargeable).

1 Préparation

Les 3 servomoteurs sont branchés sur le port Serial1 de la carte Arduino. Cette dernière est aussi branchée à l’ordinateur via le port USB pour retourner les informations au travers du terminal série. La librairie HerkuleXLib doit être installée comme décrit dans son manuel opérateur.

HerkuleXLib: wiring 3 servos

HerkuleXLib: cablage photoL’architecture général de la librairie est décrite dans un article précédent.

2 Configurer des servomoteurs

2.1 Introduction

Les servomoteurs possèdent 60 paramètres qu’il est possible de consulter et/ou modifier. Ils sont listés pages 26 à 29 du manuel opérateur des servomoteurs. La librairie HerkuleXLib permet de les consulter/modifier sauf :

  • Les paramètres Reserved
  • ACK Policy doit avoir la valeur 1 (valeur par défaut), sans quoi la librairie ne fonctionne pas correctement.

Les fonctions disponibles pour la configuration sont celles de la classe HkxSetup. Les paramètres ont été regroupés par fonctionnalités, précédées de “get” pour lire la valeur ou de “set” pour modifier les valeurs. Le préfixe “setOne” ne s’applique qu’à un servomoteur, quand “setAll” permet de modifier les valeurs de paramètres pour tous les servomoteurs connectés.

2.2 Créer le programme

L’écriture du code se fait avec le logiciel Arduino IDE. Lancez le logiciel, créez un nouveau fichier (menu Fichier > Nouveau), et sauvegardez-le (menu Fichier > Sauvegarder) – nommez-le comme il vous convient. Inclure HkxSetup en en-tête du projet. Créons maintenant les instances des classes HkxPrint, HkxCommunication et  HkxPosControl.

La classe HkxPrint gère le retour des données (messages d’information, d’alerte et d’erreur) au travers d’un port série. L’instance printoutLib retourne les messages par défaut (les erreurs seulement) sur le port Serial (USB) à 9600 bps. L’instance printoutCode est une copie de printoutLib qui retourne par contre tous les types de messages (informations, alertes et erreurs).

La classe HkxCommunication gère la communication avec les servomoteurs, elle s’assure que les données envoyées et reçues respectent le protocole (manuel des servomoteurs pages 18 à 20 et 40 à 50). Sa première variable est la vitesse de transmission qui peut prendre les valeurs HKX_57600, HKX_115200, HKX_200000, HKX_250000, HKX_400000, HKX_500000, et HKX_666666, correspondant respectivement à des vitesses de 57600, 115200, 200000, 250000, 400000, 500000 et 666666 bps. L’instance communication travaille sur le port Serial1, à 115200 bps (valeur par défaut), les messages étant retournés par l’instance printoutLib.

Comme mentionné dans le manuel de la librairie, la vitesse de transmission à 57600 bps est fortement déconseillée pour les servomoteurs car elle produit des erreurs de communication.

La classe HkxSetup permet de configurer les servomoteurs. L’instance setupServos communique avec les servomoteurs au travers de l’instance communication et retournera ses messages par printoutLib.

2.3 J’ai un problème d’identité

Le protocole des servomoteurs attache une instruction à un identifiant (ID), or par défaut, les servomoteurs ont le même identifiant ID = 253 ! Nous commençons par donner une valeur spécifique à chaque servomoteur ID = 0, ID = 1 et ID = 2. Pour cela il faut brancher un servomoteur à la fois, puis exécuter le code précédemment écrit en y rajoutant les lignes suivantes, et en modifiant la valeur de newID pour chacun d’entre eux. Le processus s’est bien passé si le message Info: ID modified :) s’affiche sur le terminal série.

Les variables statusED et err, et la fonction getStatus(uint8_t ID, HkxStatus &statusED) nous permettent de vérifier qu’un ID est bien connecté. La fonction setID (uint8_t ID, uint8_t newID) modifie l’ID du servomoteur.

Vous pouvez télécharger le code ici.

Maintenant que vous avez réglé votre problème d’identité, vous pouvez rebrancher tous les servomoteurs pour passer à la suite.

2.4. Configuration des servomoteurs

Passons à l’écriture du code pour configurer les servomoteurs en repartant du code du paragraphe 2.2. Nous accélérerons la vitesse de communication, puis modifions le profil de la commande de charge pour rajouter un effet élastique, réduisons la limite admissible de la charge, et  modifions l’asservissement (PID) ainsi que les critères de position. Nous partons enfin à la recherche de nos identités, de notre comportement et de notre statut (vaste programme !).

Je vais décortiquer avec vous ce morceau de code :

HerkuleXLib: Commande chargeLes valeurs proposées donne la courbe – obtenue avec une petite routine scilab :

HerkuleXLib: Figure load control curve

La modification de l’asservissement, en particulier lorsqu’on le rend plus ferme, peut aboutir à des cas d’utilisation hors des limites du servomoteur et entraîner de la casse. C’est la raison pour laquelle nous abaissons aussi la charge maximale (profil de la commande de charge) et la charge limite (qui déclenche une erreur).

Pour les fonctions que nous venons d’énumérer, prenez le temps de vérifier les unités et les grandeurs dans manuel de la librairie pour les méthodes de la classe HkxSetup et pour les méthodes de la classe HkxStatus.

Le terminal série devrait afficher quelque chose ressemblant à

Notez que l’erreur Invalid Packet est due au fait que j’ai exécuté le code plusieurs fois pour les tests et donc la première requête est envoyée avec une mauvaise vitesse de communication, ce qui génère des paquets erronés. Si vous exécutez une deuxième fois le code, vous aurez la même erreur. Aussi, vous pouvez vérifier que vous obtenez en plus une erreur de tension en débranchant l’alimentation 7,4 V pour ne conserver que l’alimentation de l’USB (5 V). La vidéo suivante montre l’exécution du code.

Vous pouvez télécharger le code ici.

3 Piloter 1 servomoteur

3.1 Créer le programme

Créons un nouveau fichier (menu Fichier > Nouveau), et sauvegardons-le (menu Fichier > Sauvegarder) – nommez-le comme il vous convient. Inclure HkxPosControl en en-tête du projet. Créons maintenant les instances des classes HkxPrint, HkxCommunication et  HkxPosControl.

Nous voyons que le début du code est très semblable à celui de la configuration. Seulement, au lieu de créer une instance de HkxSetup, qui permet de configurer tous les servomoteurs branchés, quelque soit leur nombre, nous créons une instance de HkxPosControl qui est dédiée à piloter 1 servomoteur défini. L’instance servo communique avec les servomoteurs au travers de l’instance communication et retournera ses messages par printoutLib.

3.2 En route pilote

Nous pouvons maintenant piloter notre servomoteur. Nous nous repenchons sur le statut en injectant une trame erronée. Activons ensuite la DEL en rouge, puis faisons un mouvement avec attente de l’arrivée, et enfin un second mouvement pour lequel nous reprenons la main tout de suite pour visualiser le comportement du servomoteur en temps réel pendant le mouvement.

Regardons de plus près les fonctions utilisées :

Pour les fonctions que nous venons d’énumérer, prenez le temps de vérifier les unités et les grandeurs dans manuel de la librairie pour les méthodes de la classe HkxPosControl et pour les méthodes de la classe HkxStatus.

Le terminal série nous donne

La vidéo suivante montre l’exécution du code.

Vous pouvez télécharger le code ici.

4 Piloter 3 servomoteurs

4.1 Créer le programme

Repartons d’une base saine : créons un nouveau fichier (menu Fichier > Nouveau), et sauvegardons-le (menu Fichier > Sauvegarder). Inclure cette fois HkxGroupPosControl en en-tête du projet. Créons enfin les instances des classes HkxPrint, HkxCommunication et  HkxGroupPosControl.

Vous voyez que le code est identique au précédent à la différence près que nous créons autant d’instances de HkxPosControl qu’il y a de servomoteurs. Ces instances sont fournies à l’instance de HkxGroupPosControl sous forme d’un tableau de pointeurs pour éviter les copies inutiles. Je vous invite une fois de plus à consulter les détails du constructeur dans le manuel de la librairie.

4.2 Piloter 3 servomoteurs : pour les as du volant !

Nous pouvons maintenant piloter nos servomoteurs. Nous commençons par activer la DEL en mauve et mettre la commande de charge en frein. Nous faisons ensuite un premier mouvement synchronisé (même durée de mouvement) des 3 servomoteurs, et enfin un second mouvement asynchrone (durée de mouvement différente).

Regardons de plus près ce code :

Pour les fonctions que nous venons d’énumérer, prenez le temps de vérifier les unités et les grandeurs dans manuel de la librairie.

Le terminal affiche

La vidéo suivante montre l’exécution du code.

Vous pouvez télécharger le code ici.

Laisser un commentaire

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