vendredi 22 juin 2018

Contrôler un servomoteur avec un STM32 Nucleo (mbed)


Je vous invite aujourd'hui à explorer le contrôle d'un servomoteur au moyen d'une carte STM32 Nucleo programmée dans mbed.  Vous pouvez vous référer à d'autres articles de ce blog si vous préférez contrôler votre servomoteur en utilisant un Arduino ou un Raspberry Pi.


Les petits servomoteurs de modélisme sont des dispositifs fascinants: contrairement à un simple moteur, vous pouvez les immobiliser à la position que vous désirez, avec une très grande précision.

La position angulaire du servomoteur dépend du rapport cyclique du signal modulé en largeur d'impulsion (PWM) qu'on lui fournit.  Typiquement, pour un signal d'une période de 20 ms, le servomoteur sera à sa position maximale dans le sens horaire lorsque la durée des impulsions est de 1 ms, il occupera sa position maximale dans le sens antihoraire lorsque la durée des impulsions est de 2 ms, et il sera au centre de sa course lorsque l'impulsion dure 1,5 ms.  Ces valeurs, toutefois, peuvent varier d'un servomoteur à l'autre et c'est en expérimentant que vous pourrez déterminer les valeurs extrêmes qui correspondent à votre servomoteur (par exemple, celui que j'ai utilisé pour cette expérience pouvait accepter des valeurs variant de 0,7 ms à 2,3 ms).

Branchements du servomoteur

Le servomoteur comporte 3 fils: le fil rouge et le fil noir (ou marron) servent à l'alimentation du servomoteur (5 V), alors que l'autre fil (qui est souvent jaune) transmet le signal PWM qui contrôle la position.

Comme c'est le cas pour tous les moteurs, il est généralement préférable d'alimenter le servomoteur avec une source de tension externe, autre que la sortie 5 V de la carte Nucleo.

Les branchements seront donc:

  • Fil rouge du servomoteur: borne positive de l'alimentation 5 V.
  • Fil noir du servomoteur: borne négative de l'alimentation 5 V et GND du Nucleo
  • Fil jaune du servomoteur: broche D5 du Nucleo (ou autre sortie PWM, à la condition de modifier le script en conséquence).



1er exemple: rotation continue

Il existe sur mbed quelques bibliothèques spécialement conçues pour le contrôle d'un servomoteur, mais puisque le contrôle d'un signal PWM n'a rien de bien compliqué, je n'ai pas jugé bon de les utiliser.

Dans ce premier exemple, le servomoteur tourne lentement de sa position minimale à sa position maximale, puis retourne brusquement à sa position minimale.

J'ai supposé que la position minimale correspond à une impulsion de 1000 microsecondes (donc 1 milliseconde) et que la position maximale correspond à une impulsion de 2000 microsecondes (2 millisecondes) mais ça peut varier d'un servomoteur à l'autre.  À vous d'expérimenter si vous désirez utiliser la totalité de l'amplitude du mouvement de votre servomoteur (il s'agit de modifier la valeur numérique des constantes positionMin et positionMax).






2e exemple: rotation contrôlée par un potentiomètre

Dans ce deuxième exemple, on ajoute un potentiomètre branché à l'entrée A0 de la carte Nucleo.  La positon du servomoteur dépend de la positon du potentiomètre.








À lire également

Les cartes Nucleo (et les cartes à base de STM32 en général) peuvent maintenant être programmées avec l'IDE Arduino.  La modulation par largeur d'impulsion a été explorée en détail dans cet article.

Pour piloter un servomoteur, on peut également utiliser une carte Arduino, un module ESP32 ou ESP8266, un Raspberry Pi, un microcontrôleur PIC programmé avec MPLAB Xpress, etc.

Yves Pelletier   (TwitterFacebook)

5 commentaires:

  1. Bonjour,
    Quelle est la valeur du potentiometre a utiliser svp, 10k, 20 k ou autres . Merci, Julien

    RépondreSupprimer
  2. Bonjour julienn
    n'importe quelle valeur fonctionne en fait (prendre quand même au moins 1 ou 2kiloohms)

    RépondreSupprimer
  3. Hi. Could you please explain this part a little. servo.pulsewidth_us(positionMin + potentiometre.read()*(positionMax - positionMin));

    RépondreSupprimer