đĽ MPU
âGrunverständnis fĂźr den MPU6050 Bewegungssensorâ
Hier lernst du den MPU6050 Bewegungssensor kennen â den "Gleichgewichtssinn" deines Shuttles fĂźr Lage und Bewegung. Er erkennt, wie dein Shuttle geneigt oder beschleunigt wird â ähnlich wie die Sensoren in einem Smartphone oder einer Drohne.
đ Zielâ
- Du verstehst, wie der MPU6050 ßber den I²C-Bus kommuniziert.
- Du kannst seine Sensordaten auslesen.
- Du beobachtest, wie sich die Messwerte beim Bewegen des Shuttles verändern.
1. Hintergrundâ
Der MPU6050 enthält zwei Sensoren:
| Sensor | Aufgabe |
|---|---|
| Beschleunigungssensor | Misst Bewegung entlang der Achsen X, Y, Z |
| Gyroskop | Misst Drehgeschwindigkeit um die Achsen |
Die Kommunikation läuft ßber I²C (Inter-Integrated Circuit). Dabei gibt es immer einen Master (hier: Arduino) und einen Slave (hier: MPU6050). Beide sind ßber zwei Leitungen verbunden:
- đ˘ SDA â Datensignal
- đĄ SCL â Taktsignal
Der Arduino fragt regelmäĂig Werte vom Sensor ab.
2. Code: Sensor auslesenâ
#include <Wire.h>
#include <MPU6050_tockn.h>
MPU6050 mpu(Wire);
void setup() {
Serial.begin(9600);
Wire.begin();
mpu.begin();
mpu.calcGyroOffsets(true); // Kalibrierung beim Start
}
void loop() {
mpu.update();
Serial.print("Acc X: "); Serial.print(mpu.getAccX());
Serial.print(" | Acc Y: "); Serial.print(mpu.getAccY());
Serial.print(" | Acc Z: "); Serial.println(mpu.getAccZ());
delay(200);
}
3. Erklärung zum Codeâ
Wire.begin()aktiviert die I²C-Kommunikation.mpu.begin()startet den Sensor.mpu.calcGyroOffsets(true)kalibriert das Gyroskop â halte das Shuttle dabei ruhig.mpu.update()liest aktuelle Werte vom Sensor ein.- Ăber den Serial Monitor kannst du die Messwerte in Echtzeit sehen.
4. Aufgabeâ
Bewege dein Shuttle vorsichtig in verschiedene Richtungen:
- Kippe es nach vorne, hinten, links oder rechts
- Beobachte, wie sich die Werte von Acc X, Acc Y und Acc Z verändern
- Was passiert, wenn du das Shuttle umdrehst oder schĂźttelst?
Notiere deine Beobachtungen â das hilft dir, die Sensorachsen zu verstehen.
⨠Aufgabe: Lagewinkel berechnen und anzeigenâ
In dieser Aufgabe lernst du, wie man mit dem MPU6050 Bewegungssensor die Lage des Shuttles im Raum bestimmt. Wir berechnen dafĂźr die sogenannten Winkelachsen:
- Roll (X) â Kippen nach links/rechts
- Pitch (Y) â Neigung nach vorne/hinten
đ Zielâ
- Du liest die Neigungswinkel vom MPU6050 aus.
- Du gibst die Werte im Serial Monitor aus.
- Du beobachtest, wie sich die Zahlen bei Bewegungen verändern.
1. Erklärungâ
Der MPU6050 kombiniert ein Gyroskop (erkennt Drehungen) und einen Beschleunigungssensor (fĂźhlt Schwerkraft). Damit kann er berechnen, wie stark dein Shuttle geneigt ist.
Die Bibliothek MPU6050_tockn liefert fertige Funktionen dafĂźr:
| Funktion | Bedeutung |
|---|---|
getAngleX() | Roll (Neigung nach links/rechts) |
getAngleY() | Pitch (Neigung nach vorne/hinten) |
2. Codeâ
#include <Wire.h>
#include <MPU6050_tockn.h>
MPU6050 mpu(Wire);
void setup() {
Serial.begin(9600);
Wire.begin();
mpu.begin();
mpu.calcGyroOffsets(true); // Kalibrierung
}
void loop() {
mpu.update();
Serial.print("Roll (X): ");
Serial.print(mpu.getAngleX());
Serial.print("° | Pitch (Y): ");
Serial.print(mpu.getAngleY());
Serial.println("°");
delay(300);
}
3. Experiment-Tippâ
- Lege das Shuttle flach auf den Tisch: Die Winkel sollten nahe 0° liegen.
- Kippe es leicht nach links/rechts â beobachte die Roll-Achse (X).
- Kippe es nach vorne/hinten â beobachte die Pitch-Achse (Y).
- Wie ändert sich das Vorzeichen (+/â)?
đ Aufgabe: LEDs mit Bewegung steuernâ
In dieser Aufgabe lernst du, wie du Sensordaten nutzt, um LEDs zu steuern. Dein Shuttle reagiert auf Neigung â wenn du es nach links oder rechts kippst, leuchtet die entsprechende Navigations-LED! đ
đ Zielâ
- Du liest Neigungswerte (Winkel) vom MPU6050 aus.
- Du nutzt diese Werte, um LEDs gezielt ein- oder auszuschalten.
- Du siehst direkt, wie dein Code auf Bewegungen reagiert.
1. Aufbauâ
Verwende die vorhandenen LEDs:
- đ´ Port (links): Pin 7
- đ˘ Starboard (rechts): Pin 8
2. Codeâ
#include <Wire.h>
#include <MPU6050_tockn.h>
MPU6050 mpu(Wire);
const int portLedPin = 7; // linke LED (rot)
const int starboardLedPin = 8; // rechte LED (grĂźn)
void setup() {
Serial.begin(9600);
Wire.begin();
mpu.begin();
mpu.calcGyroOffsets(true); // Sensor kalibrieren
pinMode(portLedPin, OUTPUT);
pinMode(starboardLedPin, OUTPUT);
}
void loop() {
mpu.update();
float angleY = mpu.getAngleY(); // Neigung nach links/rechts
float angleX = mpu.getAngleX(); // Neigung nach vorne/hinten
// LEDs basierend auf der Neigung einschalten
digitalWrite(portLedPin, angleY < -5); // nach links kippen â linke LED
digitalWrite(starboardLedPin, angleY > 5); // nach rechts kippen â rechte LED
// Ausgabe im Serial Monitor
Serial.print("Roll (X): ");
Serial.print(angleX);
Serial.print("° | Pitch (Y): ");
Serial.println(angleY);
delay(100);
}
3. Erklärungâ
mpu.getAngleX()â misst, wie stark das Shuttle nach vorne/hinten geneigt istmpu.getAngleY()â misst, wie stark das Shuttle nach links/rechts geneigt ist- Je nach Winkel werden die Navigationslichter aktiviert
- Der Grenzwert
¹5°verhindert, dass die LEDs bei kleinen Bewegungen ständig flackern
âď¸ Bonus-Ideenâ
- Passe den Schwellwert (
Âą5°) an, um die Empfindlichkeit zu verändern. - Lasse die Beacon-LED pulsieren, wenn das Shuttle âfliegtâ (stark bewegt wird).
- Miss, ob sich die X/Y-Achsen ändern, wenn du das Shuttle anders herum montierst.