Probleme bei Inbetriebnahme des Sainsmart Gyros MPU6050

Hallo,

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.

Vielen Dank schonmal im Vorraus!

Gruß,
Tobi

mpu6050 von sainsmart.jpg

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...?

Gruß und Danke für die Hilfe,
Tobi

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.

hey,
danke für die Rückmeldung.

Ich verstehe nicht was du damit meinst:

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

Noch ein Nachtrag zu der Frage ob in den Librarys irgendwas angepasst werden muss.

In der FreeIMU.h tauchen so Zeilen auf (habs etwas abgekürzt):

#define HAS_ITG3200() ...
#define HAS_ADXL345() ...
#define HAS_BMA180() ...
#define HAS_MPU6050()...

Danach kommt :

#if HAS_ADXL345()
#include <ADXL345.h>
#define FIMU_ACC_ADDR ADXL345_ADDR_ALT_LOW // SDO connected to GND
#elif HAS_BMA180()
#include <bma180.h>
#define FIMU_ACC_ADDR BMA180_ADDRESS_SDO_LOW

Muss ich da vielleicht alles auser if HAS_MPU6050 ausklammern?

Habe wirklich keine Ahnung wie ich das einstellen muss damit mein Sensor endlich funktioniert.

Gruß,
Tobi

Tobias93:
hey,
danke für die Rückmeldung.

Ich verstehe nicht was du damit meinst:

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.

Tobias93:
#define HAS_ITG3200() ...
#define HAS_ADXL345() ...
#define HAS_BMA180() ...
#define HAS_MPU6050()...

An dieser Stelle alles was nicht zutrifft auskommentieren, sonst musst Du nichts machen.
Aber das hilft Dir alles nichts solange der Portscanner nichts findet.

GY-521 (ist ja deiner laut Bild)

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

(ist von der Playgroundseite 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.

hey,

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 :slight_smile:

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

Tobias93:
hey,

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 :slight_smile:

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:

#define HAS_ITG3200() ...
#define HAS_ADXL345() ...
#define HAS_BMA180() ...
#define HAS_MPU6050()...

muss nichts auskommentiert werden. Lass die Libs einfach wie sie sind und probier jetzt mal das yaw_pitch_roll Beispiel aus.

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.

MfG Matze

//#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.

hey,

danke für die Rückmeldungen, werde das jetzt ausprobieren.

Gruß,
Tobi

Mal ne Zwischenfrage.
Ein Gyroskop misst doch nur Beschleunigungen, oder?

Wie willst Du dann einen Winkel messen?
Du kannst höchstens eine Winkelbeschleunigung messen, jedoch keinen Winkel, wenn Du ihn schief hältst.

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.