ich versuche bereits seit einiger Zeit den Gyroskopsensor MPU6050 von Sainsmart in Betrieb an einem Arduino UNO zu nehmen (siehe angefügtes Bild). Mein Ziel ist es im Serial Monitor die Position des Sensors angezeigt zu bekommen. Wenn das Board zum Beispiel flach auf dem Tisch liegt soll so etwas in der Art angezeigt werden:
Aktueller Winkel: 0 °
Es soll dauerhaft immer neu der aktuelle Winkelwert angezeigt werden.
Als Library verwende ich die
FreeIMU
Ich habe den Sensor wie folgt angeschlossen:
----- Anschluss - Belegung -----
Sensor Pin "VCC" an Arduino Pin "3,3V"
Sensor Pin "GND" an Arduino Pin "GND"
Sensor Pin "SCL" an Arduino Pin "SCL" (auf der I/O Pin Seite, nicht an AnalogPins)
Sensor Pin "SDA" an Arduino Pin "SDA" (auf der I/O Pin Seite, nicht an AnalogPins)
Sensor Pin "XDA" an Arduino nicht angeschlossen
Sensor Pin "XCL" an Arduino nicht angeschlossen
Sensor Pin "AD0" an Arduino Pin "GND"
Sensor Pin "INT" an Arduino nicht angeschlossen
Nun habe ich das Beispielprogramm "FreeIMU_yaw_pitch_roll" aus der Library eingspielt. Im Serial Monitor bekomme ich nur das hier angezeigt:
Yaw: nan Pitch: nan Roll: nan
Yaw: nan Pitch: nan Roll: nan
Yaw: nan Pitch: nan Roll: nan
Yaw: nan Pitch: nan Roll: nan
Kann mir jemand weiterhelfen das Board zum Laufen zu bekommen? Bzw. hat jemand einen Code der am MPU6050 funktioniert hat, damit ich wenigstens Testen kann ob das Board überhaupt geht.
Hat das Board eigentlich Pegelwandler für den I2C Bus? Wenn ja, sollte auch ein Spannungswandler drauf sein und Du kannst VCC an 5V hängen. Wenn nicht, ist der Bus ev. hinüber. Hast Du das I2C Port-Scanner Script schon mal aufgespielt um zu sehen ob das Board überhaupt gefunden wird?
Hallo,
ich habe ein Board, das dem von dir sehr ähnlich sieht. Die Anschlußbelegung ist bei mir zumindest gleich.
Ich habe AD0 offen gelassen und konnte die FreeIMU ohne Änderung der I2C-Adresse des Chip nutzen.
Gruß
Reinhard
Hey,
Danke für die Rückmeldungen. Ob das Board über einen Pegelwandler verfügt weiß ich ehrlich gesagt nicht. Ich werde das Port Scanner Skript ausprobieren und dann Posten was der SM ausgibt. Ist dieses Skript auch in der FreeIMU zu finden?
Dann noch was anderes. Thema I2C Adresse: Ich habe nirgendwo (bewusst) was als Adresse eingestellt. Muss das gemacht werden? Wenn ja wo und wie? Ich dachte wenn man nur ein Board betreibt bräuchte man das nicht.
Reinhard könntest du mir bitte den Name von deinem Board Posten dann würde ich im Internet mal suchen und vielleicht dieses kaufen, weil mir erstens das technische Verständnis fehlt um bei meinem eine umfangreiche Fehlersuche durchzuführen ( deswegen auch die vielen Fragen von mir hier im Forum) und zweitens läuft mir etwas die Zeit davon weil das ein Ausbildungsprojekt ist. Und dein Board funktioniert auch so wie ich es in dem ersten Post beschrieben habe ... Aktueller Winkel...?
Du könntest auch mal eine andere Library versuchen: i2cdevlib/Arduino/MPU6050 at master · jrowberg/i2cdevlib · GitHub
Eventuell hast du das falsche Board in der FreeSixImu definiert o.ä., kann ja mal passieren. Um das sicher auszuschließen, würde ich mal hierauf zurückgreifen.
Eventuell hast du das falsche Board in der FreeSixImu definiert o.ä., kann ja mal passieren. Um das sicher auszuschließen, würde ich mal hierauf zurückgreifen.
Ich habe nichts (bewusst) definiert. Ich habe die Beispieldatei auf den Arduino gespielt und sonst nichts. Sind Anpassungen in den Librarys nötig? Muss die Ardresse des Sensor Boards irgendwo eingestellt werden?
Das Programm I2C Scanner habe ich getestet. Es wird im SM angezeigt: No I2C Device found. Es scheint also keine Verbindung über I2C zu bestehen.
Eventuell hast du das falsche Board in der FreeSixImu definiert o.ä., kann ja mal passieren. Um das sicher auszuschließen, würde ich mal hierauf zurückgreifen.
Ich habe nichts (bewusst) definiert. Ich habe die Beispieldatei auf den Arduino gespielt und sonst nichts. Sind Anpassungen in den Librarys nötig? Muss die Ardresse des Sensor Boards irgendwo eingestellt werden?
Das Programm I2C Scanner habe ich getestet. Es wird im SM angezeigt: No I2C Device found. Es scheint also keine Verbindung über I2C zu bestehen.
Gruß,
Tobi
Das schaut aber dann nicht gut aus. Solange der Portscanner nichts findet, brauchst Du mit der Lib gar nicht weiterprobieren.
Das Board kann zwei I2C Adressen verwenden, je nachdem ob AD0 an Masse oder Vcc hängt. Häng mal probeweise in beide I2C Leitungen einen Pullup, versuchs mit 4,7k und wenn das nichts bringt mit 2,2k.
Wie hast Du eigentlich das Board mit dem Arduino verbunden? Ev. über ein Breadboard? Der I2C Bus ist da teilweise etwas anspruchsvoll, mit einem Breadboard dazwischen hatte ich auch schon meine Probleme.
An dieser Stelle alles was nicht zutrifft auskommentieren, sonst musst Du nichts machen.
Aber das hilft Dir alles nichts solange der Portscanner nichts findet.
This sensor board has a voltage regulator. So it can be used with 3.3V and with 5V. It has pull-up resistors of 2k2 on the I2C-bus. The value of 2k2 is rather low. If it is combined with other sensor board which have also pull-up resistors, the total pull-up impedance might be too low.
This schematic is hard to find, so here is a copy: Arduino Playground - HomePage
Also wenn ich das Bild richtig verstehe, müsstest du das Sensorboard mit deinem 5V (nicht mit 3,3V) Ausgang (damit der Levelshifter richtig funktioniert) des UNO kombinieren, sowie den AD0 über Widerstand an Masse (vermutlich um nen Kurzschluss zu vermeiden, dürfte aber auch ohne gehen)
Das wäre meine Meinung dazu. Da ich mir nicht 100%ig sicher bin, solltest du noch abwarten, was die anderen dazu meinen.
ich habe das Sensorboard nun etwas umstrukturiert und folgende Änderungen vorgenommen:
VCC -> von 3,3V auf 5V
SDA/SCL -> Pull Up Widerstände auf +5V
Der I2C Scanner zeigt mir nun an das er ein Gerät gefunden hat und gibt mir als Adresse 0x68 (AD0 auf GND) aus.
Jetzt besteht ja zumindest schonmal eine Verbindung zum Sensor
Bezüglich der Librarys, ich habe die FreeIMU und die MPU6050 Library in dem Arduino Ordner. Reicht auch nur die FreeIMU, bzw. wie geh ich jetzt am Besten vor?
ich habe das Sensorboard nun etwas umstrukturiert und folgende Änderungen vorgenommen:
VCC -> von 3,3V auf 5V
SDA/SCL -> Pull Up Widerstände auf +5V
Der I2C Scanner zeigt mir nun an das er ein Gerät gefunden hat und gibt mir als Adresse 0x68 (AD0 auf GND) aus.
Jetzt besteht ja zumindest schonmal eine Verbindung zum Sensor
Bezüglich der Librarys, ich habe die FreeIMU und die MPU6050 Library in dem Arduino Ordner. Reicht auch nur die FreeIMU, bzw. wie geh ich jetzt am Besten vor?
Gruß,
Tobi
Na, das sind doch jetzt schon bessere Voraussetzungen.
Die FreeIMU Lib alleine reicht nicht, Du benötigst alle Libs aus der FreeIMU-20121122_1126.zip.
Und lass die andere MPU6050 Lib erst mal weg, sonst gibts ev. wieder Compilerfehler.
Ich hab übrigens bei mir nochmal nachgesehen. In diesem Abschnitt:
Hallo, wenn ich mich nicht irre, musst du in der FreeIMU die Adresse auf 0x68 ändern, wenn du AD0 auf GND legst.
Lässt du GND <---> AD0 weg, dann hat er die Adresse 0x69 und sollte ohne Änderung funktionieren.
Verbessert mich bitte, wenn ich da falsch liege.
//#define FREEIMU_v01
//#define FREEIMU_v02
//#define FREEIMU_v03
//#define FREEIMU_v035
//#define FREEIMU_v035_MS
//#define FREEIMU_v035_BMP
#define FREEIMU_v04
// 3rd party boards. Please consider donating or buying a FreeIMU board to support this library development.
//#define SEN_10121 //IMU Digital Combo Board - 6 Degrees of Freedom ITG3200/ADXL345 SEN-10121 http://www.sparkfun.com/products/10121
//#define SEN_10736 //9 Degrees of Freedom - Razor IMU SEN-10736 http://www.sparkfun.com/products/10736
//#define SEN_10724 //9 Degrees of Freedom - Sensor Stick SEN-10724 http://www.sparkfun.com/products/10724
//#define SEN_10183 //9 Degrees of Freedom - Sensor Stick SEN-10183 http://www.sparkfun.com/products/10183
//#define ARDUIMU_v3 // DIYDrones ArduIMU+ V3 http://store.diydrones.com/ArduIMU_V3_p/kt-arduimu-30.htm or https://www.sparkfun.com/products/11055
//#define GEN_MPU6050 // Generic MPU6050 breakout board. Compatible with GY-521, SEN-11028 and other MPU6050 wich have the MPU6050 AD0 pin connected to GND.
In der FreeImu.h steht das relativ weit oben, damit konfigurierst du i.A. das System. Da du ein GY521 hast kommentierst du das: #define FREEIMU_v04 und entfernst die Kommentierung von: #define GEN_MPU6050 dann sollte das laufen.
Ansonsten solltest du die Klasse soweit auch komplett übernehmen können.
Ein Gyroskop misst die Winkelgeschwindigkeit. Über Integration kannst du damit einen Winkel relativ zum Startpunkt bestimmen.
Um eine Bezugsgröße zu einem stationären Inertialsystem herzustellen (also z.B. in Referenz zur Richtung der Gewichtskraft), benötigst du für die Drehung um eine der beiden Achsen des Gyroskops in horizontaler Richtung (senkrecht zur Gewichtskraft) einen Beschleunigungssensor.
Um eine Referenz für die Drehung um die Hochachse (ist die Richtung, in die die Gewichtskraft wirkt; bzw. bildlich gesprochen, die Drehung wenn du auf der Erde stehst und dich selbst im Kreis stehst) herzustellen, müsstest du eine Orientierung herstellen, z.B. möglich über einen Kompass (Magnetometer).
Im Grunde kannst du also nur über eine sogenannte Sensorfusion die korrekten Winkel bzw. Ausrichtung bestimmen.
Um die einzelnen Sensoren zu verknüpfen wird in der Regel ein Filter genutzt, z.B. Kalman oder Quadratur.
Der MPU6050 ist ein kombinierte Messeinheit, beinhaltet also Gyroskop und Accelerometer ( Beschleunigungssensor ). Somit kannst du einen referenzierten Wert zur Schwerkraft für alle Winkel angeben, mit Außnahme der besagten Drehung um die Hochachse.