Composant · Capteur

MPU-6050 IMU

Le MPU-6050 est une centrale 6 axes qui sent inclinaison, rotation et accélération en I²C — comment un robot connaît son orientation pour s'équilibrer.

Présentation

Le MPU-6050 est la façon dont un robot sent son propre mouvement. C’est une centrale inertielle 6 axes — un gyroscope et un accéléromètre sur une puce — qui rapporte l’inclinaison du robot, sa vitesse de rotation et son accélération. Là où un capteur ultrason regarde le monde extérieur, une centrale inertielle regarde vers l’intérieur, vers le corps du robot, ce qu’il faut à un robot auto-équilibré ou à une navigation à l’estime.

Schéma légendé d'une carte centrale inertielle MPU-6050 (carte GY-521) : un circuit imprimé violet avec la puce MPU-6050 et des passifs au centre, un indicateur d'axes X/Y/Z montrant les trois directions de mesure, et une barrette 8 broches (VCC, GND, SCL, SDA, XDA, XCL, AD0, INT) le long du bas.
Un gyroscope et un accéléromètre sur une puce sentent rotation et inclinaison autour des trois axes, lus en I²C. Télécharger le SVG

Fonctionnement

Il contient deux capteurs. L’accéléromètre mesure l’accélération linéaire sur X, Y et Z — à l’arrêt, c’est juste la gravité, qui indique au robot où est le bas (son inclinaison). Le gyroscope mesure la vitesse à laquelle le robot tourne autour de chaque axe. On lit les deux en I²C (SCL/SDA).

Aucun capteur ne suffit seul : intégrez le gyro pour obtenir un angle et il dérive lentement ; croyez l’accéléromètre et il est bruité dès que le robot bouge. La correction est la fusion de capteurs — mélangez-les pour que l’accéléromètre corrige la dérive du gyro et que le gyro lisse le bruit de l’accéléromètre. Cette technique est exactement ce que couvre bruit, biais et filtrage des capteurs.

Quand l’utiliser

Prenez un MPU-6050 quand un robot doit connaître sa propre orientation ou son mouvement :

  • Robots auto-équilibrés — l’angle d’inclinaison que la boucle de commande s’acharne à garder à zéro.
  • Cap et navigation à l’estime — sentir les virages pour améliorer l’odométrie entre lectures de codeurs.
  • Détection de mouvement / gestes — réagir quand on le soulève, le penche ou le secoue.

Pour mesurer la distance aux choses (murs, obstacles), prenez plutôt un capteur de distance comme le HC-SR04 ou le VL53L0X — une centrale inertielle sent le robot, pas le monde.

Câblage et pièges

  • I²C, 3,3–5 V. La plupart des cartes (la violette GY-521) ont un régulateur, donc 5 V convient ; la puce nue est 3,3 V seulement.
  • Fusionnez gyro et accéléro — ne pilotez jamais sur une lecture brute. Un seul échantillon d’accéléromètre en mouvement est inutilisable comme angle d’inclinaison.
  • Le lacet dérive sans magnétomètre ; utilisez le MPU-6050 pour tangage/roulis et virages à court terme, pas pour un cap absolu au compas.
  • Gardez-le rigide et monté de niveau ; un capteur qui bouge ajoute des vibrations que le filtre ne peut pas retirer.

Brochage

La carte violette GY-521 est la carte que presque tout le monde entend par « MPU-6050 ». Huit broches, et quatre d’entre elles restent généralement non connectées.

Broche Nom Rôle Généralement
1 VCC Alimentation. Le régulateur de la carte accepte 3,3–5 V ; la puce nue est 3,3 V seulement 5 V sur un Uno, 3,3 V sur un ESP32
2 GND Masse, commune avec le microcontrôleur Connectée
3 SCL Horloge I²C A5 sur un Uno
4 SDA Données I²C A4 sur un Uno
5 XDA Données I²C auxiliaires — pour un magnétomètre que le MPU lit pour vous Laissée libre
6 XCL Horloge I²C auxiliaire Laissée libre
7 AD0 Sélection d’adresse. Bas (défaut) = 0x68, haut = 0x69 Laissée libre, ou au haut pour un second capteur
8 INT Sortie d’interruption — se déclenche sur données prêtes, mouvement ou chute libre Laissée libre, jusqu’à vouloir arrêter de scruter

AD0 est la broche qui rend possibles deux MPU-6050 sur un bus, et c’est la raison pour laquelle la collision d’adresses a ici une réponse facile que la plupart des capteurs n’offrent pas.

Le câbler à un Arduino

MPU-6050 Arduino Uno ESP32 Note
VCC 5 V 3,3 V Le régulateur embarqué gère les deux
GND GND GND Doit être commune avec tout le reste
SCL A5 GPIO 22 N’ajoutez pas de pull-ups externes — la carte a déjà 2,2 kΩ
SDA A4 GPIO 21 Idem
AD0 — — À VCC seulement pour un second capteur

Il y a une subtilité à connaître sur un Arduino 5 V. Les résistances de pull-up de la GY-521 vont à son rail régulé 3,3 V, donc les lignes I²C reposent à 3,3 V, pas 5 V. Un ATmega328P lit haut au-delà de 0,6 × Vcc = 3,0 V, donc 3,3 V passe le seuil — mais de justesse, 0,3 V. Cela marche fiablement en pratique et c’est une raison pour laquelle un bus I²C long ou bruité se comporte mal sur cette carte plus tôt que sur une carte 5 V.

Le lire : les registres qui comptent

Vous pouvez piloter ce capteur avec une bibliothèque sans jamais voir un registre, mais quatre d’entre eux expliquent presque tous les problèmes rencontrés.

Registre Adresse Pourquoi c’est important
PWR_MGMT_1 0x6B La puce démarre endormie. Écrivez 0 ici ou toute lecture vaut zéro
WHO_AM_I 0x75 Renvoie 0x68 — le moyen le plus rapide de prouver que le câblage est bon
GYRO_CONFIG 0x1B Pleine échelle : ±250, ±500, ±1000, ±2000 °/s
ACCEL_CONFIG 0x1C Pleine échelle : ±2, ±4, ±8, ±16 g
ACCEL_XOUT_H 0x3B Début de 14 octets : 6 accéléro, 2 température, 6 gyro — lisez-les en une rafale

Les deux registres de configuration fixent le facteur d’échelle par lequel diviser les comptes bruts, et se tromper est la source la plus fréquente de « mes angles sont quatre fois trop grands » :

Réglage de gamme LSB gyro par °/s Réglage de gamme LSB accéléro par g
±250 °/s (défaut) 131 ±2 g (défaut) 16384
±500 °/s 65,5 ±4 g 8192
±1000 °/s 32,8 ±8 g 4096
±2000 °/s 16,4 ±16 g 2048

Choisissez la gamme la plus petite qui ne saturera pas. Un robot équilibriste dépasse rarement ±250 °/s, et la gamme étroite donne quatre fois la résolution de ±1000 °/s gratuitement.

Code minimal fonctionnel

Sans bibliothèque — c’est tout, et cela vaut la peine de l’exécuter une fois pour savoir ce que la bibliothèque fait pour vous.

#include <Wire.h>

const uint8_t MPU = 0x68;          // 0x69 if AD0 is tied high

void setup() {
  Serial.begin(115200);
  Wire.begin();

  Wire.beginTransmission(MPU);
  Wire.write(0x6B);                 // PWR_MGMT_1
  Wire.write(0);                    // wake up — the chip boots asleep
  Wire.endTransmission(true);
}

void loop() {
  Wire.beginTransmission(MPU);
  Wire.write(0x3B);                 // ACCEL_XOUT_H
  Wire.endTransmission(false);      // repeated start, do not release the bus
  Wire.requestFrom(MPU, (uint8_t)14);

  int16_t ax = Wire.read() << 8 | Wire.read();
  int16_t ay = Wire.read() << 8 | Wire.read();
  int16_t az = Wire.read() << 8 | Wire.read();
  Wire.read(); Wire.read();         // temperature, discarded here
  int16_t gx = Wire.read() << 8 | Wire.read();
  int16_t gy = Wire.read() << 8 | Wire.read();
  int16_t gz = Wire.read() << 8 | Wire.read();

  // Default ranges: +/-2 g and +/-250 deg/s
  float pitch = atan2(ax, sqrt((float)ay * ay + (float)az * az)) * 57.2958f;
  float rateY = gy / 131.0f;        // deg/s

  Serial.print(pitch); Serial.print(' '); Serial.println(rateY);
  delay(20);
}

Deux choses que cela ne fait délibérément pas : jamais fusionner les deux capteurs, et jamais soustraire un biais. Les deux suivent.

Étalonnage : les vingt lignes qui comptent le plus

À l’arrêt, un gyro ne lit pas zéro. Il lit un petit décalage assez constant, et parce que vous intégrez le gyro pour obtenir un angle, ce décalage s’intègre en une erreur croissante. Un biais de juste 2 °/s non corrigé fait 120° de dérive après une minute.

Moyennez quelques centaines d’échantillons avec le capteur complètement immobile, puis soustrayez :

long sum = 0;
for (int i = 0; i < 500; i++) { sum += readGyroY(); delay(3); }
const float gyroBias = sum / 500.0f;   // subtract from every later reading

Trois notes pratiques que la fiche technique ne dira pas :

  • Refaites-le à chaque mise sous tension, pas une fois. Le biais du gyro bouge avec la température, et un robot qui tourne depuis dix minutes n’est pas le robot étalonné à froid.
  • « Immobile » signifie immobile. Un étalonnage pris pendant qu’on s’appuie sur le bureau grave ce mouvement dans le biais pour toujours.
  • L’accéléromètre a besoin d’une référence de niveau, pas d’un zéro. Il doit lire 1 g sur l’axe qui pointe vers le bas. S’il lit 0,97 g, c’est votre erreur d’échelle, et elle apparaîtra comme un angle d’inclinaison faux de constamment quelques degrés.

Pourquoi un capteur seul ne suffit jamais

Les deux capteurs échouent de façons exactement opposées, ce qui rend leur fusion si efficace.

Accéléromètre Gyroscope
Mesure Accélération linéaire — à l’arrêt, la gravité Vitesse de rotation
Donne l’inclinaison par Trigonométrie sur le vecteur gravité Intégration de la vitesse dans le temps
Court terme Bruité — chaque choc et vibration est aussi une accélération Excellent, doux, réactif
Long terme Correct en moyenne — la gravité ne dérive pas Dérive sans borne à mesure que le biais s’intègre
Échoue quand Le robot accélère, donc « bas » n’est plus en bas Toujours, lentement

Un filtre complémentaire prend la bonne moitié de chacun — croyez le gyro à court terme, laissez l’accéléromètre ramener lentement l’estimation vers le vrai :

angle = 0.98f * (angle + rate * dt) + 0.02f * accelAngle;

Ce 0,98 fixe le croisement. Plus haut croit le gyro plus longtemps, plus doux mais dérivant plus ; plus bas répond au bruit de l’accéléromètre. Le tutoriel sur le filtre complémentaire explique comment le choisir délibérément plutôt qu’au feeling.

Dépannage

Symptôme Cause probable Solution
Toute lecture vaut exactement 0 La puce dort encore Écrivez 0 à PWR_MGMT_1 (0x6B) après Wire.begin()
Le scanneur de bus ne trouve rien Adresse 8 bits de la fiche technique Le 0xD0 de la fiche est 0x68 décalé à gauche — utilisez 0x68
Deux capteurs, un seul apparaît Les deux sur l’adresse par défaut Mettez l’AD0 d’une carte à VCC pour qu’elle réponde en 0x69
Angles 4× ou 8× trop grands Facteur d’échelle ne correspondant pas à la gamme configurée Accordez le diviseur à GYRO_CONFIG/ACCEL_CONFIG
L’angle dérive même à l’arrêt Biais gyro non étalonné Moyennez 500 échantillons immobiles au démarrage et soustrayez
L’inclinaison saute en roulant Utilisation de l’angle accéléromètre brut Fusionnez avec le gyro ; le « bas » d’un robot en mouvement n’est pas en bas
Les lectures se figent au bout d’un moment Bus I²C verrouillé Vérifiez les pull-ups ; ajoutez une routine de récupération qui cadence SCL neuf fois
Le cap tourne lentement pour toujours Le lacet n’a pas de référence absolue Normal — le lacet veut un magnétomètre ou une autre source absolue
Bruité au-delà d’environ 1 kHz de vibrations Montage rigide transmettant les vibrations moteur Montez le capteur sur silentblocs ; activez le DLPF embarqué via CONFIG (0x1A)

MPU-6050 ou quelque chose de plus récent ?

Le MPU-6050 est en fin de vie chez le fabricant et reste la centrale inertielle la plus utilisée en robotique amateur, car économique, documentée partout et prise en charge par toute bibliothèque.

Pièce Axes Différence notable Choisissez-la quand
MPU-6050 6 La valeur par défaut ; énorme quantité d’exemples Apprendre, s’équilibrer, tout premier projet de centrale inertielle
MPU-9250 9 Ajoute un magnétomètre, donc le lacet a une référence absolue Il faut un cap au compas, pas juste une vitesse de rotation
ICM-20948 9 Le successeur en production du MPU-9250 Conceptions neuves voulant 9 axes et une disponibilité durable
BNO055 9 Fait la fusion sur puce et sort directement l’orientation Vous voulez un angle sans écrire de filtre — à plusieurs fois le prix
LSM6DS3 6 Moderne, en production, moins de bruit Une mise à niveau directe quand le stock de MPU-6050 s’épuise

Le résumé honnête : si votre robot a besoin du tangage et du roulis — ce qu’il faut pour s’équilibrer — le MPU-6050 suffit amplement et la fusion est une bonne chose à avoir écrite soi-même. S’il lui faut un cap absolu, aucun filtrage ne l’obtiendra de six axes, et il faut un magnétomètre.

Explorer le graphe

Utilisé dans ces réalisations

Projets, parcours d'apprentissage et simulateurs qui intègrent le composant MPU-6050 IMU.

Questions

FAQ : MPU-6050 IMU

Qu'est-ce que le capteur MPU-6050 ?

Le MPU-6050 est une centrale inertielle (IMU) 6 axes sur une petite carte. Il combine un gyroscope 3 axes et un accéléromètre 3 axes, pour qu'un robot sente son inclinaison, sa vitesse de rotation et son accélération — le tout lu sur le bus I²C.

Comment fonctionne le MPU-6050 ?

Il contient deux capteurs. L'accéléromètre mesure l'accélération linéaire — à l'arrêt, c'est juste la gravité, qui indique au robot où est le bas (son inclinaison). Le gyroscope mesure la vitesse de rotation autour de chaque axe. On lit les deux en I²C, puis on les fusionne pour obtenir une orientation stable qu'aucun ne donne seul.

À quoi sert le MPU-6050 ?

À sentir le mouvement propre du robot — garder un robot auto-équilibré debout, estimer le cap et améliorer l'odométrie entre lectures de codeurs, et détecter qu'on le soulève, le penche ou le secoue. Il sent le robot lui-même, pas le monde autour, donc il complète un capteur de distance plutôt que le remplacer.

Comment étalonner un MPU-6050 ?

À l'arrêt, le gyro et l'accéléromètre lisent de petits décalages non nuls. Étalonnez en moyennant quelques centaines d'échantillons pendant que le capteur reste parfaitement immobile, puis soustrayez ces décalages de chaque lecture. Le gyro en a surtout besoin — un biais non étalonné est ce qui fait dériver l'angle estimé le plus vite.

Comment connecter un MPU-6050 à un ESP32 ou un Arduino ?

En I²C — câblez SDA et SCL aux broches I²C de la carte, plus l'alimentation et la masse. La carte violette GY-521 a un régulateur, donc elle marche en 3,3 V sur un ESP32 ou 5 V sur un Arduino Uno. Une bibliothèque lit ensuite pour vous les registres du gyroscope et de l'accéléromètre.

Pour aller plus loin

Références