Forum: Mikrocontroller und Digitale Elektronik MPU-6050 Auslesen Prblem


von Felix V. (led35)


Lesenswert?

Hallo Progger und Proggerinnen,

ich möchte für meinen Roboter (in einem anderen Thread von mir 
beschrieben) jetzt noch eine Ausweichroutine vor nahenden Hindernissen 
programmieren. Dafür werden jetzt schon sechs Ultraschallsensoren 
ausgelesen, während die BT-Steuerung weiterhin funktionstüchtig bleibt.

Wenn ein solcher Sensor nun ein Hindernis in 50cm Entfernung erkennt, so 
soll "Karuso" ausweichen können. Das Problem ist, dass dieser in 
bestimmten Winkeln ausweichen soll (z.B. 45° und 90°).

Um dies zu realisieren habe ich in einen MPU-6050 investiert. Dieser 
sehr vielversprechende und angepriesene Sensor würde genau meine Wünsche 
erfüllen.

Das Problem:
Ich kann bisher nur den Sensor auslesen wenn dieser den Interrupt-Pin 
auf High setzt (mit Transistorstufe könnte ich den Datentransfer starten 
lassen wann ich will). Aber da dieser Sensor dennoch weiter arbeitet 
möchte ich einen besseren Weg finden um dem Sensor sagen zu können wann 
er die Daten los schicken soll.

Habt ihr eine Idee? Ich benutze die FIFO-Option des Sensors.
Guten Rutsch nochmal nachträglich :-)

von Timmo H. (masterfx)


Lesenswert?

Ich würde den Sensor zyklisch auslesen (z.B. alle 20ms). Die ausgelesene 
Winkelgeschwindigkeit (der Z-Achse) addierst du dann auf, so erhälst du 
deine Ausrichtung. Da der Gyro driftet solltest du als erstes auf jeden 
Fall anfangs den Drift über bestimmen welchen du dann immer gleich von 
Gyro-Wert abziehst.
Wenn du gar nicht deine absolute ausrichtung haben musst, sondern immer 
nur bei einem Hindernis um n° drehen willst, kannst du auch vor der 
Drehung deinen Winkel auf 0 setzen und dann solange g_z aufaddieren bis 
der gewünschte Winkel erreicht ist, dann dürfte der Drift auch keine 
Rolle mehr spielen.

von Felix V. (led35)


Lesenswert?

Genauso hatte ich mir das gedacht. Das mit dem zyklischen Auslesen ist 
ja genau mein Problem, ich weiß nicht wie ich den Sensor dazu anregen 
kann zu messen. Im Moment gibt er mir ja nur die Werte wenn er möchte 
(durch den Interrupt).

Deshalb versuche ich ihn ja gezielt auslesen zu können, wenn ich das 
möchte. Irgendwie krieg ich das nur nicht hin ...

von trampi (Gast)


Lesenswert?

Was für ein MCU nutzt du um ihn auszulesen? Was ist dein bisheriger 
Code? Entwickelst du in Arduino?

von Felix V. (led35)


Angehängte Dateien:

Lesenswert?

Jip ich entwickle am Arduino.

Angehangen sind meine bisherigen Codes:
Kalibrierung und Auslesen des MPU-6050.

von trampi (Gast)


Lesenswert?

Schau dir zum Beispiel in dieser (Arduino) Library an, welche Register 
du wann setzen/auslesen musst.
https://github.com/jarzebski/Arduino-MPU6050/blob/master/MPU6050.cpp

Der Ablauf ist beim Implementieren immer derselbe: Zuerst die Verbindung 
über I2C initialisieren (begin() methode), dann wird z.B. zum auslesen 
der Acceleration Data die readRawAccel() methode ausgeführt. Diese 
beginnt zuerst die I2C übertragung, und sendet dann das Bit 
"MPU6050_REG_ACCEL_XOUT_H" (definiert in MPU6050.h als 0x3B). Dann 
sendet der MPU6050 die entsprechenden Daten zurück. Für weitere Infos 
solltest du dir neben dem Datasheet auch die Registermap zur Seite 
nehmen:
https://www.invensense.com/wp-content/uploads/2015/02/MPU-6000-Register-Map1.pdf

von trampi (Gast)


Lesenswert?

Was für eine Lib nutzt du?

von trampi (Gast)


Lesenswert?

Mit der von mir geposteten Lib (kenn ich selber aber nicht), sieht das 
minimal Example ziemlich straightforward aus. Nach dem 
Kalibrieren/Initialisieren kann kanz einfach mit mpu.readRawGyro() die 
Daten ausgelesen werden.

https://github.com/jarzebski/Arduino-MPU6050/blob/master/MPU6050_gyro_simple/MPU6050_gyro_simple.ino

von Felix V. (led35)


Lesenswert?

Erst einmal danke für die Lib-Empfehlung, ich möchte jedoch den DMP 
aufgrund der Genauigkeit verwenden.

Und da weiß ich halt nicht wie ich den ausgelesen bekomme ...

von trampi (Gast)


Lesenswert?

Was ist denn jetzt genau dein Ziel? Den FIFO zyklisch auzulesen, oder 
dass der DMP Interrupts verursacht, bei welchem dann Daten empfangen 
werden können?

von Felix V. (led35)


Lesenswert?

Ich möchte nicht auf die DMP Interrupts angewiesen sein. Ich möchte die 
Daten auslesen wann ich möchte (sonst hab ich immer bei der ersten 
Messung einen FIFO-Fehler).

Geht das überhaupt ?

von Bernadette (Gast)


Lesenswert?

Timmo H. schrieb:
> Da der Gyro driftet solltest du als erstes auf jeden
> Fall anfangs den Drift über bestimmen welchen du dann immer gleich von
> Gyro-Wert abziehst.

Dafür benutzt man einen Komplementär-Filter (oder Kalman).

von Timmo H. (masterfx)


Lesenswert?

Bernadette schrieb:
> Timmo H. schrieb:
>> Da der Gyro driftet solltest du als erstes auf jeden
>> Fall anfangs den Drift über bestimmen welchen du dann immer gleich von
>> Gyro-Wert abziehst.
>
> Dafür benutzt man einen Komplementär-Filter (oder Kalman).
Man tut immer gut daran den Grunddrift des Gyros vor der Übergabe an den 
Kalman- oder Komplementärfilter rauszurechnen

: Bearbeitet durch User
von trampi (Gast)


Lesenswert?

Felix V. schrieb:
> Ich möchte nicht auf die DMP Interrupts angewiesen sein. Ich möchte die
> Daten auslesen wann ich möchte (sonst hab ich immer bei der ersten
> Messung einen FIFO-Fehler).
>
> Geht das überhaupt ?

Für was brauchst du dann noch den DMP? Oder willst du den DMP neu 
programmieren und darauf Berechnungen ausführen?
Ich sehe da zwei Möglichkeiten:
1. Du rechnest die Werte im DMP, welcher sie danach auf den FIFO ablegt. 
Dann kann der Arduino wann er will die Daten "abholen".
2. Du rechnest die Werte auf dem Arduino aus, d.h. du beziehst vum MPU 
die raw Values.
Das zweite Verfahren ist deutlich einfacher und schneller zu 
implementieren, frisst dir dafür ein wenig Rechenleistung (ist aber bei 
solch einer einfachen Berechnung inkl. Filterung mit Kalman nicht 
sonderlich viel). Die erste Variante wird insofern schwierig, weill 
InvenSense nicht genügend Informationen zur Verfügung stellt, um den DMP 
zu programmieren. Da wäre es wahrscheinlich fast einfacher, einen 
kleinen CO-Prozessor, z.B. einen Attiny, welcher über I2C die Daten vom 
MPU holt, verarbeitet und dann über einen eigenen "Stack" dem Arduino 
zur Verfügung stellt (RAM sollte kein Problem sein, du musst ja immer 
nur den aktuellen Winkel an den Arduino weitergeben, alle anderen Daten 
müssen nicht gespeichert werden).

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.