Hé! Vous semblez être en United States, souhaitez-vous utiliser notre site English ?
Switch to English site
Skip to main content

Dotez votre robot des mêmes commandes de mobilité qu'un Mars Rover : troisième partie

La première partie portait sur les principes théoriques de la commande PID. Dans la deuxième partie, nous avons abordé les aspects pratiques de l'odométrie et de l'utilisation de la commande PID pour la manipulation précise des robots mobiles. Nous allons maintenant étudier davantage le code et d'autres aspects pratiques de la conception d'un rover.

Mars_Curiosity_wheels_28d1fcd7c0159c4a35e5b47479d99c31905cbd81.png

Roue endommagée du rover Mars Curiosity         Crédit photo : NASA/JPL

Un système à boucle fermée de commande de vitesse des roues

J'ai mis en place un système en deux parties :

  • D'abord un programme de haut niveau écrit en FORTHdsPIC, un dialecte du langage Forth pour commandes intégrées. Ce code assure les "fonctions cérébrales" les plus élevées, telles que la surveillance et la réponse aux entrées des capteurs pour le pilotage des moteurs d'après un plan directeur. Ce plan directeur pourrait par exemple consister à explorer et cartographier une partie de terrain tout en évitant les trous et les murs. Le programme de démonstration du listing 1 est très rudimentaire : il ne fait qu'attendre les mises à jour du système tachymétrique des roues pour calculer les nouvelles valeurs de commande destinées au système d'entraînement des moteurs.
  • Ensuite un code de bas niveau minimaliste pour déterminer la vitesse de rotation d'une roue d'après les données d'impulsions fournies par un tachymètre à disque à fentes (deuxième partie). Ce code fait partie d'une routine de service d'interruption (ISR) qui mesure l'intervalle de temps entre chaque impulsion à l'aide du matériel de capture d'entrées du dsPIC. Il n'est pas nécessaire de convertir l'intervalle en vitesse : cela signifie simplement que la valeur de consigne utilisée pour calculer l'erreur doit être elle aussi spécifiée comme intervalle de temps. La routine ISR calcule également les nouvelles valeurs brutes (sans application de facteur K) pour les paramètres d'erreur, I et D de la boucle de commande moteur. Les valeurs calculées sont enregistrées en mémoire RAM pour être lues par le programme de haut niveau. Le code ISR s'exécute uniquement lorsque le front montant d'une impulsion tachymétrique déclenche l'interruption. Les données brutes en RAM sont donc mises à jour après chaque impulsion tachymétrique.

La routine ISR tachymétrique assure le plus gros du travail pour l'algorithme PID, tandis que le code Forth se charge d'appliquer les facteurs K et de mettre à l'échelle les nombres afin de créer une valeur de commande pour le pilote de servomoteur PWM. Ce partage des tâches permet d'obtenir une souplesse maximale du programme. La routine ISR fait partie de l'environnement intégré FORTHdsPIC programmé dans la mémoire flash du système cible. Le code Forth de haut niveau, toujours fourni par l'utilisateur, est généralement téléchargé dans la RAM sous forme de fichier texte à partir d'un PC hôte. Le code utilisateur peut ainsi spécifier la combinaison de variables P, I et D à utiliser, ainsi que les facteurs K et la valeur de consigne.

PID3_blog_11_201cc08b28697b30ae36b4baa4e48953ee8db7de.png

Étude plus détaillée du programme de haut niveau

Les cinq premières lignes du listing 1 sont les "définitions à deux-points" (Colon-Definitions) des nouveaux mots qui seront utilisés dans le programme. LIMIT sert à limiter la plage numérique de l'élément de pile supérieur. PROP, INTL et DERV effectuent chacun l'opération combinée de mise à l'échelle et d'application des facteurs K sur les variables brutes P, I et D, le résultat de l'opération étant laissé dans la pile. PID effectue la sommation de ces trois composantes.

Vient ensuite la définition du programme de haut niveau contenant la boucle de commande qui s'exécutera en continu lorsque l'utilisateur tapera MAIN <Entrée> à l'invite de commande. Les premières lignes de MAIN ne s'exécutent qu'une fois. Elles servent à initialiser certaines variables et à démarrer le moteur pendant 60 ms avant la "fermeture" de la boucle. Voir "Problèmes pratiques" ci-dessous.

Enfin, nous avons le code de commande PID contenu dans la boucle BEGIN… AGAIN. Vous vous rappelez que le programme ne calcule de nouvelle valeur de commande que lorsque la routine ISR tachymétrique renvoie des valeurs mises à jour. Il sort donc de la boucle BEGIN… UNTIL dès que l'indicateur PULSE est défini par la routine ISR. L'indicateur est alors réinitialisé et le mot PID effectue le calcul pour générer une nouvelle sortie de commande. Par simple précaution contre d'éventuelles valeurs de commande négatives ou surdimensionnées, LIMIT s'exécute avant que la nouvelle valeur ne soit envoyée à la routine CSERVO. Et le tour est joué !

Améliorer la précision

Les mesures fournies par les tachymètres montés sur roues sont assez imprécises. Cette précision peut être considérablement améliorée par l'utilisation d'une boîte de réduction entre le moteur et la roue. Monté sur l'arbre de sortie du moteur, et non sur l'essieu de roue, le capteur tachymétrique tournera n fois plus vite à chaque rotation de la roue, où n est le rapport de transmission. Ainsi, pour un disque de tachymètre à 20 fentes et un rapport de transmission de 100:1, on aura 2 000 impulsions générées à chaque tour de roue. Évidemment, encore faut-il que le processeur soit capable de gérer une telle fréquence d'interruptions !

Problèmes pratiques – Démarrage

Il est possible de limiter l'effet de données tachymétriques non valides lors des premières impulsions suivant le démarrage en forçant le moteur à exécuter une boucle ouverte sur un intervalle court. D'après mon expérience, un délai de 60 ms avant d'utiliser les données tachymétriques est suffisant dans ce cas. La valeur de commande du moteur utilisée pour le démarrage doit être la valeur générée par la boucle PID lorsque le moteur tourne au régime de consigne. Pour la déterminer, il suffit d'utiliser un petit programme qui exécute la boucle ouverte du moteur avec un paramètre particulier et lit la vitesse correspondante du tachymètre à l'ordinateur. On peut alors tracer une "courbe d'étalonnage" à partir d'une série d'entrées de commande. Dans le programme de démonstration, une valeur de commande de 30 correspond approximativement à un régime de consigne de 1 800. Pour réduire encore davantage le hiatus au démarrage, vous pouvez prérégler l'intégrale à sa valeur cible. Lors de l'exécution au régime cible, vous obtiendrez ainsi ERROR = 0, de sorte que la seule composante non nulle entre P, I et D soit l'intégrale. INTL donne alors une valeur de 30. Puisqu'on utilise ici un facteur K de 0,01, la variable de données brutes INTEG doit être initialisée à 3 000.

Problèmes pratiques – Fonctionnement sous charge

Les chiffres utilisés dans mon programme de démonstration valent pour un robot entièrement levé, dont les roues ne touchent pas le sol, c'est-à-dire dont le moteur tourne avec peu ou pas de charge. Au sol, le moteur devra travailler beaucoup plus dur : pour atteindre son régime cible, une entrée de commande plus importante sera nécessaire. Cela ne devrait pas poser de problème pour autant que vous ayez sélectionné des moteurs assez puissants pour les besoins de l'application, avec de la marge. Dimensionner les moteurs et le train motopropulseur en fonction de la charge probable, c'est l'une des étapes initiales les plus cruciales de la conception, et vous n'aurez pas droit à l'erreur (voir "Construire le groupe motopropulseur" ci-dessous). Pour maintenir le régime de consigne maximum sélectionnable, le contrôleur PID doit être capable d'augmenter la puissance du moteur pour faire face au pire obstacle envisageable.

Utilisation de servomoteurs "hobby"

Mon robot est minuscule et ses moteurs sont dimensionnés en conséquence. Il s'agit de servomoteurs de type modélisme ou "hobby", modifiés pour obtenir une rotation continue et commandés par un signal à modulation de largeur d'impulsion (PWM) de 50 Hz. Un servomoteur se compose d'un minuscule moteur à balais à aimant permanent c.c. (PMDC), d'une boîte de vitesses de grandes dimensions et d'un circuit électronique de commande. Peut-être vous posez-vous la question "Un servomoteur standard ne contient-il pas déjà un système de contrôle à contre-réaction ?". Réponse : oui, mais ce système sert seulement à définir la position de l'arbre de sortie sur une plage de 0 à 180 degrés. Les servomoteurs de type hobby ont été conçus à l'origine pour déplacer sur des angles réduits les surfaces de commande (gouvernails, élevons, etc.) d'avions radiocommandés, et non pour faire tourner des roues. Voici un tutoriel vidéo qui donne une bonne introduction aux servomoteurs hobby et explique la bonne façon de les commander :

Voilà quelques années, quelqu'un a découvert qu'il suffisait d'une part de remplacer le potentiomètre contre-réaction de position par un potentiomètre manuel, d'autre part de rompre la butée en plastique qui empêche l'arbre de sortie de tourner complètement, pour obtenir un servomoteur à rotation continue. Le signal PWM standard peut alors commander la vitesse de rotation de l'arbre de la vitesse de marche arrière maximum avec des impulsions de 1 ms jusqu'à zéro à 1,5 ms, puis de nouveau jusqu'à la vitesse de marche avant maximum à 2 ms. Le désavantage, c'est que ce faisant on perd le contrôle à contre-réaction intégré. Il faut alors utiliser un potentiomètre manuel de type trimmer à position zéro, afin d'empêcher toute rotation lorsque des impulsions de 1,5 ms sont appliquées à l'entrée de commande. L'avantage, c'est que le moteur ainsi obtenu peut être connecté directement à une broche GPIO et commandé par voie numérique via le matériel PWM intégré de la puce. La plupart des microcontrôleurs offrent de multiples canaux PWM n'exigeant que de petites quantités de code pour fonctionner. Mieux encore, de nombreux servomoteurs à rotation continue sont disponibles dans le commerce.

Utilisation de moteurs de plus grandes dimensions

Si vous optez pour un moteur PMDC plus puissant, vous devez utiliser une interface de commande spéciale entre le moteur et le microcontrôleur. Des moteurs c.c. à balais avec courant de blocage d'environ 1 à 2 A sont disponibles un peu partout et à bon marché. Cette taille de moteur est idéale pour un usage pédagogique, ainsi que pour le prototypage avant de passer au niveau supérieur en termes de puissance et de coût. Les moteurs PMDC sont particulièrement faciles à travailler du fait de la linéarité de leurs caractéristiques (Fig. 1).

PID3_blog_2_ede91f3b3455db3d88bca2c56eeafd1d691fcdac.png

Notez que le régime moteur hors charge est proportionnel à la tension appliquée. Le couple ou la force de rotation du moteur sont inversement proportionnels au régime. Il s'agit d'une caractéristique très appréciable, le couple maximum étant disponible dès que la tension est appliquée au moteur. Le courant du moteur suit la même ligne et tombe au minimum (proche de zéro) lorsque le moteur atteint son régime maximum hors charge.

Beaucoup d'utilisateurs sont tentés de connecter le moteur directement à la roue et d'obtenir un régime réduit en utilisant une basse tension moteur fixe, sans contrôle à contre-réaction. Les courbes de couple montrent ce qui se passe lorsque vous procédez de cette façon. En effet, ces lignes de couple bleues sont en nombre infini, puisqu'il y en a autant que de tensions possibles. Si vous sélectionnez le régime hors charge S1, correspondant à la tension V1, alors le couple maximum que vous pourrez obtenir sera T1, soit une fraction de la capacité du moteur à plein régime. Il est d'ailleurs probable que le robot ne puisse même pas démarrer, le couple de blocage n'étant pas suffisant pour vaincre l'adhérence du sol. Mieux vaut opter pour le régime hors charge plus élevé S2 et utiliser une boîte de réduction pour atteindre la vitesse sur route désirée. Dans ce cas, le moteur tourne à S1 tr/min lorsqu'il tourne sous charge. Vous gagnez donc sur les deux tableaux : la boîte de vitesses réduit le régime tout en multipliant le couple fourni à la roue selon le même rapport.

Travailler sans commande PID

Lorsqu'aucun contrôle de vitesse par rétroaction n'est appliqué, la tension du moteur V reste constante. Si le robot commence à monter une colline, le couple nécessaire aux roues augmente et le point de fonctionnement remonte la ligne de couple pour la tension V, de sorte que le régime moteur diminue. Si la pente augmente, le régime continue à baisser jusqu'à ce que le moteur se "bloque" une fois atteint le couple maximum pour cette tension. Naturellement, en augmentant V, on obtiendrait plus de couple, pour autant que le maximum nominal ne soit pas dépassé. Cette variation du régime en fonction de la charge est cependant indésirable.

Ajouter une commande PID

La commande PID permet de varier automatiquement la tension V selon la charge, en détectant le régime moteur à l'aide d'un tachymètre et en tentant de le maintenir constant. Ainsi, lorsque la PID détecte une augmentation de la charge en mesurant la baisse de régime, la boucle de commande augmente V pour compenser. Sur le graphique, le point de fonctionnement se déplace sur la courbe suivante conformément à l'augmentation de V. Cette nouvelle courbe, à droite de la première, porte des valeurs de couple plus élevées à régime égal. Le contrôle à contre-réaction permet ainsi d'exploiter à fond les capacités d'un moteur donné.

Heureusement, il est toujours possible d'utiliser un signal PWM, quoique dans un format différent de celui qui est utilisé dans les servomoteurs hobby, avec une interface à courant élevé pour commander le régime du moteur PMDC. Dans ce cas, la fréquence d'impulsion sera comprise dans la plage kHz et le rapport cyclique pourra varier de presque zéro à 100 %. Cela fonctionne parce que la tension c.c. moyenne d'un signal PWM est proportionnelle au rapport cyclique d'impulsion. La vidéo suivante illustre le fonctionnement d'un contrôleur pont H IC C298 avec PWM :

Construire le groupe motopropulseur

Le principe du signal PWM expliqué dans la vidéo ci-dessus est le suivant : la puissance est appliquée au moteur pendant l'impulsion et déconnectée pendant le reste du cycle. Si vous coupez le signal PWM complètement, le moteur tourne en roue libre jusqu'à ce que le frottement et autres pertes l'amènent à s'arrêter.

Il faut maintenant nous intéresser au train motopropulseur. Un rover planétaire n'est pas destiné à rouler très vite ni à transporter de gros (et donc lourds) moteurs. Par conséquent, le groupe motopropulseur devra fournir un couple élevé pour que le rover puisse monter les pentes et surmonter les obstacles. L'exploration d'un terrain inconnu exige un déplacement lent mais précis.

Supposons par exemple que nous utilisions un moteur c.c. avec balais fournissant un régime hors charge d'environ 6 000 tr/min. Le moteur choisi devra fournir assez de couple au régime sous charge minimum d'environ 1 500 tr/min lorsque le rover roule sur du plat. La vitesse de rotation des roues doit être ramenée à un régime plus tranquille, disons de l'ordre de 10 tr/min, ce qui exige un rapport de réduction de 150:1. Le signal PWM devrait ainsi disposer d'un rapport cyclique minimum d'environ 50 %. Nous prévoyons ici une marge supplémentaire pour que la boucle de commande PID puisse gérer les pentes et les obstacles sans ralentissement. Il s'agit également d'assurer qu'au moins la moitié du couple de blocage maximum soit disponible pour surmonter le frottement du sol lorsque le robot démarre au repos. Naturellement, pour que ces valeurs fonctionnent, il faut estimer le couple nécessaire aux roues du rover fini avant de sélectionner le moteur.

En ce qui concerne la boîte de vitesses, trois types sont à envisager : la boîte classique à engrenages épicycloïdal (ou planétaire) et la boîte à engrenages à onde de déformation (également appelée Harmonic Drive). Si vous construisez un rover pour aller réellement sur mars, alors cette dernière option, éventuellement complétée par un train épicycloïdal, sera votre premier choix. Les boîtes à engrenages à onde de déformation sont une invention relativement récente et offrent d'excellentes performances dans un petit format… mais le coût se justifie difficilement si vous ne travaillez pas pour une agence spatiale. Pour un petit robot de laboratoire, on trouve beaucoup d'ensembles moteur et boîte de vitesses sur le marché pour des prix plus raisonnables.

Freins

Qu'en est-il des freins ? En général, sauf si vous prévoyez que le rover doive descendre des pentes très raides, il devrait suffire de couper le signal PWM pour amener le robot à l'arrêt. Si vous craignez que le robot ne commence à descendre les pentes sous l'effet de la gravité, la solution peut être un freinage dynamique associé au moteur PMDC. (Si le robot dévale les pentes, voire tombe carrément, là, priez pour un atterrissage en douceur !). Certaines puces de commande moteur à pont H, comme la L298, offrent une fonction de freinage dynamique. Lorsque cette fonction est activée, le signal PWM est déconnecté et les bornes du moteur sont mises en court-circuit. Le moteur fonctionne alors comme un alternateur et un courant très élevé circule en sens inverse dans les enroulements. Ce flux magnétique soudainement inversé amène l'armature à un arrêt très rapide. N'espérez pas le fonctionnement d'un frein à main, mais tant que le court-circuit est maintenu, il résiste au mouvement dans une certaine mesure. Si cela ne suffit pas, alors vous aurez besoin d'un vrai frein mécanique, comme sur le Curiosity.

L'autre possibilité, c'est d'utiliser un entraînement à vis sans fin dans votre boîte de réduction. Le train vis/pignon de base étant non réversible, lorsque la vis est montée sur l'arbre moteur, elle peut bloquer la rotation.

Enfin :

La photo du haut est un "selfie" pris par le rover Curiosity de la NASA le SOL (jour martien) 1315. Les trous dans le "pneu" de la roue centrale représentent de graves dommages. Si l'on en croit les essais réalisés sur Terre avant le lancement, ces roues devaient être capables de résister à des manœuvres sur les rochers les plus acérés et les plus durs, sans subir de perforation. Après moult analyses, on a conclu à une défaillance imprévue du système de mobilité. À lire ici.

À suivre dans la quatrième partie…

Nous allons nous intéresser à divers systèmes de mobilité : certains qui offrent une direction tout en douceur, d'autres une direction "à glissement" comme celle d'un véhicule à chenilles. Pourquoi les rovers de la NASA sont-ils tous équipés d'une suspension de type "rocker-bogie" ? Nous verrons également comment utiliser une commande PID pour créer un "photovore", c'est-à-dire un robot mobile attiré par la lumière.

Si vous avez des questions sur des aspects pratiques, suivez mes messages sur Twitter. Je mets des liens vers des articles intéressants sur l'électronique et les nouvelles technologies, je retweete des publications que j'ai repérées sur les robots, l'exploration spatiale et d'autres sujets.

Engineer, PhD, lecturer, freelance technical writer, blogger & tweeter interested in robots, AI, planetary explorers and all things electronic. STEM ambassador. Designed, built and programmed my first microcomputer in 1976. Still learning, still building, still coding today.
DesignSpark Electrical Logolinkedin