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 :-)
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.
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 ...
Was für ein MCU nutzt du um ihn auszulesen? Was ist dein bisheriger Code? Entwickelst du in Arduino?
Jip ich entwickle am Arduino. Angehangen sind meine bisherigen Codes: Kalibrierung und Auslesen des MPU-6050.
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
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
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 ...
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?
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 ?
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).
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.