Der MPU6050 Gyroskop- und Beschleunigungssensor ist ein weitverbreiteter und beliebter Sensor, der in der Lage ist, Bewegungsdaten, Beschleunigungsdaten und sogar die Temperatur zu erfassen.
Der Sensor kombiniert ein 3-Achsen-Gyroskop und einen 3-Achsen-Beschleunigungssensor in einem einzigen Chip. Die Sensordaten werden dabei unter anderem über die I2C-Schnittstelle, die du bereits in den vorherigen Lektionen kennengelernt hast, gesendet.
Bei einem Gyroskop handelt es sich um einen Sensor, der zur Messung der Lageposition eines Objektes verwendet wird. Der Sensor ist in der Lage, Änderungen in der X-, Y- und Z-Achsenposition zu erfassen und diese Messwerte mit der ursprünglichen Position zu vergleichen. Dadurch kann zum Beispiel der Neigungswinkel genau ermittelt werden.
Mit einem Beschleunigungssensor messen wir die Beschleunigung in Bezug auf die X-, Y- und Z-Achse. Wir können dadurch den Grad der Beschleunigung ermitteln, mit dem sich der Funduino Cube zum Beispiel durch Menschenhand bewegt.
Die Kombination dieser beiden Sensoren macht den MPU6050-Sensor so besonders: Es ermöglicht die Orientierung in einem dreidimensionalen Raum. Dieser Sensortyp wird genau aus diesem Grund häufig zur Steuerung von Robotern, in VR-Brillen, zur Flugzeugstabilisierungen in Flugmodellen oder zur Gestenerkennung eingesetzt.
In dieser Lektion möchten wir das Gyroskop auf unserem MPU6050 dafür verwenden, die Lageposition zu ermitteln. Die erfassten Winkelpositionen der X-, Y- und Z-Achse möchten wir uns im Seriellen Monitor anzeigen lassen.
Damit wir die Funktionen des MPU6050-Sensors verwenden können, greifen wir auch in dieser Lektion auf eine Bibliothek zurück.
Die Bibliothek „<TinyMPU6050.h>“ von Gabrial Milan können wir direkt über die Bibliotheksverwaltung zu unserer Arduino IDE hinzufügen. Wir binden die Bibliothek über den bereits bekannten Befehl „#include <TinyMPU6050.h>“ in unser Programm ein.
In Lektion 11 haben wir bereits gelernt, was ein Objekt ist und wofür wir Objekte in einem Programm verwenden.
Auch in dieser Lektion verwenden wir ein Objekt, dass wir über die Programmzeile „MPU6050 MPU (Wire);“ erstellen.
Der Ausdruck „MPU6050“ ruft dabei eine Funktion aus der Bibliothek auf, mit welcher wir den Namen für unser Objekt definieren können. Wir wählen in unserem Beispiel den Namen „MPU“. Über den Ausdruck (Wire) wird definiert, dass die Kommunikation über die I2C-Schnittstelle (also die Pins A4 und A5) erfolgen soll.
/* Bibliotheken */
#include
/* Variablen */
MPU6050 MPU (Wire);
Anschließend bereiten wir unseren Mikrocontroller auf den Empfang von Messdaten über den I2C-Bus des MPU-6050 vor. Auch diesen Vorgang kennst du bereits aus der Lektion 11.
Da wir die Messwerte auf dem Seriellen Monitor ausgeben möchten, starten wir über den Befehl „Serial.begin(9600)“ die serielle Kommunikation und legen mit 9600 auch die sogenannte Baudrate (Übertragungsgeschwindigkeit) fest.
/* Bibliotheken */
#include
/* Variablen */
MPU6050 MPU (Wire);
/* setup */
void setup()
{ // start setup
MPU.Initialize();
Serial.begin(9600);
Im Eingangstext dieser Lektion haben wir beschrieben, dass das Gyroskop auf unserem MPU6050 die Winkelposition des Sensors im Verhältnis zur ursprünglichen Position erfassen kann.
Damit wir also diese Veränderung der Winkelposition auch messen können, müssen wir den MPU6050 zuerst kalibrieren. Durch diese Kalibrierung wird die ursprüngliche Position gespeichert und wir können den Grad der Neigung unseres Funduino Cubes messen.
Die Kalibrierung erfolgt ebenfalls durch einen Befehl aus unserer Bibliothek. Der Befehl lautet „MPU.Calibrate();“.
Da die Kalibrierung etwas Zeit in Anspruch nimmt und wir den Funduino Cube in dieser Zeit nicht bewegen dürfen, lassen wir uns mit der Programmzeile „Serial.println();“ im seriellen Monitor anzeigen, wann die Kalibrierung beginnt und wann sie abgeschlossen ist.
Mit dem dritten Schritt ist der Setup-Teil unseres Programms abgeschlossen.
/* Bibliotheken */
#include
/* Variablen */
MPU6050 MPU (Wire);
/* setup */
void setup()
{ // start setup
MPU.Initialize();
Serial.begin(9600);
Serial.println("Kalibrierung beginnt, bitte warten!");
MPU.Calibrate();
Serial.println("Kalibrierung abgeschlossen");
} // ende setup
Wir starten mit der Programmzeile „MPU.Execute();“ . Mit diesem Befehl werden die aktuellen Messdaten des MPU6050-Sensors über die I2C Schnittstelle abgerufen.
Dieser Schritt ist notwendig, um die Messdaten im weiteren Programmverlauf verarbeiten zu können.
/* Bibliotheken */
#include
/* Variablen */
MPU6050 MPU (Wire);
/* setup */
void setup()
{ // start setup
MPU.Initialize();
Serial.begin(9600);
Serial.println("Kalibrierung beginnt, bitte warten!");
MPU.Calibrate();
Serial.println("Kalibrierung abgeschlossen");
} // ende setup
void loop()
{ // start loop
MPU.Execute();
Wir erweitern unseren Loop-Teil um zwei weitere Programmzeilen.
Bei der ersten Programmzeile „Serial.print(„Winkel X-Achse = „);“ handelt es sich um eine einfache Textausgabe im seriellen Monitor. In die Klammer dieser Programmzeile können wir den Text hinterlegen, der im seriellen Monitor ausgegeben werden soll.
Die zweite Programmzeile „Serial.print(MPU.GetAngX());“ gibt ebenfalls einen Text im seriellen Monitor aus. Anders als in der ersten Programmzeile, geben wir jetzt allerdings keinen festen Text aus, sondern rufen mit dem Ausdruck „MPU.GetAngX()“ die aktuelle Winkelposition der X-Achse des MPU6050 ab.
Mit diesem fünften Schritt können wir die Winkelveränderung der X-Achse erstmalig einsehen. Höchste Zeit also, den Programmcode einmal auszuprobieren.
/* Bibliotheken */
#include
/* Variablen */
MPU6050 MPU (Wire);
/* setup */
void setup()
{ // start setup
MPU.Initialize();
Serial.begin(9600);
Serial.println("Kalibrierung beginnt, bitte warten!");
MPU.Calibrate();
Serial.println("Kalibrierung abgeschlossen");
} // ende setup
void loop()
{ // start loop
MPU.Execute();
Serial.print("Winkel X-Achse = ");
Serial.print(MPU.GetAngX());
} // ende loop
Toll gemacht! Wenn du deinen Funduino Cube jetzt etwas bewegst, sollten sich die im seriellen Monitor angezeigten Messwerte verändern.
Auf der Platine des MPU6050 kannst du ablesen, wie du deinen Funduino Cube neigen musst, um den Messwert der X-Achse zu verändern.
Nachdem wir diesen Schritt vollständig abgeschlossen haben, ergänzen wir die weiteren Programmzeilen für das Auslesen des Winkels der Y- und Z-Achse.
Hierfür verwenden wir ebenfalls den Ausdruck „(MPU.GetAngX())“. Allerdings tauschen wir jetzt das X gegen ein Y oder Z aus – je nachdem, welchen Messwert wir zuerst auswerten möchten.
Um zu Überprüfen, ob du den Programmcode korrekt erweitert hast, kannst du das Programm ganz einfach auf den Mikrocontroller deines Funduino Cubes überspielen und die Messwerte im seriellen Monitor verfolgen.
Das war doch ganz einfach, oder?
Wie müsstest du deinen Programmcode erweitern, damit die folgenden Bedingungen erfüllt sind?
#include // Einbinden der Bibliothek
MPU6050 MPU (Wire); // Objekt MPU6050 wird erstellt, Kommunikation erfolgt via I2C
void setup()
{
MPU.Initialize(); // Initialisierung des Sensors mit dem Namen "MPU6050".
Serial.begin(9600); // Die Serielle Schnittstelle wird gestartet, damit die Messwerte später am Seriellen Monitor ausgelesen werden können.
Serial.println("Kalibrierung beginnt, bitte warten!"); //Mit diesem Befehl wird am Seriellen Monitor der Beginn der Kalibrierung angezeigt.
MPU.Calibrate(); // Starten der Kalibrierung.
Serial.println("Kalibrierung abgeschlossen"); // Nachdem der Vorgang der Kalibrierung abgeschlossen ist, wird das Setup weiter ausgeführt. Als Rückmeldung der abgeschlossenen Kalibrierung wird an dieser Stelle der Test "Kalibrierung abgeschlossen" an den Seriellen Monitor gesendet.
}
void loop()
{
MPU.Execute(); // Mit diesem Befehl werden die aktuellen Sensorwerte über die I2C-Schnittstelle abgerufen.
Serial.print("Winkel X-Achse = "); // Am Seriellen Monitor erscheint der Text "Winkel X-Achse="
Serial.print(MPU.GetAngX()); // Ausgabe des Messwertes der X-Achse
Serial.print(" Winkel Y-Achse = "); // Am Seriellen Monitor erscheint der Text "Winkel Y-Achse="
Serial.print(MPU.GetAngY()); // Ausgabe des Messwertes der Y-Achse
Serial.print(" Winkel Z-Achse = "); // Am Seriellen Monitor erscheint der Text "Winkel Z-Achse="
Serial.println(MPU.GetAngZ()); // Ausgabe des Messwertes der Z-Achse
}
Falls du Unterstützung bei der Verwendung des Funduino Cubes benötigen solltest, steht dir unser kompetentes Support Team jederzeit gerne zur Verfügung!
Du erreichst uns am Besten per Mail unter info@funduino.de oder von Montags bis Freitags, zwischen 09:00 und 17:00 Uhr unter der Rufnummer (+49) 5921 9704030.