Utiliser un servomoteur avec une Raspberry Pi Pico avec du code Arduino
(Mis à jour le 20/01/2023)
Les servomoteurs, souvent appelés « servo », sont une variante spéciale de moteurs qui peuvent être maintenus à une position angulaire spécifique jusqu’à ce qu’un nouvel ordre soit donné. Le SG90 TowerPro bleu est très populaire en raison de son petit prix et de sa facilité d’utilisation. Il est présent dans la plupart des kits de capteurs disponibles.
Le servomoteur SG90 : un moteur intelligent
Ce servomoteur peut tourner uniquement entre 0 et + 180 degrés. En effet, en plus d’un moteur continu, il est composé d’engrenages pour augmenter le couple et d’un système de régulation qui limite sa rotation. Le tout encastré dans un boîtier plastique très petit.
Note
C’est le potentiomètre qui sert au système de contrôle pour maintenir une position précise qui limite la rotation.
Comment piloter le servomoteur SG90 ?
Ce servomoteur peut être contrôlé avec un signal modulé en largeur d’impulsion (PWM) à une fréquence de 50 Hz, ce qui signifie qu’une impulsion est envoyée toutes les 20ms. La position du servomoteur peut être ajustée en modifiant la durée des impulsions, comprise entre 1ms et 2ms.
Note
On commande sa position angulaire avec un signal PWM. C’est la circuiterie interne du servo qui se chargera d’interpréter cette commande.
Comment alimenter le servomoteur sur la Pi Pico ?
Selon la fiche technique du servomoteur SG90, la tension optimale est de 5V. Cependant, il marche aussi en 3.3V, mais au ralenti.
Note
Je vous conseille d’utiliser 5V pour avoir un servo plus réactif ! (même si l’exemple est avec 3.3V.)
Les servomoteurs sont très énergivores, en particulier lorsqu’ils doivent bouger un objet lourd. Puisque la carte Raspberry Pi Pico est alimentée directement par le port USB, l’ordinateur ne peut délivrer qu’un courant maximal de 500mA. Si vous ne branchez qu’un ou deux servomoteurs via la broche VBUS
, votre alimentation USB devrait suffire.
Lorsque vous avez plus de 2 servomoteurs, il est conseillé d’utiliser une alimentation séparée. N’oubliez pas de connecter la broche GND
de la carte à celle de l’alimentation externe. Les masses doivent être communes.
Brancher le SG90 sur une carte Raspberry Pi Pico
Un servomoteur SG90 contient 3 fils : 2 pour l’alimentation et 1 pour le signal de commande en PWM. Les couleurs des fils permettent de les différencier :
RPi Pi Pico |
Couleur du fil |
Servomoteur SG90 |
---|---|---|
|
Marron |
|
|
Rouge |
|
|
Orange |
Signal |
Note
Sur certaines versions de servomoteur, la couleur du fil PWM
est jaune ou blanche à la place d’orange.
Presque toutes les broches de sortie de la Pi Pico peuvent être employées pour contrôler le servomoteur.
Circuit pour piloter un servomoteur avec une Pico
Voici un exemple sur breadboard avec la carte uPesy RP2040 DevKit, un carte Pi Pico améliorée. Le servo est alimenté en 3.3V sur la photo mais je vous conseille plutôt en 5V.
Piloter un servomoteur depuis la Pi Pico avec du code Arduino
On pourrait éviter d’utiliser des librairies pour contrôler les servomoteurs et faire tout à la main, mais à quoi bon de réinventer la roue quand il existe des librairies bien faites ?
On utilise la librairie Arduino classique Servo.h
car elle est directement incluse dans le portage du RP2040 vers du code Arduino. Pas besoin d’installer de librairies tierces ! Vous pouvez même reprendre des codes existants pour carte Arduino qui utilise la librairie Servo.h
Note
Pour les détails, la librairie utilise les fameux PIO de la Pi Pico : on pourra contrôler jusqu’à 8 moteurs en même temps. L’implémentation basse niveau est disponible sur GitHub pour les curieux 😉
Piloter le servo avec la librairie Servo.h
en code Arduino
On utilise le code suivant pour piloter le SG90 de 0° à 180° avec la Pico.
#include <Servo.h>
#define PIN_SG90 12 // Broche de sortie utilisée
Servo sg90;
void setup() {
sg90.attach(PIN_SG90);
}
void loop() {
// Rotation de 0 à 180°
for (int pos = 0; pos <= 180; pos += 1) {
sg90.write(pos);
delay(10);
}
// Rotation de 180° à 0°
for (int pos = 180; pos >= 0; pos -= 1) {
sg90.write(pos);
delay(10);
}
}
Voici une vidéo de démonstration avec le code ci-dessus :
Si votre servomoteur ne tourne que de 90°, il faudra sûrement ajuster les valeurs de la largeur d’impulsion définies dans la fonction sg90.attach(PIN_SG90, 500, 2400)
. Voici une vidéo explicative en anglais du bug que vous pourrez éventuellement rencontrer : https://www.youtube.com/watch?v=GwmygA1y4L0
En dehors de ça, la librairie est identique à celle de l’Arduino. Je vous invite donc à consulter la page officielle pour connaître toutes les options de cette librairie . 😉