Beschleunigungs-Sensor (MPU 6050) mit dem Pi Pico

Erfahre, wie du den MPU6050 Sensor mit dem Raspberry Pi Pico verbindest, die passenden Bibliotheken installierst und Bewegungsdaten wie Neigung, Drehgeschwindigkeit und freien Fall mit MicroPython ausliest.

Was brauchst du?

  • MPU6050 Sensor
  • Raspberry Pi Pico + Micro-USB-Kabel
  • Jumper Kabel + Brearboard

Schritt 1: Was kann der MPU 6050?

Der MPU6050 ist ein vielseitiger Sensor, der Bewegung und Lage misst. Er kombiniert einen 3-Achsen-Beschleunigungssensor und ein 3-Achsen-Gyroskop in einem Baustein. Damit kann er Beschleunigungen, Drehgeschwindigkeiten und Neigungswinkel erfassen. So eignet er sich ideal für Anwendungen wie Bewegungssteuerung, Stabilisierung, Orientierung und Schrittzählung.

Schritt 2: Anschließen des MPU6050 an den Pi Pico

Der MPU6050 kommuniziert über das I2C-Protokoll, eine serielle Schnittstelle, die nur zwei Leitungen (SDA und SCL) benötigt, um Daten zwischen Sensor und Mikrocontroller auszutauschen.

MPU6050 PinPi Pico PinFunktion
VCC3.3V (Pin 36)Stromversorgung
GNDGND (Pin 38)Masse
SDAGP20 (Pin 25)I2C Datenleitung
SCLGP21 (Pin 26)I2C Taktleitung

Schritt 3: Bibliotheken einbinden

Für die Arbeit mit dem MPU6050 auf dem Raspberry Pi Pico brauchst du spezielle Python-Bibliotheken, die das Auslesen und Verarbeiten der Sensordaten erleichtern. In diesem Projekt verwenden wir zwei wichtige Bibliotheken:

  • imu.py: Diese Bibliothek enthält den Treiber für den MPU6050. Sie kümmert sich um die Kommunikation über I2C und stellt die Sensordaten als einfach nutzbare Objekte bereit.
  • vector3d.py: Diese Bibliothek stellt eine 3D-Vektor-Klasse zur Verfügung, mit der du die Sensordaten besser interpretieren kannst, etwa zur Berechnung von Neigungswinkeln oder Bewegungsvektoren.

Diese Bibliotheken müssen auf dem Raspberry Pi Pico im Dateisystem gespeichert werden, damit dein Skript sie importieren kann. Du findest die Dateien hier:

Du kannst die Dateien direkt herunterladen und mit einem Tool wie Thonny auf den Pico übertragen. So hast du sie lokal und kannst dein Programm mit import imu und import vector3d verwenden.

Schritt 4: Sensordaten auslesen

Um die Werte des MPU6050 auszulesen, nutzen wir eine einfache Schleife, die die Beschleunigungs- und Gyroskopdaten kontinuierlich liest und auf der Konsole ausgibt. Hier der Beispielcode:

from imu import MPU6050
from machine import I2C, Pin
from time import sleep

i2c = I2C(0, sda=Pin(20), scl=Pin(21), freq=400000)  # I2C bus 1, SDA pin 20, SCL pin 21, 400kHz

mpu = MPU6050(i2c)

while True:
    print("-" * 50)
    print("x: %s, y: %s, z: %s" % (mpu.accel.x, mpu.accel.y, mpu.accel.z))
    print("X: %s, Y: %s, Z: %s" % (mpu.gyro.x, mpu.gyro.y, mpu.gyro.z))
    sleep(1)

Erklärung des Codes:

  • i2c = I2C(0, sda=Pin(20), scl=Pin(21), freq=400000) richtet die I2C-Schnittstelle ein
  • mpu = MPU6050(i2c) erstellt das Sensorobjekt für MPU6050
  • mpu.accel.x, mpu.accel.y, mpu.accel.z lesen die Beschleunigungswerte aus
  • mpu.gyro.x, mpu.gyro.y, mpu.gyro.z lesen die Gyroskopwerte aus
  • sleep(1) pausiert 1 Sekunde zwischen den Messungen für bessere Übersicht in der Ausgabe

Schritt 5: Sensordaten interpretieren

Wenn der MPU6050 im Ruhezustand still auf dem Tisch liegt, zeigen die Beschleunigungswerte auf den X- und Y-Achsen meist nahe null, denn in diesen Richtungen wirkt keine Bewegung. Die Z-Achse hingegen misst ungefähr 1 g – das ist die Erdanziehungskraft, die senkrecht nach unten zieht und somit auf den Sensor wirkt.

Das Gyroskop misst die Drehgeschwindigkeit um die drei Achsen. Wenn du den Sensor nach vorne neigst, verändert sich der Wert der X-Achse negativ oder positiv, je nachdem, in welche Richtung du kippst. Ähnlich reagiert die Y-Achse, wenn du den Sensor seitlich kippst. Dreht sich der Sensor, zeigen die Gyroskopwerte wie schnell die Drehung in Grad pro Sekunde (°/s) stattfindet.

Die Beschleunigungswerte geben Auskunft über die Orientierung und Bewegung des Sensors im Raum. Kippst du den Sensor nach links oder rechts, verändern sich die X-Werte entsprechend. Bewegst du ihn vor oder zurück, ändern sich die Y-Werte. Die Z-Werte zeigen an, wie der Sensor im Verhältnis zur Schwerkraft ausgerichtet ist: Zeigt der Sensor nach oben, ist der Wert positiv, wird er umgedreht (Kopfstand), ist er negativ.

So kannst du mit den gemessenen Daten zum Beispiel Neigungen, Drehungen oder sogar Stürze erkennen und auswerten.

Schritt 6: Beispiel-Projekte

Freier-Fall-Erkennung

Mit dem MPU6050 und der vector3d-Bibliothek kannst du ganz einfach einen freien Fall erkennen. Der Sensor misst dabei die Beschleunigung in alle Richtungen, und wenn diese praktisch auf Null sinkt, befindet sich der Sensor im freien Fall.

from imu import MPU6050
from machine import I2C, Pin
from time import sleep
from vector3d import Vector3d

i2c = I2C(0, sda=Pin(20), scl=Pin(21), freq=400000)
mpu = MPU6050(i2c)

def update_accel():
    vec._vector = [mpu.accel.x, mpu.accel.y, mpu.accel.z]

vec = Vector3d(transposition=(0,1,2), scaling=(1,1,1), update_function=update_accel)

while True:
    magnitude = vec.magnitude
    
    if magnitude < 0.1:
        print("⚠ Freier Fall erkannt!")
        sleep(0.5)
    
    sleep(0.1)

Erklärung des Codes:

  • Die Funktion update_accel() liest die aktuellen Beschleunigungswerte vom MPU6050 und aktualisiert den Vektor vec.
  • vec.magnitude berechnet die Gesamtbeschleunigung aus den drei Achsen (x, y, z).
  • Wenn die Gesamtbeschleunigung unter 0.1 g fällt, wird ein freier Fall erkannt und eine Warnung ausgegeben.
  • Die sleep(0.5) sorgt dafür, dass die Meldung nicht zu oft hintereinander erscheint.
  • Die sleep(0.1) am Ende des Loops reduziert die CPU-Last und gibt dem Sensor Zeit, neue Daten zu liefern.

Neigungswinkel messen

Der MPU6050 kann zusammen mit der vector3d-Bibliothek auch den Neigungswinkel (Elevation) des Sensors bestimmen. So erfährst du, wie stark dein Gerät geneigt ist.

from imu import MPU6050
from machine import I2C, Pin
from time import sleep
from vector3d import Vector3d

i2c = I2C(0, sda=Pin(20), scl=Pin(21), freq=400000)
mpu = MPU6050(i2c)

def update_accel():
    vec._vector = [mpu.accel.x, mpu.accel.y, mpu.accel.z]

vec = Vector3d((0,1,2), (1,1,1), update_accel)

while True:
    inclination = vec.inclination
    print(f"Neigungswinkel: {inclination:.2f}°")
    
    if inclination > 80:
        print("Sensor zeigt fast senkrecht nach oben")
    elif inclination < 10:
        print("Sensor liegt fast waagerecht")
    else:
        print("Sensor ist geneigt")
    
    sleep(0.5)

Erklärung des Codes:

  • update_accel() liest die Beschleunigungswerte aus dem MPU6050 und aktualisiert den Vektor.
  • vec.inclination liefert den Neigungswinkel in Grad, basierend auf der Beschleunigung.
  • Der Code gibt eine Statusmeldung aus, abhängig vom Winkel:
    • Über 80° bedeutet fast senkrecht nach oben.
    • Unter 10° heißt fast waagerecht liegend.
    • Dazwischen ist der Sensor geneigt.
  • Die sleep(0.5) sorgt für eine halbsekündliche Aktualisierung und schont die CPU.

So kannst du leicht die Ausrichtung deines Geräts bestimmen – ideal für Anwendungen wie Neigungsmesser oder Ausrichtungsanzeigen.

Drehgeschwindigkeit messen

Mit dem Gyroskop des MPU6050 kannst du die Drehgeschwindigkeit deines Sensors erfassen. Das ist hilfreich, um schnelle Bewegungen oder Rotationen zu erkennen.

# Beispiel 3: Drehgeschwindigkeit (Gyro) mit MPU6050 und vector3d

from imu import MPU6050
from machine import I2C, Pin
from time import sleep
from vector3d import Vector3d

i2c = I2C(0, sda=Pin(20), scl=Pin(21), freq=400000)
mpu = MPU6050(i2c)

def update_gyro():
    vec._vector = [mpu.gyro.x, mpu.gyro.y, mpu.gyro.z]

vec = Vector3d((0,1,2), (1,1,1), update_gyro)

while True:
    rotation_speed = vec.magnitude
    print(f"Drehgeschwindigkeit (Gyro): {rotation_speed:.2f} °/s")
    
    if rotation_speed > 100:
        print("⚠ Schnelle Drehung erkannt!")
    else:
        print("Drehgeschwindigkeit normal")
    
    sleep(1)

Erklärung des Codes:

  • update_gyro() liest die Gyroskop-Werte aus dem MPU6050 und aktualisiert den Vektor.
  • vec.magnitude gibt die Gesamt-Drehgeschwindigkeit (in °/s) als Betrag des Gyro-Vektors zurück.
  • Der Code zeigt eine Warnung an, wenn die Drehgeschwindigkeit 100 °/s überschreitet.
  • Eine Pause von 1 Sekunde (sleep(1)) sorgt für eine übersichtliche Ausgabe und schonenden CPU-Verbrauch.

So kannst du Rotationsbewegungen überwachen, etwa für Bewegungssteuerungen oder Stabilisierungssysteme.

Fazit

Der MPU6050 ist ein vielseitiger Sensor, der sowohl Beschleunigungs- als auch Drehgeschwindigkeitsdaten liefert. In Kombination mit der vector3d-Bibliothek lassen sich diese Daten einfach auswerten und in nützliche Anwendungen wie Freier-Fall-Erkennung, Neigungsmessung oder Drehgeschwindigkeitsüberwachung umsetzen.