MPU 6050 Breakout in Betrieb nehmen

Hallo Leute,

mein Projektpartner und ich bauen als Schulprojekt ein Inverses Pendel. Dafür verwenden wir den Arduino Uno und ein MPU 6050 Breakout (Bild im Anhang). Leider hab ich keinen Schimmer, wie man diesen Sensor mit dem Arduino verwendet und da wir beide noch keinerlei Erfahrung mit Arduinos haben, hoffe ich, dass uns hier jemand helfen kann!
Bis jetzt habe ich die FreeIMU Bibliothek installiert und die Ordner mit MPU60X0 sowie die I2Cdev extra eingefügt. Dann hab ich
VCC auf 5V, GND auf GND :wink: , SCL auf A5, SDA auf A4 gesteckt. Das einzige was ich damit erreicht habe, war eine aus 1en und 0en bestehende Zahl, mit der ich nichts anfangen konnte. Ist der Sensor überhaupt richtig angesteckt? Und was genau ist der "INT" Anschluss?
Auf diversen Internetseiten ist von I2C die Rede mit der die ICs miteinander komunizieren? Wie funktioniert das? Brauche ich das zwingend für mein Projekt?
Bin um jede Hilfe dankbar, da mein Projektpartner und ich, wie gesagt, noch Neulinge auf dem Gebiet sind.

LG und ein frohes neues Jahr
Max

I²C ist eine standardisierte Schnittstelle über die deine MPU6050 (und viele weitere Geräte) miteinander kommunizieren können. Wenn du die MPU 6050 verwenden willst, musst du das zwangsläufig nutzen - aber mit dem Arduino geht das sehr einfach. Der INT pin ist ein Ausgang, der auf dem Controller ein Interrupt auslösen soll wenn die Daten fertig vorbeitet sind, da der Sensor auch gleich viele Messwerte in bestimmten aufzeichnen und auf einmal senden kann (statt jeden Sensor pro Anfrage einmal). Das ist aber für den Anfang nicht so wichtig, es reicht wenn I²C und Spannungsversorgung angeschlossen sind.

Die I2Cdev Bibliothek hat Beispiele mitgeliefert, die die Grundlagen gut erklären. Schau dir am besten mal MPU6050_raw an.

Danke, das hilft schon mal! Wenn ich allerdings versuche, dass programm zu kompilieren gibt er folgende Fehlermeldung aus:

C:\Users\Max\Documents\Arduino\libraries\I2Cdev\I2Cdev.cpp: In static member function 'static int8_t I2Cdev::readBytes(bool, uint8_t, uint8_t, uint8_t, uint8_t*, uint16_t)':
C:\Users\Max\Documents\Arduino\libraries\I2Cdev\I2Cdev.cpp:217: error: 'SPI' was not declared in this scope
C:\Users\Max\Documents\Arduino\libraries\I2Cdev\I2Cdev.cpp: In static member function 'static int8_t I2Cdev::readWords(bool, uint8_t, uint8_t, uint8_t, uint16_t*, uint16_t)':
C:\Users\Max\Documents\Arduino\libraries\I2Cdev\I2Cdev.cpp:299: error: 'SPI' was not declared in this scope
C:\Users\Max\Documents\Arduino\libraries\I2Cdev\I2Cdev.cpp: In static member function 'static bool I2Cdev::writeBytes(bool, uint8_t, uint8_t, uint8_t, uint8_t*)':
C:\Users\Max\Documents\Arduino\libraries\I2Cdev\I2Cdev.cpp:488: error: 'SPI' was not declared in this scope
C:\Users\Max\Documents\Arduino\libraries\I2Cdev\I2Cdev.cpp: In static member function 'static bool I2Cdev::writeWords(bool, uint8_t, uint8_t, uint8_t, uint16_t*)':
C:\Users\Max\Documents\Arduino\libraries\I2Cdev\I2Cdev.cpp:549: error: 'SPI' was not declared in this scope

Schätze, dass das nichts mit mir zu tun hat!? Habe am Programm auch nichts verändert und wollte nur wissen, was der Sensor ausgibt...
Vielen Dank nochmal für die schnelle Antwort :smiley:

LG Max

Windhogai:
Schätze, dass das nichts mit mir zu tun hat!? Habe am Programm auch nichts verändert und wollte nur wissen, was der Sensor ausgibt...

Libraries darfst Du niemals in die Arduino-IDE laden und zu kompilieren versuchen, das ist nicht vorgesehen! In der Arduino-Software werden nur "Sketche" kompiliert.

Die mitgelieferten Libraries sind in den richtigen Verzeichnisssen und werden bei Bedarf automatisch und im Hintergrund neu kompiliert.

Und zusätzliche Libraries kopierst Du bei Bedarf in das dafür vorgesehene Verzeichniss und wenn die Library includiert wird, wird sie ebenfalls automatisch neu kompiliert.

Wenn Du Dir die vom Sensor ausgegebenen Rohdaten ansehen möchtest, verwende den Sketch von dieser Seite:
http://playground.arduino.cc/Main/MPU-6050
Dieser Sketch verwendet nur die mit der Arduino-Software mitgelieferte Wire-Library zur I2C-Kommunikation mit dem Chip und sollte mit vielen handelsüblichen MPU6050 Breakout-Boards direkt funktionieren.

Libraries darfst Du niemals in die Arduino-IDE laden und zu kompilieren versuchen, das ist nicht vorgesehen! In der Arduino-Software werden nur "Sketche" kompiliert.

Einspruch, Euer Ehren! Das ist mindestens missverständlich.
Ein Sketch-Ordner kann neben der .ino Datei gleichen Namens auch andere Dateien, auch mit
mit der Endung .cpp und .h , enthalten. Diese können auch in der IDE in separaten Tabs dargestellt und editiert werden.

Wenn ich beispielsweise im Ordner mySketch die Dateien mySketch.ino, myLib.h, myLib.cpp habe und in mySketch eine Funktion aus myLib aufrufe, sollte ich in mySektch.ino am Anfang

** **#include "myLib.h"** **

stehen haben.

Wenn myLib "fertig" und getestet ist, kann ich sie dann immer noch in einen Ordner libraries/myLib packen und dort auch von anderen "Sketchen" verwenden.
Man kann natürlich sagen, vorher sei es noch gar keine Library, aber das sehe ich anders.
Ob myLib.h / myLib.cpp eine Library ist, eigentlich mal als Library gedacht war,
oder eine werden könnte, ist mir egal...
:wink:

Edit: s. Anhang LibTest.zip, enthält einen Sketch - Ordner -- mit myLib

LibTest.zip (660 Bytes)

Das ist der Unterschied zwischen #include und #include "lib.h"

Mit den Anführungszeichen sucht er im eigenen Ordner und mit den Spitzen Klammern sucht im Standard Lib Ordner

Haha, ok mit den Librarys kenn ich mich langsam aus :smiley:
Das kompilieren des Sketchs hat problemlos funktioniert, endlich habe ich Werte! Mein Projektpartner und ich haben das gleich ausprobiert... Leider kommt es uns vor, dass der Sensor überhaupt nicht auf unsere Bewegungen reagiert?! Nach diversen Tests konnten wir nicht feststellen welche Achse welcher Zahl zugeordnet werden kann. Außerdem ist uns nicht ganz klar, was nun die Gyrowerte und die Beschleunigungswerte aussagen? Ist das nicht dasselbe?
Von der Programmierung her wäre unser plan für den Anfang:
Wenn des Pendel nach vorne kipt soll es nach vorne fahren. Angenommen noch vorne kippen gibt eine positive Zahl aus, dann sollte sich der Aufwand mit einer if-Schleife in Grenzen halten. If value > 0 dann nach vorne, sonst nichts... und umgekehrt dasselbe.
Was sagt ihr dazu?

LG Max

Windhogai:
Tests konnten wir nicht feststellen welche Achse welcher Zahl zugeordnet werden kann. Außerdem ist uns nicht ganz klar, was nun die Gyrowerte und die Beschleunigungswerte aussagen? Ist das nicht dasselbe?

Translation und Rotation.

Die Beschleunigungswerte zeigen die translatorische Beschleunigungswerte in Richtung der x, y, und z-Achse an. Bei einem in Ruhe befindlichen Sensor ist das alleine die Erdbeschleunigung, die angezeigt wird. Der Summenvektor aus x, y, und z ist bei einem Sensor in Ruhe der Schwerkraftvektor. Je nachdem, wie der Sensor gekippt wird, wirkt die Schwerkraft in x-, y- oder z-Achse des Sensors (oder in allen Achsen gleichzeitig mit einem bestimmten Anteil) und das ist in den Rohdaten auch ablesbar.

Und die Gyroskopwerte zeigen die rotatorische Drehbeschleunigung an, also wie stark die Rotationsbeschleunigung bei Drehung um die x-, Drehung um die y- und Drehung um die z-Achse ist. Bei einem in Ruhe befindlichen Sensor ist dieser Wert nahe 0, denn aus der Drehung der Erde, die sich in 24 Stunden einmal um die eigene Achse dreht, ergibt sich kein nennenswerter Messwert für die Rotation.

Wenn des Pendel nach vorne kipt soll es nach vorne fahren. Angenommen noch vorne kippen gibt eine positive Zahl aus, dann sollte sich der Aufwand mit einer if-Schleife in Grenzen halten. If value > 0 dann nach vorne, sonst nichts... und umgekehrt dasselbe.
Was sagt ihr dazu?

PID Regler :wink:

Der Sensor ist die eine Hälfte der Regelung, die andere ist der Motor ( oder woher kommt das "fahren" ?)
Ein "if" im Arduino wird wohl nicht reichen :wink:

Ok, also brauche ich die Gyrodaten, denn mein Pendel dreht sich ja um die Motorachse. Dann ergibt auch die Zahlenkolonne aus dem Sensor wieder halbwegs Sinn :sweat_smile:
Mit PID Regelung kennen wir uns überhaupt nicht aus. Ist das zwingend notwendig? Von der Überlegung mit der If-Schleife, warum wird das nicht ausreichen? Ungenauigkeit? Übersteuerung?
Wie ist das mit den Abweichungen der Gyrodaten über längere Zeit hinweg? Gibt es da nennenswerte Abweichungen??
Vielen Danke für eure Hilfe!

LG Max

mein Pendel dreht sich ja um die Motorachse

Ist also eher ein Stab, den du per Motor so drehen willst, dass er "nach oben" zeigt.
Kommt also nicht so sehr auf die Dreh-Geschwindigkeit an.

Da ist das mit der "Regelung" sicher einfacher als ich befürchtet habe, und 2 if's reichen ;).

Den Sensor einfach so montieren, dass 2 Beschleunigungsrichtungen jeweils 45° geneigt sind.
Wenn beide die gleiche Beschleunigung messen, ist die Wunsch-Richtung erreicht. In diesem Bereich sollte der Sensor auch schön auf kleine Änderungen ansprechen.

Gottseidank keine PID, das würde unser Zeitfenster um ein vielfaches sprengen :slight_smile:
Ja genau, ein stab, der durch den Motor aufrecht bleiben soll, also ein einachsiges inverses Pendel... Hätte ich dazuschreiben sollen!
Warum die 45° Neigung? Ich hab meinen MPU6050 nach oben ausgerichtet, positive Zahl => kipt nach vorne, negative Zahl => kipt nach hinten. Oder nicht?

LG Max

Für PID gibt es eine fertige Lib. Das muss man nicht per Hand programmieren. Aber die Parameter korrekt einzustellen ist auch nicht ganz trivial :slight_smile:

Ok, PID Regelung werden wir uns anschauen, wenn wir noch genug zeit haben und der Rest funktioniert. XD
Bevor ich ein neues Thema aufmache, frage ich gleich hier:
Unserer Motoransteuerung (H-Brücke) funktioniert nur, wenn der logische Input mit 3,3V gespeist wird und der zweite logische Input (entgegengesetzte Drehrichtung) das definierte Potential GND hat. Das haben wir durch ausprobieren herausgefunden...
Meine Frage: Kann ich einen Ausgang des Arduinos auf die 3,3V und einen Ausgang auf GND schalten?

LG Max

jein.
Ein 5V Arduino gibt 5V aus. um auf 3,3V zu kommen ist das einfachste ein Spannungsteiler mit 2 Widerständen ( 1,8 kOhm und 3,3kOhm).
Bei LOW gibt er 0V (GND oder Massepotentiel aus).

Bist Du sicher daß die H-Brücke nicht auch mit 5V angesteuert werden kann?
Grüße Uwe

Wenn ihr hier mal schaut:

Unter Examples gibt es auch einen schönen Kalmanfilter für eure Anwednung mit dem Kalmanfilter bekommt ihr eine Winkelposition eures Sensors. Ihr braucht nur eine Achse(x oder y) also könnt ihr euch den Rest einfach rauslöschen.
Der Sketch ist zurerst mit Serieller ausgabe ihr schaut dann mit dem Seriellen Monitor welchen Wert ihr in der Aufrechten Position habt. Mit dem könnt ihr dann rechnen.
z.B. fährt ihr schnell nach oben bis der Wert 5° abwicht dann müsst ihr langsamer werden.
Ist die Abweichung =0° oder +-1° stoppt ihr den Motor oder Stepper. Da ihr nur mit einer Achse umsetzt braucht ihr keinen PID Rergler.
Würde es jetzt mit 2 Achsen sein also Pendel wird über einen Horizontalen angetriebeb Schlitten Balanciert würde man um einen Regler nicht rumkommen.
Gruß
DerDani

@DerDani
Ok, das klingt echt interessant! Ich werds mir gleich anschauen :smiley:

@Uwe
Wirklich sicher bin ich mir nicht, aber wir haben einfach herumprobiert und bei der folgenden Kombination hat es funktioniert:
Enabele H-Brücke: 5V
Log linkslauf: 3,3V (GND)
Log rechtslauf: GND (3,3V)
Wenn von dieser abweicht (sogar dann wenn man nicht an GND anschließt, sondern ihn in der Luft hängen lässt) kommen mal 3V auf beiden Motorklemmen, an beiden 10V oder es geht nur in eine Drehrichtung...
Da ich die Platine selbst entworfen habe, kann es schon sein, dass ich da was übersehen hab. Im Datenblatt steht allerdings:
Log HIGH: 2 - 7V
Log LOW: -0,3 - 0,8V
Also rein vom Datenblatt her müsste es funktionieren...

LG Max

Jetzt kommt das Beste: Es geht plötzlich auch mit 5V!! :stuck_out_tongue_closed_eyes: An was das liegt kann ich auch nicht sagen, aber das Messgerät zeigt eindeutige 10V an, Juhu! :smiley:
Dann erübrigt sich das mit den 3,3V, trotzdem vielen Dank für die Hilfe!
Next stop: Kalman Filter

LG Max