Aan de Slag met een 6-DOF IMU Bewegingssensor (MPU-6050)
Onderdelen en Benodigdheden
| Onderdeel | Aantal | Opmerkingen |
|---|---|---|
| Arduino UNO | 1 | |
| Inertial Measurement Unit (IMU) (6 graden vrijheid) | 1 | MPU-6050 sensor |
Over Dit Project
Vandaag bestuderen we de beste beschikbare IMU (Inertiële Meet Unit) sensor en ontdekken hoe we deze met een Arduino kunnen koppelen. In een volgende tutorial zullen we de bewegingssensing in 3D visualiseren.
De IMU-sensormodule die we gebruiken is gebaseerd op de MPU-6050 sensor.
De MPU-6050 combineert een 3-as gyroscoop en een 3-as versnellingsmeter op dezelfde silicium-die, samen met een onboard Digital Motion Processor™ (DMP™) die complexe 6-as MotionFusion-algoritmes verwerkt.
Deze MotionTracking-apparaten zijn ontworpen voor de lage stroomverbruik, lage kosten en hoge prestaties van smartphones, tablets en wearables.

Benodigde Hardware
- Arduino UNO
- MPU-6050 sensor
- Aansluitleidingen

Software
Arduino IDE
Communicatieprotocol
Deze IMU-sensor communiceert met de Arduino via het I2C-busprotocol.
Je kunt versnellingsmeters en gyroscopen apart gebruiken, maar ze zijn niet zo nauwkeurig als deze gecombineerde module.

Aansluitschema
Raadpleeg een van de twee figuren hieronder voor de verbindingen.


Mocht je problemen hebben met de bovenstaande figuren, geen panic. Ga door de onderstaande pin-verbindingen:
- 5V [IMU MPU-6050] → VCC [ARDUINO]
- SDA [IMU MPU-6050] → Analog IN (A4) [ARDUINO]
- SCL [IMU MPU-6050] → Analog IN (A5) [ARDUINO]
- GND [IMU MPU-6050] → GND [ARDUINO]
- INTPIN [IMU MPU-6050] → Pin 2 (Digital PWM pin) [ARDUINO]


Let op: als je MPU-6050 module een 5V pin heeft, verbind dan met de 5V van de Arduino. Anders sluit je het aan op 3.3V om overspanning te voorkomen.
Programmeren van de Arduino
- Download de Arduino-bibliotheek voor MPU-6050 (MPU6050.zip). Pak uit en kopieer de map "MPU6050" naar de Arduino libraries-map.
- Download ook de "I2Cdev.zip" bibliotheek (indien nog niet geïnstalleerd) en plaats deze op dezelfde manier in de libraries-map.
- Open de Arduino IDE en controleer of de bibliotheken zichtbaar zijn (Bestand → Voorbeelden → MPU6050 → Examples → MPU6050_DMP6).
- Open het bestand
MPU6050_DMP6en voeg de bibliothekenI2CdevenMPU6050toe aan de sketch. - Compileer de sketch.
- Controleer of de juiste COM-poort is geselecteerd (Hulpmiddelen → Poort).
- Upload de sketch naar de Arduino.
- Open de Seriële Monitor (Ctrl+Shift+M) en stel de baudrate in op 115200. (Opmerking: 8MHz of langzamere processoren zoals Teensy @ 3.3V of Arduino Pro Mini @ 3.3V kunnen deze baudrate niet betrouwbaar aan; gebruik dan 38400 of lager.)
- Als je "Initializing I2C devices…" niet ziet, druk op de RESET-knop.
Kennishoek: Wat is DMP?
DMP staat voor Digital Motion Processing. De InvenSense MPU-6050 heeft een ingebouwde bewegingsprocessor die de waarden van de versnellingsmeter en gyroscoop verwerkt om nauwkeurige 3D-waarden te geven: Yaw, Pitch en Roll.

Kennishoek: Wat is I2C?
I2C (Inter-Integrated Circuit) is een seriële bus met twee actieve draden (SDA = Serial Data, SCL = Serial Clock) en een ground-verbinding. Elk apparaat op de bus heeft een uniek adres. De bus is multi-master: meerdere IC's kunnen de bus initieren. De Arduino fungeert als Bus Master, de MPU-sensor als Bus Slave.
Visualisatie in 3D
Visualiseer de beweging in 3D in mijn volgende tutorial. Klik hier

Code
Bestand: Arduino code for MPU sensor (Arduino)
// I2Cdev en MPU6050 moeten als bibliotheken geïnstalleerd zijn
#include "I2Cdev.h"
#include "MPU6050_6Axis_MotionApps20.h"
//#include "MPU6050.h" // niet nodig als MotionApps gebruikt wordt
#if I2CDEV_IMPLEMENTATION == I2CDEV_ARDUINO_WIRE
#include "Wire.h"
#endif
MPU6050 mpu; // standaard I2C adres 0x68 (AD0 laag)
// MPU6050 mpu(0x69); // voor AD0 hoog
#define OUTPUT_READABLE_YAWPITCHROLL
#define LED_PIN 13
bool blinkState = false;
bool dmpReady = false;
uint8_t mpuIntStatus, devStatus;
uint16_t packetSize, fifoCount;
uint8_t fifoBuffer[64];
Quaternion q;
VectorInt16 aa, aaReal, aaWorld;
VectorFloat gravity;
float euler[3], ypr[3];
uint8_t teapotPacket[14] = { '$', 0x02, 0,0, 0,0, 0,0, 0,0, 0x00, 0x00, '\r', '\n' };
volatile bool mpuInterrupt = false;
void dmpDataReady() { mpuInterrupt = true; }
void setup() {
#if I2CDEV_IMPLEMENTATION == I2CDEV_ARDUINO_WIRE
Wire.begin();
TWBR = 24; // 400kHz I2C clock
#elif I2CDEV_IMPLEMENTATION == I2CDEV_BUILTIN_FASTWIRE
Fastwire::setup(400, true);
#endif
Serial.begin(115200);
while (!Serial); // wacht op Leonardo enumeratie
Serial.println(F("Initializing I2C devices..."));
mpu.initialize();
Serial.println(F("Testing device connections..."));
Serial.println(mpu.testConnection() ? F("MPU6050 connection successful") : F("MPU6050 connection failed"));
Serial.println(F("\nSend any character to begin DMP programming and demo: "));
while (Serial.available() && Serial.read()); // leeg buffer
while (!Serial.available()); // wacht op data
while (Serial.available() && Serial.read()); // leeg buffer
Serial.println(F("Initializing DMP..."));
devStatus = mpu.dmpInitialize();
// Gyro offsets (voor min gevoeligheid)
mpu.setXGyroOffset(220);
mpu.setYGyroOffset(76);
mpu.setZGyroOffset(-85);
mpu.setZAccelOffset(1788); // 1688 fabrieksstandaard
if (devStatus == 0) {
Serial.println(F("Enabling DMP..."));
mpu.setDMPEnabled(true);
Serial.println(F("Enabling interrupt detection (Arduino external interrupt 0)..."));
attachInterrupt(0, dmpDataReady, RISING);
mpuIntStatus = mpu.getIntStatus();
Serial.println(F("DMP ready! Waiting for first interrupt..."));
dmpReady = true;
packetSize = mpu.dmpGetFIFOPacketSize();
} else {
Serial.print(F("DMP Initialization failed (code "));
Serial.print(devStatus);
Serial.println(F(")"));
}
pinMode(LED_PIN, OUTPUT);
}
void loop() {
if (!dmpReady) return;
while (!mpuInterrupt && fifoCount < packetSize) {
// andere taken hier
}
mpuInterrupt = false;
mpuIntStatus = mpu.getIntStatus();
fifoCount = mpu.getFIFOCount();
if ((mpuIntStatus & 0x10) || fifoCount == 1024) {
mpu.resetFIFO();
Serial.println(F("FIFO overflow!"));
} else if (mpuIntStatus & 0x02) {
while (fifoCount < packetSize) fifoCount = mpu.getFIFOCount();
mpu.getFIFOBytes(fifoBuffer, packetSize);
fifoCount -= packetSize;
#ifdef OUTPUT_READABLE_YAWPITCHROLL
mpu.dmpGetQuaternion(&q, fifoBuffer);
mpu.dmpGetGravity(&gravity, &q);
mpu.dmpGetYawPitchRoll(ypr, &q, &gravity);
Serial.print("ypr\t");
Serial.print(ypr[0] * 180/M_PI); Serial.print("\t");
Serial.print(ypr[1] * 180/M_PI); Serial.print("\t");
Serial.println(ypr[2] * 180/M_PI);
#endif
blinkState = !blinkState;
digitalWrite(LED_PIN, blinkState);
}
}
Schema's

Productieproces
- Lijnvolgsensor met Raspberry Pi – Simpele KY-033 deur/lijndetector
- Een robuuste temperatuur- en sensor-API bouwen op Raspberry Pi met de GY-91-module
- Een LED Besturen met een PIR-bewegingssensor op Raspberry Pi
- Raspberry Pi GPIO onder de knie: Een PIR-bewegingsensor interfacen op B+/Model 2
- Hoe de HC‑SR501 PIR-bewegingsensor aan te sluiten, kalibreren en programmeren met een Raspberry Pi
- Aan de slag met TJBot: Bouw, Configureer en Stem-bedien Je Eigen AI-robot
- Stap-voor-stap Handleiding om een RAK 831 LoRa-gateway op Raspberry Pi 3 te Deployen
- Bouw een LoRa Gateway met de RAK831 Module op Raspberry Pi 3 – Stap-voor-Stap Gids
- Arduino Beginner Tutorial 01: Start met Je Eerste Project
- Ontdek de Eagle Group: Uw Partner voor Kwalitatieve Metaalproductie
- AI in verzekeringen: Een praktische startergids voor real-world implementatie