Le Servomoteur ! comment ça marche ?
Principe général du servomoteur
Utilisation pour nos systèmes micro-programmé
Fonctionnement d’un servomoteur standard
Quelles différences entre servomoteurs digital (numérique) et analogique ?
Avantages à embarquer un microcontrôleur
Construction et Fonctionnement d’un servomoteur
Utilisation des servomoteurs en mode programmé
Passons maintenant à un côté pratique :
Gestion de la durée de la pulsation de commande :
Principe général du servomoteur
Un servomoteur est avant tout un dispositif asservi en position.
C’est un système capable d’assurer et de maintenir une position.
Il existe une variété de dispositif nommé “Servomoteur” dans une gamme d’utilisation assez élargie.
L’industrie est le précurseur de l’utilisation d’équipements asservies en position, le terme de servomoteur a donc une origine industriel. A l’origine le servomoteur est un préactionneur, a plupart du temps pneumatique (système membrane/ressort), plus rarement hydraulique ou électrique d’une vanne de régulation. Dans ce cas l’asservissement de position est toujours effectué par un organe distinct nommé positionneur.
Un servomoteur est un système motorisé capable d’atteindre des positions prédéterminées, puis de les maintenir. La position est : dans le cas d’un moteur rotatif, une valeur d’angle et, dans le cas d’un moteur linéaire une distance. On utilise des moteurs électriques (continu, asynchrone, brushless) aussi bien que des moteurs hydrauliques. Le démarrage et la conservation de la position prédéterminée sont commandés par un système de réglage.
Le système de réglage souvent électronique compare le signal à une valeur prescrite de la position de consigne. S’il y a une déviation, le moteur est commandé dans la direction qui garantit le plus petit chemin à effectuer pour arriver à la valeur de consigne. Cela a pour conséquence de faire diminuer l’écart. La procédure se répète aussi longtemps et, jusqu’à ce que la valeur courante se trouve incrémentalement ou par l’intermédiaire d’une approximation dans les seuils de tolérance de la valeur consigne. Alternativement, la position du moteur peut être saisie aussi numériquement et comparée via un ordinateur approprié à une valeur prescrite.
Il existe une vaste gamme de servomoteurs : des gros modèles industriels de plusieurs kilogrammes à courant alternatif, avec des boîtiers et carters d’engrenages en métal, jusqu’aux minuscules servomoteurs en plastique de quelques grammes à courant continu que l’on retrouve en modélisme dans les avions, les bateaux, les voitures et les hélicoptères modèles réduits.
Je limiterais cette petite étude à des servomoteurs utilisable dans nos petits montages µsystem. Une utilisation assez comparable en nature à celui du monde du modélisme. Pour un usage sur des systèmes programmés, seul la manière de générer et de contrôler la consigne d’origine se différencie du mode du modélisme qui utilise principalement une consigne radio-commandé.
Utilisation pour nos systèmes micro-programmé
Comme pour le modélisme le servomoteur sera utilisé en µsystem pour réaliser des déplacements en translation ou en rotation sur des montages de taille et de puissances limités.
Mais même dans ces limites d’usage assez fermé, il existe une grande variété et qualité de servomoteur, se différenciant par leur vitesse de rotation/seconde , par leur course en degré et par leur couple exprimé en kg.cm .
Ils se distinguent également par la matière utilisée et le montage éventuel sur roulements …
C’est un ensemble mécanique et électronique comprenant :
Un moteur à courant continu de très petite taille ;
Un réducteur en sortie de ce moteur diminuant la vitesse mais augmentant le couple ;
Un potentiomètre (faisant fonction de diviseur résistif) qui génère une tension variable, proportionnelle à l’angle de l’axe de sortie ;
Un dispositif électronique d’asservissement ;
Un axe dépassant hors du boîtier avec différents bras ou roues de fixation.
En modélisme les servosmoteur servent à actionner les parties mobiles du modèle : ailerons, volets et trains pour les avions, contrôle de direction dans le cas de modélisme automobile… À cette fin, les moteurs sont asservis et obéissent à une commande externe, généralement transmise par radio
Dans nos utilisations micro-programmé on va principalement retrouver les servomoteurs en robotique. Ils seront utilisés à chaque fois que l’on aura besoin d’effectuer un positionnent, un déplacement, de façons générale dès que nous auront besoin d’effectuer une action dynamique sur l’un de nos objets, contrôler par l’un de nos micro-contrôleur.
Fonctionnement d’un servomoteur standard
Mécaniquement, il s’agit d’un moteur avec réducteur. Le mouvement de sortie est une rotation . Lorsque le moteur tourne, l’axe du servomoteur change de position , ce qui modifie la résistance du potentiomètre. Le rôle de l’électronique est alors de commander le moteur pour que la position de l’axe de sortie soit conforme à la consigne reçue .
La commande se fait via une petite impulsion, une consigne de position codé en largeur d’impulsion plus communément appelé PWM ( P ulse W ide M odulation en français MLI M odulation à L argeur d’ I mpulsion). Cela signifie que c’est la durée des impulsions qui détermine l’angle absolu de l’axe de sortie et donc la position du bras de commande du servomoteur. Le signal est répété périodiquement, en général toutes les 20 millisecondes, ce qui permet à l’électronique de contrôler et de corriger continuellement la position angulaire de l’axe de sortie, cette dernière étant mesurée par le potentiomètre.
La durée de cette impulsion de consigne est comprise entre 1ms et 2ms. La valeur intermédiaire de 1,5ms donne au servomoteur la position centrale, à 90° en général.
Commande en largeur d’impulsion : la largeur des impulsions, comprise en général entre 1 et 2 millisecondes, commande la position du servomoteur.
L’augmentation de l’amplitude des impulsions agit sur le contrôle de la vitesse jusqu’au moment où le bras du servomoteur se trouve dans la position souhaitée . Durant la rotation , le potentiomètre indique au circuit électronique le moment où la position désirée est obtenue . Les impulsions diminuent alors d’amplitude jusqu’à ce que plus aucune tension soit appliquée au moteur du servomoteur tout en conservant le bras dans sa nouvelle position .
Inconvénient : l’impulsion est forte et instantanée , entraînant aucune continuité de la rotation initiée comme pourrait le faire une mise sous tension continue . Les petites impulsions de commande ne produisent que de faibles effets . Ils peuvent se révéler inefficaces et sont les causes de l’importante zone neutre qui caractérise les servomoteurs traditionnels .
Quelles différences entre servomoteurs digital (numérique) et analogique ?
Qu’il soit Analogique ou Digital, un servomoteur contient le même moteur, les mêmes engrenages mais aussi le même potentiomètre.
Où est donc la différence ? … il embarque un microcontrôleur en lieu et place de l’étage de commande électronique (analogique).
Avantages à embarquer un microcontrôleur
Le microcontrôleur embarqué dans le servomoteur est capable de transformer la consigne de position, en une chaîne de pilotage au moteur plus dynamique.
L’échantillonnage de la commande moteur passe d’un signal à 50Hz à un pilotage en PWM à 300Hz. Cela confère une bien meilleur dynamique :
Une rapidité accrue du temps de réponse du moteur.
Donc un temps d’atteinte à la consigne plus court.
La mémorisation de la consigne de base, apporte un autre avantage :
Celui de maintenir la position dans l’état jusqu’à tant qu’une nouvelle consigne est appliqué.
Le servomoteur Numérique (Digital) gagne ainsi en finesse et en précision, réduisant également sa zone “neutre” tout en garantissant une bien meilleur stabilité statique. Car la position finale est contrôlé et compensé tant qu’une nouvelle consigne n’est pas demandé.
Inconvénient du servomoteur digital
une plus grande consommation d’énergie
Construction et Fonctionnement d’un servomoteur
Utilisation des servomoteurs en mode programmé
Passons maintenant à un côté pratique :
Dans cette première étape étudions la mise en œuvre d’un servomoteur avec un Arduino.
Je vous ai indiqué que la consigne à transmettre à un servomoteur était du type PWM. Cela étant dit il faut pour assurer un pilotage correct entrer dans quelques détails de fonctionnements particuliers aux servomoteurs.
Le signal PWM destiné aux servomoteurs doit impérativement être cadencé à une fréquence de 50Hz.
Soit une pulsation de signal toute les 20ms, comme représenté dans le schéma suivant :
Cela tombe bien, me direz-vous, l’Arduino possède précisément une fonction pour traiter le mode PWM :
La fonction analogWrite().
Loupé, car cette fonction distribue un signal PWM de fréquence 500Hz, soit 10x trop important pour être comprise par notre servomoteur. Alors comment faire ? … Nous allons voir cela un peut pus loin.
Avant d’émettre notre consigne regardons d’abord comment faire comprendre au servomoteur comment atteindre telle distance, à telle vitesse et dans tel sens.
Gestion de la durée de la pulsation de commande :
Vous vous en doutiez, en effet c’est cette largeur d’impulsion qui indiquera la nature de l’action à effectuer par le servomoteur.
Mais comment ça marche ?
Attention !! et retenez bien cela …. Toute la subtilité de la commande d’un servomoteur se joue sur une toute petite milliseconde. Oui! une seule milliseconde , 1ms.
Exemple :
Prenons un servomoteur standards, qui fonctionne sur une plage de 180°. Considérons qu’il se trouve en son point central, usuellement indiqué comme point ‘neutre’ à 90°.
Bien, alors pour effectuer un positionnement à 0° (soit vers la droite de mon cercle trigonométrique) j’appliquerais une consigne, une pulsation de 1ms, répété toute les 20ms.
Vous aurez immédiatement compris que pour positionner le servomoteur à l’angle opposé, cad à 180°, je vais donc appliquer une consigne, une pulsation de 2ms, à une cadence de 50HZ.
Et pour revenir au point neutre à 90°, c’est tout à fait proportionnel, il faut donc appliquer une consigne, une largeur d’impulsion de 1,5ms avec toujours la même fréquence de 50Hz. c’est tout …
Cela est illustré par le schéma suivant :
Et pour la vitesse ?
Rien à dire, car rien à faire … ?? J’explique (oui quand même un peut) ,c’est en fait la boucle de régulation du servomoteur qui s’occupe de tout, selon un seul objectif : aller à la valeur demandé le plus vite possible et de façons stabilisée.
Selon la performance mécanique des servomoteurs, cela va légèrement différer, en respectant toujours la même règle. Faire le job le plus vite possible ! Cela implique que plus la consigne est éloigné de la position courante, plus l’on va monter en vitesse, en décélérant à l’approche de la consigne, la valeur courante étant donnée par le potentiomètre monté sur l’axe de sortie du servomoteur. (le feeback de la boucle de régulation)
Oui mais ! Mais quoi ?
Mais pour les servomoteurs à rotation continue, on fixe bien la vitesse, NON ?
En fait, on utilise exactement la même méthode. Mais, mais on triche sur un seul paramètre. Oui mais lequel ?
Soit vous trouvez tout seul, soit vous allez voir sur mon prochain article.
“Transformation en servomoteur à rotation continue”
Vous allez me dire, ça va pas être coton pour piloter le servomoteur avec une finesse aussi pousser, tout se joue en 1ms.
Rassurez-vous et comme d’ab, les développeurs ont déjà fait tout le job pour vous, il suffit comme toujours de choisir la bonne librairie de travail.
C’était bien la peine de nous prendre la tête avec toute cette théorie. Oui vraiment oui, c’est beaucoup mieux de comprendre les concepts des objets que l’on manipule.
Bon alors, on y va à cette programmation ??
Ok ! Réalisons d’abord le montage. La connectique d’un servomoteur est composé de trois fils :
Deux pour l’alimentation (Vcc et la masse) et le dernier pour le signal de commande.
1 fil de masse - noir ou marron -
1 fil de tension d’alimentation de 4 à 6V - rouge -
1 fil de tension de commande 0-5V - blanc, jaune voir orange selon les constructeurs -
Un servomoteur accepte généralement une plage d’alimentation comprise entre 4.5V et 6V (à 6V il aura plus de couple et sera un peu plus rapide qu’à 4.5V).
On peut, sans être du tout recommander, utiliser la tension de 5V distribuer par l’Arduino, mais attention l’alimentation de l’Arduino n’est pas conçu pour fournir un courant important. On risque de détériorer définitivement l’Aduino.
Il est bien préférable d’utiliser une Alimentation complémentaire de 6V. Dans ce cas, n’oubliez pas de relier la masse de l’alimentation externe et celle de l’Arduino afin de garder un référentiel électrique commun.
Le montage sur un Arduino Uno :
Et enfin le programme !
Enfin presque, d’abord quelle librairie utiliser, pour ne par être obligé de gérer en dur cette notion de temps de signal.
L’équipe Arduino, a bien fait le travail, en proposant une bibliothèque nommé très a propos “Servo“.
1er action : inclure la fameuse bibliothèque dans notre code.
Puis on crée une instance, un objet ‘Servo’, je propose de l’appeler ‘testServo’.
Bien sur il faudra crée une instance de ce type pour chaque servomoteur à creer dans notre programme.
Maintenant nous devons indiquer à quelle broche est attaché physiquement le servomoteur.
La méthode (fonction à utiliser) de nommer précisément “attach()”, elle prend 3 arguments :
Le numéro de la broche sur laquelle est relié le fil de signal
La valeur basse (angle à 0°) de la durée de l’état haut du signal de PWM en microsecondes (optionnel, défaut à 544 µs)
La valeur haute (angle à 90°, 180°, 360°, etc.) de la durée de l’état haut du signal de PWM en microsecondes (optionnel, défaut à 2400 µs)
Dans l’exemple du servomoteur standard décrit précédemment, on obtient :
#include <Servo.h> Servo monServo; void setup() { monServo.attach(2, 1000, 2000); }
Voilà notre servomoteur initialisé, nous pouvons maintenant lui passer une consigne.
En général pour s’assurer de sa position dite ‘neutre’, dans la phase d’initialisation, il est fréquent de positionner le servomoteur dans cette phase, en demandant une consigne de 1,5ms. Dans le cas présent une valeur d’angle de 90°.
Pour cela, nous allons utiliser la méthode (fonction) prévue à cet effet : write()
En intégrant cette commande dans le code précédent, j’obtiens le programme complet suivant :
#include <Servo.h> Servo monServo; void setup() { monServo.attach(2, 1000, 2000); monServo.write(90); } void loop() { }
On aurait pu ajouter une commande de positionnement dans le corps du programme (boucle loop), vous avez maintenant compris comment cela fonctionne, alors à vous maintenant de jouer.