Ignorer et passer au contenu

Livraison offerte à partir de 50€ d'achats, livrée sous 48h !

Livraison à partir de seulement 2.50€ !

Contents Menu Expand Light mode Dark mode Auto light/dark mode

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.

Schéma interne servomoteur

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.

relation largeur impulsion et angle de rotation servo

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

GND

Marron

GND

VBUS

Rouge

5V

GPIO12

Orange

Signal PWM

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

Câblage du servo SG90 Pi Pico
Câblage du servo SG90 et RP2040

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.

Câblage du servo SG90 et RP2040 sur plaque de prototypage

C’est plus pratique avec la version d’uPesy pour voir la numérotation des broches 😉

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 :

Contrôle du servo SG90 avec RP2040

Contrôle du servo SG90 avec la carte uPesy RP2040 DevKit

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 . 😉