Aller au contenu


Hexa Emails

Inscrit(e) (le) 18 janv. 2011
Déconnecté Dernière activité févr. 09 2014 01:37
*****

Arduino, les servomoteurs et la MLI (PWM)

Publié Hexa Emails le 02 juillet 2012 - 06:26 in Programmation

0) Je ne suis pas prof diplômé... (pas encore)

Je tiens à dire que je fais ce tuto dans le but de rendre service, il n'est pas exhaustif, s'il contient des erreurs veuillez me le signaler, il n'a pas pour but de faire du lecteur un doctorant en électronique numérique, et n'est peut être pas compréhensible par tout le monde (j'essaierai tout de même de faire au plus simple)
Les explications se limitent à l'univers de l'Arduino (bien que cela puisse être sans doute réadapté à pas mal d'autres situations), et aux servomoteurs dits "de modélisme", piloté par un signal bien particulier (voir plus bas) et ne concerne pas les servos contrôlés par I²C par exemple.


1) Qu'est-ce que la MLI (PWM) ?

Bon alors, comme dit Wikipédia, la Modulation de largeur d'Impulsions (MLI, PWM en anglais) c'est une succession de différents états logiques, (0 et 1), de différentes durées, à intervalles réguliers.

Dans le cas de l'Arduino: il s'agit de succession de 0/5V, qui permet, en modifiant la durée de chacun de ces états, de faire que tout se passe comme si on avait une source de tension continue;
Si l'on fait une MLI avec 20% d'états hauts, on aura 20% de 5V et 80% de 0V: on aura l'impression d'avoir 1V.

Il y a deux principales caractéristiques d'une MLI: son rapport cyclique et sa fréquence de découpage;
le rapport cyclique étant la proportion d'état haut par rapport au total (souvent exprimé en %, compris entre 0 et 1)
la fréquence de découpage: ben c'est la fréquence, l'inverse de la période. Une fréquence trop basse et l'on verra les clignotements de la LED, ou le moteur se mettra à vibrer; une fréquence trop haute et l'électronique ne suivra plus.


2) Comment pilote-t-on un servomoteur?

Un servomoteur c'est quoi?
C'est une boite de plastique, avec un rotor en sortie, qui peut être piloté de sorte à obtenir l'angle que l'on souhaite en sortie, entre 0 et 180°; on peut lui dire d'aller à 0°, puis à 153°, puis à 18°... (dans la limite de la précision de la commande ET du servomoteur, et a condition de ne pas éxcéder son couple maximal (l'effort maximum qu'il peut fournir)


Les servos ont trois fils qui sortent (ou entrent, suivant les optimistes/pessimistes) de leur boitier :
2 fils d'alimentation (alimentation entre 6 et 4V continus le plus souvent), et 1 fil de commande, en 0-5V

Et à l'intérieur?
Un moteur (CC à balais le plus souvent), des engrenages (pour augmenter le couple)
De l'électronique, et un capteur (un potentiomètre rotatif le plus souvent)

Quel rapport entre la MLI et les servomoteurs? Hé bien beaucoup moins que certains veulent le faire croire!
voici un signal de commande de servomoteur(pas à l'échelle et fait sous Paint hein):
Image IPB
Comme on peut le voir, on a une succession d'états hauts et d'états bas, la durée de l'état haut permet de dire au servomoteur l'angle que l'on souhaite qu'il atteigne: plus le niveau bas est court, plus l'on se rapproche de 0°, plus il est long, plus l'oon se rapproche de 180°.
On peut dire que ce signal est un peu étrange pour une MLI. Pourquoi?
Parce que l'on reste cantonné à un état haut de durée comprise entre 1 et 2 millisecondes, sur 20ms, soit entre 5% et 10% de la durée totale. Et de plus on peut noter la période de ce signal: 20 ms. Cela peut sembler rapide, mais en électronique c'es plutot lent.



3) A quoi correspondent les Pins notées "PWM" sur mon Arduino?

Les plateformes de prototypage Arduino sont basées sur des microcontrôleurs ( ATMega328, ATMega1280 et ATMega2560 le plus souvent, certaines anciennes versions avec des ATMega168, les autres versions sont VRAIMENT anciennes)
Ces microcontrôleurs permettent de créer facilement des signaux de MLI (ils ont étés conçu, à l'intérieur, avec des portes logiques qui permettent facilement de faire de la MLI).
Ce qui permet d'utiliser l'instruction suivante:
analogWrite(pin_pwm , nombre_entre_0_et_255)
et d'obtenir une MLI sur la broche notée "PWM".
MAIS!
Piloter les servomoteurs avec ces instructions n'est pas une bonne idée. Pourquoi?

a)la fréquence:
Une MLI de base faite avec analogWrite a une fréquence de découpage de 480Hz, voire 1kHz suivant les ports.
Pour piloter un servo il faudrait une fréquence de 50Hz (1/0.02), je ne vais pas m'étendre dessus mais c'est assez compliqué de modifier la fréquence et cela peut empiéter sur d'autre fonctions comme delay(), millis(), car cela oblige (en gros) l'ATMega à compter moins vite...

b)la résolution:
Vous vous souvenez que j'ai dit que le signal de servo n'utilise que 5% de la durée totale de la MLI?
C'est un autre souci. Avec analogWrite(), on peut prendre 256 durées différentes entre 0 et 100%. ça veut dire un peu moins de 13 valeurs différentes entre 5 et 10% ! c'est très peu quand on veut le piloter de 0 à 180°, cela voudrait dire qu'il ne peut prendre que 13 valeurs d'angle différentes, par exemple:
0°, 14°, 28°... (aux arrondis près).
Et il serait impossible de prendre des valeurs entre celles-ci. Pas terrible...

4)Et donc comment je fais?

Pas de panique, l'équipe de développeurs d'Arduino a codé une librairie <servo.h>, qui permet de créer des signaux de commande de servomoteurs, sur n'importe quelle sortie digitale. Ce qui veut dire:
les pins digitaux 0 à x, notés PWM OU PAS;
les pins analogiques A0 à Ax -qui sont des sorties digitales en même temps!-
(sauf les ports A6 et A7 sur les arduinos basés sur un ATMega328 monté en surface, qui ne sont pas des sorties digitales mais uniquement des entrées analogiques)
On peut avoir 12 servos en même temps sur un Arduino basé sur un 328 (et 168), et 48 pour un Arduino basé sur un 2560 (et 1280). Selon moi on pourrait en contrôler encore plus en même temps, mais les devs ont mis cette limite afin de ne pas trop peser sur le reste du programme.

Toutes les infos sur la librairie <servo.h> et les fonctions qu'elle permet d'utiliser sont disponibles à l'adresse suivante(En français, je ne vais pas réinventer le roue non plus...)

5)EN BREF!

La MLI, c'est une forme de signal digital (ne contenant que des états hauts et bas), et périodique.
Les ports noté PWM sur l'Arduino permettent de faire facilement de la MLI (par l'instruction analogWrite)
La librairie <servo.h> permet de contrôler 12 servomoteurs simultanément (48 sur les MEGA), sur n'importe quelle sortie digitale.