MPU-9150 Kompass mit BASCOM auslesen

OP #3726789
Lesenswert?

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
Gast #3726820
Lesenswert?

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?
OP #3726835
Lesenswert?

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 ?
Gast #3726847
Lesenswert?

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
OP #3726859
Lesenswert?

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...
OP #3727955
Lesenswert?

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
Angehängte Dateien:
Gast #3728075
Lesenswert?

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.
Gast #3728081
Lesenswert?

.....
'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
'----------------------------------------------------------------------- 
-------
Gast #3728089
Lesenswert?

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!
OP #3728173
Lesenswert?

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
OP #3730371
Lesenswert?

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

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