MPU-6050 Auslesen Prblem

#5680733
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 :-)
#5680829
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.
#5680956
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 ...
Gast #5680986
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
#5681363
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
Gast #5681448
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).

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren