Servomoteur

Ce tutoriel explique comment mettre en oeuvre un servomoteur avec MicroPython.

Description

Le servomoteur (ou servo) est un type de moteur électrique. C’est un boitier contenant :

  • une partie mécanique avec un moteur (souvent très petit) et des engrenages pour avoir une vitesse plus faible mais un couple plus important.
  • une partie électronique avec un capteur agissant comme un potentiomètre dont la résistance varie en fonction de l’angle.

On le retrouve dans différents domaines, notamment industriel, pour ouvrir ou fermer des vannes mais aussi dans le modélisme, pour des voitures télécommandées par exemple.

Un servomoteur est donc un moteur dont on contrôle l’angle de rotation, qui peut varier de 0 à 180°, en fonction du signal envoyé par la carte NUCLEO-WB55. Ce signal est de type PWM.

Qu’est-ce que la PWM ?

La modulation en largeur d’impulsion (PWM pour “Pulse Width Modulation”) est une méthode qui permet de simuler un signal analogique en utilisant une source numérique. On génère un signal carré, de fréquence donnée, qui est à +3.3V (haut) pendant une proportion paramétrable de la période et à 0V (bas) le reste du temps. C’est un moyen de moduler l’énergie envoyée à un actuateur. Usages : commander des moteurs, faire varier l’intensité d’une LED, faire varier la fréquence d’un buzzer… La proportion de la durée d’une période pendant laquelle la tension est dans l’état “haut” est appelée rapport cyclique.

Dans notre cas la PWM est un signal périodique de 50Hz (soit 20ms) dont on fait varier le rapport cyclique entre 5% (1 ms / 20 ms) et 10% (2 ms / 20 ms) pour faire tourner le bras du servo de 0° à 180°, conformément aux schémas qui suivent :


Description PWM servomoteur


Crédit image : Wikimedia

Programmer des PWM sur la carte NUCLEO-WB55

En pratique, la génération de signaux PWM est l’une des fonctions assurées par les timers, des composants intégrés dans le microcontrôleur qui se comportent comme des compteurs programmables. Le microcontrôleur de notre carte contient plusieurs timers, et chacun d’entre eux pilote plusieurs canaux (channels en anglais). Certains canaux de certains timers sont finalement connectés à des broches de sorties du Microcontrôleur (GPIO). Ce sont ces broches là qui vont pouvoir être utilisées pour générer des signaux de commande PWM.

Même si MicroPython permet de programmer facilement des broches en mode sortie PWM, vous aurez cependant besoin de connaître :

  1. Quelles broches de la NUCLEO-WB55 sont des sorties PWM ;
  2. A quels timers et canaux sont connectées ces broches dans le STM32WB55.

La figure ci-dessous répond à ces deux questions :


PWM WB55


Montage

Le servomoteur dispose d’une connectique avec des couleurs qui lui sont propres (mais qui sont standardisées). Il faut cependant bien vérifier la correspondance des couleurs en fonction des connecteurs. Dans notre cas nous les connectons de cette façon sur la carte :


Schéma de montage servomoteur


La correspondance entre le servomoteur et la carte NUCLEO-WB55 est la suivante :

Servomoteur Couleur du fil ST Nucleo
Signal Orange D6
GND Marron GND
5V Rouge 5V

Le code MicroPython

Les scripts présentés ci-après sont disponibles dans la zone de téléchargement.

Etape 1 : Pour faire fonctionner le programme nous devons dans un premier temps importer la méthode de temporisation sleep ainsi que la classe Pyb pour accéder aux broches et aux compteurs (timers), de cette façon :

from time import sleep # Pour temporiser
import pyb # Pour accéder  aux broches et aux compteurs (timers)

Etape 2 : Ensuite il faut venier initialiser la patte sur laquelle est connecté le servomoteur. On configure également la PWM avec une fréquence de 50Hz.

servo = pyb.Pin('D6')
tim_servo = pyb.Timer(1, freq=50)

Etape 3 : Il ne nous reste plus qu’à faire tourner le servo. Pour cela on crée une boucle infinie qui fait pivoter le servo de 90° toutes les deux secondes.

# Objet du script :
# Piloter un servomoteur

from time import sleep # Pour temporiser
import pyb # Pour accéder  aux broches et aux compteurs (timers)

servo = pyb.Pin('D6')
tim_servo = pyb.Timer(1, freq=50)

while True:
	tim_servo.channel(1, pyb.Timer.PWM, pin=servo, pulse_width_percent=12.5)	# Servomoteur à 90 degrés
	sleep(2)
	tim_servo.channel(1, pyb.Timer.PWM, pin=servo, pulse_width_percent=7.5)		# Servomoteur à 0 degré
	sleep(2)
	tim_servo.channel(1, pyb.Timer.PWM, pin=servo, pulse_width_percent=3)		# Servomoteur à -90 degrés
	sleep(2)
	tim_servo.channel(1, pyb.Timer.PWM, pin=servo, pulse_width_percent=7.5)		# Servomoteur à 0 degré
	sleep(2)

tim_servo.deinit() # Arrêt du timer du servomoteur

Remarque : Le programme n’exécutera jamais (en l’absence de bogue tout du moins…) la ligne tim_servo.deinit() # Arrêt du timer du servomoteur. Mais elle figure ici afin que vous ayez connaissance de la méthode deinit() spécifique aux timers, destinée à les stopper.

Résultat

Après avoir sauvegardé et redémarré le script sur votre carte NUCLEO-WB55 vous pourrez voir le servomoteur tourner de 90° toutes les deux secondes. Pour aller plus loin vous pouvez également utiliser le joystick d’une manette pour contrôler le servomoteur comme expliqué dans le tutoriel sur le module Grove adaptateur de la manette Nintendo NunChuk.