Article

Contrôler un servomoteur SG90 avec Raspberry Pi

Le servomoteur SG90 a 2 euros : fonctionnement, signal PWM, cablage Pi, code Python gpiozero, solution au tremblement, et premier projet camera pan-tilt.

Par Rémi Favreau — 6 mai 2026

Le SG90, c’est probablement le composant le plus rentable en robotique hobbyiste : 4-5 € pour un TowerPro, 2 € en clone, et ça permet déjà de faire bouger des trucs. Compte 4 à 5 € pour un TowerPro original chez Kubii ou Gotronic, 2 € en clone AliExpress. Trois fils, on branche, on envoie un signal PWM, il tourne à la position demandée et y reste. On en met dans un bras articulé, une caméra orientable, une barrière automatique, ou la patte d’un robot marcheur miniature. Tutoriel testé sur Pi 5 8 GB sous Pi OS Bookworm (gpiozero 2.0, kernel 6.6) en avril 2026.

Câblage d'un servomoteur SG90 sur Raspberry Pi 5, signal sur GPIO 17, VCC sur 5V, GND commun
Câblage du SG90 testé sur Pi 5 : signal GPIO 17, VCC 5V, GND commun.

Comment fonctionne un servo

Un servomoteur est un moteur DC asservi en position : tu lui demandes 73°, il y va et il y reste, même si tu pousses sur le bras. Cette boucle de rétroaction est ce qui le différencie d’un moteur DC classique ou d’un pas-à-pas en boucle ouverte.

À l’intérieur du boîtier plastique du SG90, quatre éléments coopèrent. Un petit moteur DC fournit le mouvement. Un train d’engrenages réducteur (en nylon sur le SG90, en métal sur le MG90S, qui coûte 2 € de plus et dure 10 fois plus longtemps en usage intensif) divise la vitesse pour gagner du couple. Un potentiomètre solidaire de l’axe de sortie mesure en permanence la position angulaire réelle. Un circuit de contrôle compare cette position à celle demandée par le signal d’entrée, puis pilote le moteur jusqu’à ce que les deux coïncident.

Sur le SG90 TowerPro, le couple de calage (stall torque) annoncé est de 1,8 kg·cm sous 4,8 V — soit 180 g de poussée à 10 cm de l’axe en blocage total. En usage continu, compte plutôt 50-70 % de cette valeur, donc ~100 g utiles à 10 cm avant que le servo commence à rater des positions. Le poids total tient en 9 g. Plage de rotation théorique : 180°. En pratique sur les clones, je mesure régulièrement 160 à 170° utiles, et c’est normal.

Le signal PWM servo

Un servo standard attend un signal PWM à 50 Hz (donc une période de 20 ms entre chaque impulsion). Ce qui détermine l’angle, ce n’est pas la fréquence, c’est la largeur de l’impulsion.

  • 1 ms d’impulsion donne la position 0° (butée gauche)
  • 1,5 ms place l’axe au centre, à 90°
  • 2 ms envoie en butée droite, 180°

Les valeurs exactes varient d’un servo à l’autre, surtout sur les clones chinois où la dispersion est forte. Certains acceptent 0,5 ms à 2,5 ms, d’autres saturent à 0,9 ms et 2,1 ms. Si ton servo ne touche pas les butées que tu attends, ajuste les bornes dans le code, ce n’est pas grave.

Câblage au Raspberry Pi

Trois fils, pas plus. Signal (orange ou blanc) vers un GPIO du Pi, VCC (rouge) vers 5V, GND (brun ou noir) vers GND. Pour un seul SG90, alimenter depuis le rail 5V du Pi peut passer (running ~150-200 mA en mouvement à vide, jusqu’à ~600-700 mA en pic au démarrage ou en blocage selon les unités, certains clones atteignant 1 A — chiffres datasheet TowerPro et mesures pratiques). Le rail 5V des broches GPIO du Pi 5 est limité par le polyfuse à environ 1,1 A : un servo en pic, ça passe ; deux ou plus, c’est trop juste.

Pour deux servos ou plus, il te faut une alim externe 5V dédiée. Régulateur BEC 5V/3A, pack de 4 piles AA, ou alim banc de labo, peu importe. La règle absolue : la masse de cette alim externe doit être reliée à un GND du Pi. Sans masse commune, le signal PWM n’a aucune référence et le servo part dans tous les sens. C’est l’erreur numéro un dès qu’on passe à deux servos avec une alim séparée — y compris chez ceux qui savent ce qu’ils font.

À éviter absolument : ne branche jamais le VCC du SG90 sur le 3,3 V du Pi. Ça ne grille rien, mais le servo refusera de bouger ou tremblotera, et tu vas chercher la panne pendant 30 minutes. C’est toujours 5V.

Code Python avec gpiozero

La librairie gpiozero est officiellement recommandée par la Raspberry Pi Foundation depuis Pi OS Bookworm. Elle expose une classe Servo qui gère le PWM en interne, sans avoir à calculer les durées d’impulsion à la main.

from gpiozero import Servo
from time import sleep

servo = Servo(17)  # signal sur GPIO 17

servo.min()   # 0° (butée gauche)
sleep(1)
servo.mid()   # 90° (centre)
sleep(1)
servo.max()   # 180° (butée droite)
sleep(1)

# Position fine : valeur entre -1 (0°) et +1 (180°)
servo.value = 0.5    # ~135°
sleep(1)
servo.value = -0.5   # ~45°
sleep(1)

servo.detach()  # couper le signal (le servo se relâche)

Pourquoi mon servo tremble à l’arrêt ?

Le tremblement vient du PWM logiciel par défaut. Sur Pi OS Bookworm, gpiozero utilise le backend lgpio, qui est correct mais sujet à du jitter quand le Pi a d’autres tâches en parallèle. Sur Pi 5, le backend pigpio n’est pas utilisable : il s’appuie sur un accès DMA-vers-GPIO direct propre au BCM2835/2711, alors que la nouvelle puce I/O dédiée RP1 du Pi 5 reroute toutes les broches. C’est confirmé dans le whitepaper officiel Raspberry Pi sur la RP1.

Deux solutions propres selon ta cible :

Sur Pi 4 ou antérieur : tu peux activer le démon pigpio qui utilise le DMA pour un PWM stable à la microseconde. Ajoute dtoverlay=pwm-2chan dans /boot/firmware/config.txt si tu veux le PWM hardware sur GPIO 18 et 19.

sudo systemctl enable pigpiod
sudo systemctl start pigpiod
export GPIOZERO_PIN_FACTORY=pigpio
python3 mon_script.py

Sur Pi 5 : utilise la librairie Python rpi-hardware-pwm (PWM matériel via le contrôleur PWM de la RP1) sur GPIO 12, 13, 18 ou 19, ou bascule directement sur une carte PCA9685. Cette dernière communique en I2C, gère 16 canaux PWM en parallèle, et génère le signal indépendamment du CPU. Carte officielle Adafruit autour de 15 $, clones chinois autour de 6 € chez les revendeurs FR. C’est la solution la plus simple dès qu’on dépasse 3 servos, par exemple sur un bras articulé 4 axes.

Premier mécanisme : caméra pan-tilt

Le kit pan-tilt (deux plateaux articulés plus deux SG90, 8 à 12 € chez Kubii ou Adafruit) permet d’orienter une Pi Camera sur deux axes. Avec OpenCV en arrière-plan, tu peux faire un suivi de visage : la caméra se tourne automatiquement vers le visage détecté.

Le principe est simple. Si le centre du visage détecté est à gauche du centre de l’image, tu décrémentes l’angle du servo horizontal de 1 ou 2°. À droite, tu incrémentes. Pareil sur l’axe vertical. C’est un excellent projet intermédiaire après le robot 2 roues, parce que tu touches à la vision par ordinateur sans encore avoir à gérer la cinématique d’un déplacement.

3 trucs à retenir avant de souder

  • Masse commune obligatoire dès qu’il y a une alim externe, sinon le PWM est inutilisable.
  • SG90 clone pour apprendre, MG90S pour durer. Sur les SG90 chinois bas de gamme, le potentiomètre interne lâche au bout de quelques mois en usage continu, et le servo se met à osciller sans raison. Pour un projet qui doit tenir, je passe direct sur le MG90S (engrenages métal) ou sur du Hitec si le budget suit.
  • PCA9685 dès 3 servos. Le PWM logiciel suffit pour bidouiller un servo, mais à partir de trois servos qui doivent bouger ensemble proprement, prends une PCA9685 (16 canaux I2C, ~6 € en clone). Sur Pi 4, pigpiod reste valide jusqu’à 2-3 servos ; sur Pi 5, va directement sur PCA9685 ou rpi-hardware-pwm.

Pour aller plus loin, tu peux remplacer le servo standard par un servo continu (modifié pour tourner en continu au lieu de chercher une position) pour faire des roues motrices, ou attaquer les capteurs de distance HC-SR04 pour qu’un mécanisme pan-tilt scanne son environnement tout seul.

À retenir

  • SG90 : signal PWM 50 Hz, pulse 1 ms (0°) à 2 ms (180°), neutre à 1,5 ms (90°)
  • 3 fils : rouge VCC 5V, marron GND, orange signal vers GPIO
  • 1 servo OK sur GPIO direct ; 2+ servos = alim externe 5-6V avec masse commune obligatoire
  • 3+ servos = passer directement à PCA9685 (16 canaux I2C, ~6 € clone, ~15 $ Adafruit officiel)
  • Sur Pi 4 et antérieurs : GPIOZERO_PIN_FACTORY=pigpio + sudo systemctl enable pigpiod. Sur Pi 5 : rpi-hardware-pwm ou PCA9685 (pigpio incompatible RP1)
  • Pour usage long terme : privilégier MG90S métal ou SG90 TowerPro original aux clones AliExpress (potentiomètre fragile)

Note d’expérience : sur les ateliers robotiques que j’anime régulièrement avec des collégiens, j’évite de plus en plus les SG90 chinois bas de gamme. Le potentiomètre interne lâche en 4-6 mois sur un usage atelier hebdomadaire, et le retour d’effort devient erratique. Pour un projet qui doit durer (robot pédagogique, pan-tilt fixe), un MG90S ou un SG90 TowerPro original chez Kubii vaut largement les 5 € de différence.

Questions fréquentes sur SG90 et Raspberry Pi

SG90 ou MG90S : lequel choisir ?

SG90 (engrenages plastique nylon, ~2-5 €) suffit pour les projets prototypes, démos et applications légères sans charge dynamique. MG90S (engrenages métal, ~7-10 €) tient mieux dans la durée et résiste aux à-coups, choisir si le servo doit travailler en cycle long ou supporter une charge mécanique. Pour un prototype rapide ou un projet d apprentissage, SG90. Pour un robot qui doit durer 6+ mois en utilisation, MG90S.

Pourquoi mon servo SG90 tremble ou vibre ?

Trois causes principales : (1) PWM imprécis avec rpi-gpio par défaut sur Pi OS Bookworm — basculer sur pigpio en backend avec GPIOZERO_PIN_FACTORY=pigpio et sudo systemctl enable pigpiod ; (2) tension d’alimentation insuffisante — le 5V GPIO du Pi ne supporte pas plus d’1 servo, prévoir une alim externe régulée 5-6V dès 2 servos ; (3) clone bas de gamme avec potentiomètre interne déficient — passer à un SG90 TowerPro original ou MG90S.

Combien de servos peut-on contrôler avec un Raspberry Pi ?

Sur GPIO direct, 2 servos max avec une alim externe — au-delà la précision du PWM logiciel se dégrade rapidement. Avec une PCA9685 (16 canaux PWM via I2C, ~6 € en clone), tu pilotes 16 servos par carte, et tu peux chaîner jusqu’à 62 cartes sur le bus I2C en jouant sur les ponts d’adresse. Dès 3 servos, je prends une PCA9685 en standard : c’est plus stable, plus simple, et ça libère les GPIO du Pi.

Faut-il une alimentation externe pour un SG90 ?

Oui dès 2 servos. Un seul SG90 peut tirer 600-700 mA en pic au démarrage ou en blocage. Le rail 5V des broches GPIO du Pi 5 est protégé par un polyfuse à ~1,1 A — un servo seul passe en général, deux ou plus c’est trop juste, et la chute de tension transitoire suffit à perturber le PWM. À 2 servos ou plus, prévoir un module step-down 5-6V depuis une batterie LiPo 7,4V ou un bloc secteur dédié, et toujours relier la masse de l’alim externe à un GND du Pi (masse commune obligatoire).

Le servo SG90 fait-il vraiment 0 à 180° ?

Théoriquement oui, en pratique pas toujours. Les SG90 originaux TowerPro tiennent 175-180°, les clones AliExpress butent souvent à 160-170°. Pour les applications nécessitant une plage stricte (ex : pan-tilt camera), tester chaque servo avec un balayage 0,5 ms à 2,5 ms pour mesurer la plage réelle puis ajuster le code en conséquence (la classe gpiozero Servo accepte des bornes min_pulse_width et max_pulse_width personnalisées).

Sources : datasheet TowerPro SG90, Raspberry Pi RP1 whitepaper (raspberrypi.com), Adafruit PCA9685 #815, doc gpiozero readthedocs.io, doc pigpio abyz.me.uk.

Ne manquez rien

Recevez nos meilleurs articles directement dans votre boite mail.

S'abonner

Articles connexes

Article

Construire son premier robot DIY : le guide complet

Les six briques d'un robot DIY (cerveau, moteurs, capteurs, chassis, alimentation, code), le choix Pi vs Arduino vs ESP32, les trois familles de moteurs, et la progression recommandee de la LED au robot mobile.