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?
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 Pin | Pi Pico Pin | Funktion |
---|---|---|
VCC | 3.3V (Pin 36) | Stromversorgung |
GND | GND (Pin 38) | Masse |
SDA | GP20 (Pin 25) | I2C Datenleitung |
SCL | GP21 (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:
- imu.py: https://github.com/shillehbean/youtube-channel/blob/main/imu.py
- vector3d.py: https://github.com/shillehbean/youtube-channel/blob/main/vector3d.py
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 einmpu = MPU6050(i2c)
erstellt das Sensorobjekt für MPU6050mpu.accel.x, mpu.accel.y, mpu.accel.z
lesen die Beschleunigungswerte ausmpu.gyro.x, mpu.gyro.y, mpu.gyro.z
lesen die Gyroskopwerte aussleep(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 Vektorvec
. 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.