9:45 am MPU9250, Raspberry Pi, コンピュータ
『MPU-9250 Register Map and Descriptions』を見ると磁力計へのアクセスの説明だけ章立てが違っている。
アクセスするレジスタ・マップが被っていて前回の温度計同様にアクセスできないことに気づきました。
いろいろ探すと、『MPU-9250 Product Specification』に
——-
4.11 補助 I2C シリアル·インターフェイス
MPU-9250 は、オフチップセンサと通信するための補助的な I2C バスを有しています。このバスは、2 つの動作モードがあります:
補助I2Cバス·モードの操作:
I2C マスタは、最大 4 つの補助センサからの 24 バイトを読み出すように構成することができます。第五のセンサは、シングルバイトの読み取り/書き込みモードを動作するように設定することができます。
パス·スルー·モードは、外部センサを構成するために、または外部センサだけが使用されている場合に低電力モードに MPU-9250 を維持するために便利です。このモードでは、システム·プロセッサはI2Cインタフェースを介して MPU-9250 データにアクセスすることができます。
パス·スルー·モードは、ホストから AK8963 磁力計に直接アクセスするために使われます。この構成では AK8963 のためのスレーブ·アドレスは、0x0C です。
——-
なんて記述が英語で。
パス·スルー·モード に AK8963 が名指しで書かれているので磁力計へのアクセスはこれ?
と思ったけど、その先どうすればいいのかわからない。
なので、別のアプローチを模索…
InvenSense のホームページの Support の Developers Corner で Login して、Software Downloads に行くとダウンロードできる Software がいくつかあってその中の「Embedded MotionDriver 6.1」のソースを読んでみた。
あっ、できた!
前処理
[code]
sudo i2cset -y 1 0x68 0x6A 0x00
sudo i2cset -y 1 0x68 0x37 0x82
[/code]
(実際には設定によりどちらもセットする値が変わります。)
アドレス調査
[code]
sudo i2cget -y 1 0x0C 0x00
sudo i2cget -y 1 0x0D 0x00
sudo i2cget -y 1 0x0E 0x00
sudo i2cget -y 1 0x0F 0x00
[/code]
0x48 を返したアドレスが AK8963 のアドレス。
上記「4.11 補助 I2C シリアル·インターフェイス」の「パス・スルー・モード」で 「スレーブ·アドレスは、0x0C です。」と書かれているように 0x0C の値を取得した際に 0x48 が返ってきます。(なんで 0x0c 固定じゃいけないんだろう。)
後処理
[code]
sudo i2cset -y 1 0x68 0x6A 0x20
sudo i2cset -y 1 0x68 0x37 0x80
[/code]
(実際には設定によりどちらもセットする値が変わります。)
(この辺の処理は setup_compass() メソッド内に書かれています。)
実際の磁力計の値の取得は上記前処理の後、0x03~0x08 レジスタを読み出して、後処理をすれば取得できるようです。
測定結果から値に変換する数式が『MPU-9250 Register Map and Descriptions』にちょっと載ってたりするので続きは Python で遊ぼう。