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.
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.
- ProjectBouw een GPS-waypointrover die zelfstandig rijdt
- ProjectBouw een Mecanum-robot die zijwaarts rijdt
- ProjectBouw een micromouse: robot die doolhoven oplost met flood fill
- ProjectBouw een zelfbalancerende robot met MPU6050 en PID
- LeerrouteElektronicafundamenten voor robots: een leertraject
- LeerrouteHolonome aandrijving: zijwaarts bewegen zonder te draaien
- LeerroutePadplanning en kartering: van flood fill tot SLAM
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