Hallo Gemeinde, für ein neues Projekt "Autonomes fahren" (mit einem Modellauto... :O) habe ich mir den MPU-9150 9-Achsen Sensor zugelegt. Alles funktional auf ein Steckbrett und nach diversen Suchen im Internet und Registerstöbern erfolgreich Lage-u. Gyrosensoren mit BASCOM ausgelesen und im Terminal formatiert dargestellt. Soweit so gut. Nun wüde ich gerne den Kompass ansprechen, dieser ist als zusätzliches Modul AK8975 in die MPU integriert. Die Adressen: MPU = 0x68 (Standard) AK8975 = 0x0C Mein Problem ist auf die AK8975 "umzuschalten". Eine Kurzbeschreibung des theoretischen Ablaufs habe ich sogar hier im Forum wiedergefunden: 1. Reset MPU9150: write 0x80 to 0x6B (D107) (PWR_MGMT_1), address 0x68 2. Disable sleep: write 0x01 to 0x6B (PWR_MGMT_1), address 0x68 3. Setup I2C Bypass: write 0x02 to 0x37(D55) (INT_PIN_CFG), address 0x68 4. Set mag to single measurement: write 0x01 to 0x0A (CNTL), address 0x0C 5. Read mag: Read 6 bytes from 0x03 (HXL), address 0x0C Schritt 1-3 geht problemlos, hier wird ja auch noch direkt auf 0x68 zugegriffen, das ist die Adresse meiner MPU. Bei Schritt 4. ist für mich geistig Schluss, hier würde ich mich über Lösungsvorschläge freuen: Wie kann ich die I2C Adresse der MPU in BASCOM von 0x68 auf 0x0C ändern ? Vergleichbar Ansätze im Internet mit Arduino oder C++ haben mir nicht weitergeholfen. Danke Euch im Voraus und einen schönen Abend Peter
Du sollst keine Adresse ändern sondern nur von einer andren Adresse lesen. Ich glaube Du stehst mit dem I2c noch etwas auf Kriegsfuß?
Icke schrieb: > Ich glaube Du stehst mit dem I2c noch etwas auf Kriegsfuß? Und wie Du das richtig erkannt hast :O) Laut der Anleitung muss ich bei Schritt 4. an die Adresse 0x0C eine 0x01 ins register 0x0A schreiben... Erst danach kann ich die Kompassregister auslesen Liege ich falsch ?
Kein Problem, reine Konzentrationssache! Lies dir die Bascom Samples und die Kommentare durch, dann verstehst Du das. Achte auf saubere Busbeschaltung, Pullups etc. Kenne den Unterschied zwischen Hardware TWI und Software TWI( I2C). Das Datenblatt von dem Sensor ist DEIN Freund. P.S. Was kostet son Monster?
Habe 3 x MPU-6050 besetellt (6-Achsen) und 1 x MPU-9150. Waren zusammen um die 14.- Euro als Sammelbestellung aus China. Ich habe sowohl das Datenblatt als auch die Register map vor mir ausgebreitet :O) BASCOM Samples mit der MPU-9150 gibt es keine, die Beispiele für MPU-6050 bringen mich nicht weiter, da es bei der nur 1 Adresse (0x68) gibt. Die kann ich auch alle lesen und auswerten. Mein Problem ist den Zugriff über BASCOM auf die AK8975 (0x0C) zu realisieren. Kannst Du mir hier weiterhelfen ?
Genau, ab Seite 44. Beachte die Fußnoten auf den Seiten, da gibt es Abhängigkeiten! Mit einem Write setzt du die Registeradresse, die folgenden reads lesen dann von dort ab aufwärts. Die Registeradresse wird dabei automatisch incrementiert. Das Schema ist immer gleich. Du musst das Handbuch sorgfältig lesen. Die Arbeit kann ich Dir nicht ersparen. Vielleicht hilft das schon weiter: http://www.i2cdevlib.com/devices/ak8975#source
Sorry, ich glaube ich sitze total auf dem Schlauch :O) Ich denke ich kann I2C lesen und auch schreiben, hier ein Auszug: '3. Setup I2C Bypass: write 0x02 to 0x37(D55) (INT_PIN_CFG), address 0x68 I2cstart I2cwbyte &HD0 I2cwbyte 55 I2cwbyte &B00000010 I2cstop => 3. Das funktioniert: ich habe die Registerwerte zig mal testweise geändert und vorher/nacher ausgeben lassen. '4. Set mag to single measurement: write 0x01 to 0x0A (CNTL), address 0x0C I2cstart I2cwbyte &H0C ' ??? I2cwbyte 10 'DEZ Register CNTL (0x0A) I2cwbyte &B00000001 'BIN => I2cstop => 4. Das funktioniert nicht... und es liegt glaube ich eher an meinen bescheidenen BASCOM Verständniss, als an meinen bescheidenen I2C Verständniss. Danke für Deine Mühe & Geduld...
Ich bekomme Werte die sich nicht ändern. ... ich melde mich nach der Arbeit. Danke vorab.
Hallo nochmals, habe mal 2 Quellcodes angehängt: MPU-9150_ACC_GYRO.txt Hier wird im Terminalfenster ACC und GYRO formatiert angezeigt Funktioniert MPU-9150_KOMP_TEST.txt Da soll der Kompass mal ausgewertet werden und genauso im Terminal erscheinen. Zur besseren Lesbarkeit habe ich meine ganzen "Prints" und unnötigen Kommentare enfernt... Momentan sehe ich 2 Probleme: 1. Ich weiss nach wie vor nicht wie ich auf das AK8975 Modul (0X0C) zugreifen kann 2. Ich bin mir nicht sicher, ob die Lese/Schreibadresse im Sub read_mag() "&HD0/&HD1" auch für den AK8975 gilt, hier nochmal der Bereich: ____________________________________________ Sub Read_mag() I2cstart I2cwbyte ==> &HD0 <== I2cwbyte 3 'HEX Start XL,XH,YL,YH,ZL,ZH I2crepstart I2cwbyte ==> &HD1 <== I2crbyte Tmp_magx(1) , Ack I2crbyte Tmp_magx(2) , Ack I2crbyte Tmp_magy(1) , Ack I2crbyte Tmp_magy(2) , Ack I2crbyte Tmp_magz(1) , Ack I2crbyte Tmp_magz(2) , Nack I2cstop End Sub ____________________________________________ Leider habe ich in der Register map auch keinen Hinweis auf die genannte Lese-u. Schreibadressen für MPU (0x68) "&HD0/&HD1" gefunden. Diese habe ich aus diversen Beispielcodes entnommen. Die entsprechenden Lese-u. Schreibadressen für den AK8975 muss ich noch ausfindig machen, falls es andere sein sollen... Ich hoffe auf Erleuchtung Danke & Grüße Peter
In der Bascom Hilfe findest Du ein paar Zeilen code, welche den kompletten I2C Bereuch abscannt und alle devices findet. Vielleicht lässt Du den mal auf das Ding los. Ich glaube das wird irgendeine fehlende Initialisierung o.ä. sein. Dazu sind die Fußnoten im Datenblatt sicher sehr wichtig.
..... 'I2C Config Sda = Portc.1 Config Scl = Portc.0 Dim Busaddress As Byte Dim Busaddress_read As Byte Dim Chipaddress As Byte ..... '----------------------------------------------------------------------- ------- Scanbus: 'Scan bus for valid I2C addresses on bus ' ( test for ACK to come back from Busaddress ) Print Print "Scan start" For Busaddress = 0 To 254 Step 2 I2cstart I2cwbyte Busaddress If Err = 0 Then 'for all even addresses 'send start 'send Busaddress 'we got an ack Print "Slave at : " ; Busaddress ; "d, = " ; Hex(busaddress) ; "hex" Chipaddress = Busaddress \ 2 Print " with chip address " ; Hex(chipaddress ) ; "h“ Print End If I2cstop 'free bus Next Print "End Scan" Return '----------------------------------------------------------------------- -------
Der Kollege hier schreibt von ähnlichen Problemen und Tagen von Zeitverschwendung. Da stehen aber auch die Tricks beschrieben, wie er den Kompass (mag) ausgelesen hat. Ich glaube das ist die Lösung. Das Ding ist definitiv ein Biest!
Den Blog habe ich auch schon gefunden, trotzdem Danke für Deine Recherchen. :O) Und ja, das Ding ist nicht ohne... Auf einigen youtube Kanälen werden BASCOM Lösungen aufgezeigt, Nachfragen blieben allerdings immer unbeantwortet. Ich bleibe trotzdem drann... den Busscan kann ich ja auch noch mal testen, danke für den Tip. Grüße Peter
Icke schrieb: > Der Kollege hier schreibt von ähnlichen Problemen und Tagen von > Zeitverschwendung. > > Da stehen aber auch die Tricks beschrieben, wie er den Kompass (mag) > ausgelesen hat. > > Ich glaube das ist die Lösung. Muss mal intensiver testen... Der Hinweis eines Kommentators auf der 2. Seite hat nicht zum Erfolg geführt. Er schrieb das das Kompassmodul nach jedem Lesevorgang neu geweckt werden muss, da er in SLEEP switcht. Zitat: "After every read cycle, the mag puts itself back into sleep mode, so you must write this register every time you wish to take a reading." Auch das habe ich versucht, leider ohne Erfolg, meine Werte bleiben unverändert... Fortsetzung folgt
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.