Component · Sensor

MPU-6050 IMU

De MPU-6050 is een 6-assige IMU die kanteling, draaiing en versnelling via I²C meet—zo weet een robot zijn oriëntatie voor balancering en draaibewegingen.

Wat het is

De MPU-6050 is de manier waarop een robot zijn eigen beweging voelt. Het is een 6-assige traagheidsmeeteenheid—een gyroscoop en een accelerometer op één chip—die meldt hoe de robot gekanteld is, hoe snel hij draait en hoe hij versnelt. Terwijl een ultrasone sensor naar buiten kijkt, kijkt een IMU naar binnen naar de robot zelf. Dat is wat een zelfbalancerende robot of een navigator die dood rekent nodig heeft.

Gelabeld diagram van een MPU-6050 IMU-breakout (GY-521-bord): een paarse printplaat met de MPU-6050-chip en passieve componenten in het midden, een X/Y/Z-assenindicator die de drie meetrichtingen toont en onderaan een 8-pins header (VCC, GND, SCL, SDA, XDA, XCL, AD0, INT).
Een gyroscoop en accelerometer op één chip meten draaiing en kanteling om alle drie de assen via I²C. SVG downloaden

Hoe het werkt

Binnenin zitten twee sensoren. De accelerometer meet lineaire versnelling op X, Y en Z—in rust is dat alleen de zwaartekracht, waarmee de robot weet welke kant omlaag is (de kanteling). De gyroscoop meet hoe snel de robot om elke as draait. Je leest beide via I²C (SCL/SDA).

Geen van beide sensoren is op zichzelf voldoende: integreer je de gyroscoop om een hoek te krijgen, dan drijft die langzaam; vertrouw je op de accelerometer, dan is die ruisachtig zodra de robot beweegt. De oplossing is sensordatafusie—combineer ze zodat de accelerometer de drift van de gyroscoop corrigeert en de gyroscoop de ruis van de accelerometer gladstrikt. Die techniek behandelt sensorruis, bias en filtering precies.

Wanneer je hem gebruikt

Kies een MPU-6050 wanneer een robot moet weten wat zijn eigen oriëntatie of beweging is:

  • Zelfbalancerende robots — de kantelhoek die de regellus probeert op nul te houden.
  • Koers bepalen en dood rekenen — draaibewegingen meten om de odometrie tussen encodermetingen te verbeteren.
  • Bewegingsdetectie / gebaren — reageren wanneer de robot wordt opgepakt, omgekapt of geschud.

Voor het meten van afstand tot dingen (muren, obstakels) heb je liever een afstandssensor zoals de HC-SR04 of VL53L0X—een IMU meet de robot, niet de wereld.

Aansluiting en aandachtspunten

  • I²C, 3,3–5 V. De meeste breakouts (de paarse GY-521) hebben een regulator, dus 5 V is prima; de kale chip werkt alleen op 3,3 V.
  • Combineer de gyroscoop en accelerometer—bestuur niet op basis van een ruwe meting. Eén accelerometermonster tijdens beweging is onbruikbaar als kantelhoek.
  • De yaw drift zonder magnetometer; gebruik de MPU-6050 voor pitch/roll en voor draaibewegingen op korte termijn, niet voor een absolute kompasrichting.
  • Monteer hem stijf en waterpas; een losse sensor voegt trillingen toe die het filter niet kan verwijderen.

Pinindeling

De paarse GY-521-breakout is het bord dat iedereen bedoelt met “MPU-6050”. Het heeft acht pins, waarvan er meestal vier ongebonden blijven.

Pin Naam Functie Gewoonlijk
1 VCC Voeding. De regulator van het bord accepteert 3,3–5 V; de kale chip werkt alleen op 3,3 V 5 V op een Uno, 3,3 V op een ESP32
2 GND Ground, gedeeld met de microcontroller Aangesloten
3 SCL I²C-klok A5 op een Uno
4 SDA I²C-data A4 op een Uno
5 XDA Extra I²C-data — voor een magnetometer die de MPU voor je uitleest Open laten
6 XCL Extra I²C-klok Open laten
7 AD0 Adresselectie. Laag (standaard) = 0x68, hoog = 0x69 Open laten, of aan hoog vastzetten voor een tweede sensor
8 INT Interrupt-uitgang — activeert bij data gereed, beweging of vrije val Open laten tot je niet meer wilt pollen

AD0 is de pin waarmee twee MPU-6050-sensoren op één bus mogelijk worden. Daardoor heeft een adresconflict hier een eenvoudige oplossing die de meeste sensoren niet bieden.

Aansluiten op een Arduino

MPU-6050 Arduino Uno ESP32 Opmerking
VCC 5 V 3,3 V De ingebouwde regulator verwerkt beide
GND GND GND Moet gemeenschappelijk zijn met al het andere
SCL A5 GPIO 22 Voeg geen externe pull-ups toe — het bord heeft al 2,2 kΩ
SDA A4 GPIO 21 Hetzelfde
AD0 — — Verbind alleen met VCC voor een tweede sensor

Op een 5 V-Arduino zit er een subtiliteit. De pull-upweerstanden van de GY-521 lopen naar de gereguleerde 3,3 V-rail, dus de I²C-lijnen staan in rust op 3,3 V en niet op 5 V. Een ATmega328P leest hoog vanaf 0.6 × Vcc = 3.0 V, dus 3,3 V haalt die drempel—maar met slechts 0.3 V marge. In de praktijk werkt het betrouwbaar, en het is een reden waarom een lange of ruisende I²C-verbinding op dit bord eerder misgaat dan op een 5 V-bord.

De registers die ertoe doen

Je kunt deze sensor met een bibliotheek aansturen en nooit een register zien, maar vier registers verklaren bijna elk probleem dat mensen ermee hebben.

Register Adres Waarom het belangrijk is
PWR_MGMT_1 0x6B De chip start in slaapstand. Schrijf hier 0 of elke meting is nul
WHO_AM_I 0x75 Geeft 0x68 terug — de snelste manier om te bewijzen dat de bedrading klopt
GYRO_CONFIG 0x1B Meetbereik: ±250, ±500, ±1000, ±2000 °/s
ACCEL_CONFIG 0x1C Meetbereik: ±2, ±4, ±8, ±16 g
ACCEL_XOUT_H 0x3B Begin van 14 bytes: 6 accelerometer, 2 temperatuur, 6 gyroscoop — lees ze in één burst

De twee configuratieregisters stellen de schaalfactor in waarmee je ruwe tellingen deelt. Die verkeerd instellen is de meest voorkomende oorzaak van “mijn hoeken zijn vier keer te groot”:

Bereikinstelling Gyroscoop-LSB per °/s Bereikinstelling Accelerometer-LSB per g
±250 °/s (standaard) 131 ±2 g (standaard) 16384
±500 °/s 65,5 ±4 g 8192
±1000 °/s 32,8 ±8 g 4096
±2000 °/s 16,4 ±16 g 2048

Kies het kleinste bereik dat niet verzadigt. Een balancerende robot gaat zelden verder dan ±250 °/s, en het smalle bereik levert daardoor vier keer de resolutie van ±1000 °/s.

Minimaal werkende code

Geen bibliotheek—dit is het hele voorbeeld, en het is de moeite waard om het één keer te draaien zodat je weet wat de bibliotheek voor je doet.

#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);
}

Dit voorbeeld doet bewust twee dingen niet: het fuseert de twee sensoren nooit en trekt nooit een bias af. Beide stappen volgen daarna.

Kalibratie: de twintig regels die er het meest toe doen

In rust leest een gyroscoop geen nul. De sensor leest een kleine, vrijwel constante verschuiving, en omdat je de gyroscoop integreert om een hoek te krijgen, wordt die verschuiving geïntegreerd tot een voortdurend groeiende fout. Een bias van slechts 2 °/s die niet wordt gecorrigeerd, is 120° drift na een minuut.

Gemiddel enkele honderden monsters met de sensor volledig stilstaat en trek ze vervolgens af:

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

Drie praktische punten die het datasheet je niet vertelt:

  • Doe dit bij elke inschakeling, niet één keer. Gyroscoopbias verandert met de temperatuur, en een robot die tien minuten heeft gedraaid is niet de robot die je koud hebt gekalibreerd.
  • “Stil” betekent stil. Een kalibratie terwijl iemand op het bureau leunt, brandt die beweging permanent in de bias.
  • De accelerometer heeft een waterpasreferentie nodig, geen nul. Hij moet 1 g aflezen op de as die omlaag wijst. Leest hij 0,97 g, dan is dat je schaalfout en die verschijnt als een kantelhoek die consequent een paar graden afwijkt.

Waarom één sensor nooit genoeg is

De twee sensoren falen op precies tegengestelde manieren, en juist daarom werkt het fuseren ervan zo goed.

Accelerometer Gyroscoop
Meet Lineaire versnelling — in rust de zwaartekracht Draaisnelheid
Bepaalt kanteling door Trigonometrie op de zwaartekrachtvector De snelheid over tijd integreren
Korte termijn Ruisachtig — elke hobbel en trilling is ook versnelling Uitstekend, glad en responsief
Lange termijn Gemiddeld correct — de zwaartekracht drift niet Drift zonder grens doordat de bias wordt geïntegreerd
Faalt wanneer De robot versnelt, zodat “omlaag” niet lager omlaag is Altijd, langzaam

Een complementair filter neemt het goede deel van elk signaal over: vertrouw op korte termijn op de gyroscoop en laat de accelerometer de schatting langzaam terug naar de waarheid trekken:

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

Die 0,98 bepaalt de overnamefrequentie. Een hogere waarde vertrouwt langer op de gyroscoop, wat gladder is maar meer drift; een lagere reageert op de ruis van de accelerometer. De handleiding voor complementaire filters legt uit hoe je die waarde bewust kiest in plaats van op gevoel.

Problemen oplossen

Klacht Waarschijnlijke oorzaak Oplossing
Elke meting is exact 0 De chip staat nog in slaapstand Schrijf 0 naar PWR_MGMT_1 (0x6B) na Wire.begin()
Busscanner vindt niets 8-bits adres uit het datasheet De 0xD0 uit het datasheet is 0x68 een bit naar links verschoven — gebruik 0x68
Twee sensoren, slechts één verschijnt Beide op het standaardadres Verbind de AD0 van één bord met VCC zodat dat bord op 0x69 antwoordt
Hoeken zijn 4× of 8× te groot Schaalfactor komt niet overeen met het ingestelde bereik Pas de deler aan GYRO_CONFIG/ACCEL_CONFIG aan
Hoek drijft gestaag, ook in rust Ongekalibreerde gyroscoopbias Gemiddel bij het opstarten 500 stilstaande monsters en trek ze af
Kanteling springt tijdens het rijden De ruwe hoek uit de accelerometer wordt gebruikt Combineer met de gyroscoop; bij een bewegende robot is “omlaag” niet meer omlaag
Metingen bevriezen na een tijdje I²C-bus vastgelopen Controleer pull-ups; voeg een busherstelroutine toe die SCL negen keer klokt
Koers draait langzaam voortdurend Yaw heeft geen absolute referentie Verwacht — yaw heeft een magnetometer of een andere absolute bron nodig
Ruis bij ongeveer 1 kHz of meer vibratie Stijve montage die motorvibratie doorgeeft Monteer de sensor zacht; activeer de on-chip DLPF via CONFIG (0x1A)

MPU-6050 of iets nieuws?

De MPU-6050 is bij de fabrikant uit productie genomen en toch nog de meest gebruikte IMU in hobbyrobotica, omdat hij goedkoop is, overal gedocumenteerd is en door elke bibliotheek wordt ondersteund.

Onderdeel Assen Opvallend verschil Kies hem wanneer
MPU-6050 6 De standaard; enorm veel voorbeeldcode Leren, balanceren, elk eerste IMU-project
MPU-9250 9 Voegt een magnetometer toe, zodat yaw een absolute referentie heeft Je een kompaskoers nodig hebt, niet alleen een draaisnelheid
ICM-20948 9 De huidige productie-opvolger van de MPU-9250 Nieuwe ontwerpen die 9 assen en langdurige beschikbaarheid nodig hebben
BNO055 9 Voert de fusie op de chip uit en geeft direct de oriëntatie Je een hoek wilt zonder een filter te schrijven — voor een veelvoud van de prijs
LSM6DS3 6 Modern, in productie, minder ruis Een rechtstreekse vervanger wanneer de MPU-6050 niet meer geleverd wordt

Kort gezegd: als je robot pitch en roll nodig heeft — en dat is wat balanceren nodig heeft — is de MPU-6050 ruim voldoende en is het nuttig om de fusie zelf te schrijven. Is absolute koers nodig, dan kun je die met geen enkele filtering uit de zes assen afleiden; dan heb je een magnetometer nodig.

Verken de graaf

Gebruikt in deze bouwprojecten

Projecten, leerroutes en simulators waarin de MPU-6050 IMU voorkomt.

Vragen

FAQ over de MPU-6050 IMU

Wat is de MPU-6050-sensor?

De MPU-6050 is een 6-assige traagheidsmeeteenheid (IMU) op een klein breakout-bord. Ze combineert een 3-assige gyroscoop en een 3-assige accelerometer, zodat een robot kan meten hoe hij gekanteld is, hoe snel hij draait en hoe hij versnelt—allemaal via de I²C-bus.

Hoe werkt de MPU-6050?

Binnenin zitten twee sensoren. De accelerometer meet lineaire versnelling—in rust is dat alleen de zwaartekracht, waarmee de robot weet welke kant omlaag is (de kanteling). De gyroscoop meet de draaisnelheid om elke as. Je leest beide via I²C en combineert ze vervolgens tot een stabiele oriëntatie die geen van beide afzonderlijk kan geven.

Waar wordt de MPU-6050 voor gebruikt?

Om de beweging van de robot zelf te meten—een zelfbalancerende robot rechtop houden, de koers schatten en de odometrie tussen encodermetingen verbeteren, en detecteren dat de robot wordt omgekapt, opgepakt of geschud. De sensor meet de robot zelf, niet de wereld eromheen, en vult dus een afstandssensor aan in plaats van die te vervangen.

Hoe kalibreer je een MPU-6050?

In rust tonen de gyroscoop en accelerometer kleine afwijkingen van nul. Kalibreer door enkele honderden monsters te middelen terwijl de sensor volledig stilstaat en trek die verschuivingen vervolgens van elke meting af. Vooral de gyroscoop heeft dit nodig—een ongekalibreerde bias zorgt ervoor dat de berekende hoek het snelst afdrijft.

Hoe sluit je een MPU-6050 aan op een ESP32 of Arduino?

Via I²C—verbind SDA en SCL met de I²C-pins van het bord en sluit ook spanning en ground aan. De paarse GY-521-breakout heeft een regulator en werkt dus op 3,3 V bij een ESP32 of 5 V bij een Arduino Uno. Een bibliotheek leest vervolgens de registers van de gyroscoop en accelerometer voor je.

Verder lezen

Bronnen