Forum: Mikrocontroller und Digitale Elektronik MPU-9150 Kompass mit BASCOM auslesen


von Peter H. (thunderfrog)


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

von Icke (Gast)


Lesenswert?

Du sollst keine Adresse ändern sondern nur von einer andren Adresse 
lesen.

Ich glaube Du stehst mit dem I2c noch etwas auf Kriegsfuß?

von Peter H. (thunderfrog)


Lesenswert?

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 ?

von Icke (Gast)


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?

von Peter H. (thunderfrog)


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 ?

von Icke (Gast)


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

von Peter H. (thunderfrog)


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...

von Icke (Gast)


Lesenswert?

Wie stellst du fest das es nicht funktioniert?

von Icke (Gast)


Lesenswert?

Zeig mal den kompletten Code .

von Peter H. (thunderfrog)


Lesenswert?

Ich bekomme Werte die sich nicht ändern. ... ich melde mich nach der 
Arbeit. Danke vorab.

von Peter H. (thunderfrog)


Angehängte Dateien:

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

von Icke (Gast)


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.

von Icke (Gast)


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
'----------------------------------------------------------------------- 
-------

von Icke (Gast)


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!

von Icke (Gast)


Lesenswert?


von Peter H. (thunderfrog)


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

von Peter H. (thunderfrog)


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

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.