暇つぶしのエントロピー

暇つぶしに何して遊んだか記録していく。少し続いたと思ってたら更新飽きた!最近は工作ブログになりつつある。

9軸センサーモジュール MPU-9250:その2

  • 1月
  • 4

9:45 am MPU9250, Raspberry Pi, コンピュータ

MPU-9250 Register Map and Descriptions』を見ると磁力計へのアクセスの説明だけ章立てが違っている。

アクセスするレジスタ・マップが被っていて前回の温度計同様にアクセスできないことに気づきました。

いろいろ探すと、『MPU-9250 Product Specification』に
——-
4.11 補助 I2C シリアル·インターフェイス

MPU-9250 は、オフチップセンサと通信するための補助的な I2C バスを有しています。このバスは、2 つの動作モードがあります:

  • I2C マスタ·モード:MPU-9250 は補助 I2C バスに接続された外部センサへのマスターとしてふるまいます。
  • パス·スルー·モード:MPU-9250 は、システム·プロセッサが直接外部センサと通信できるように、主及び補助 I2C バスを共に直接接続しています。

補助I2Cバス·モードの操作:

  • I2C マスタ·モード:MPU-9250 は、磁力計のような外部デジタル·センサーのデータ·レジスタに直接アクセスできるようにします。このモードでは、MPU-9250 は、システム·アプリケーション·プロセッサの介入なしに、直接補助センサからのデータを取得します。
    例えば、I2C マスタモードでは、MPU-9250 は、バースト読み取りを実行するよう設定することができ、磁力計から次のようなデータを返します。

    • X磁力データ(2バイト)
    • Y磁力データ(2バイト)
    • Z磁力データ(2バイト)

     I2C マスタは、最大 4 つの補助センサからの 24 バイトを読み出すように構成することができます。第五のセンサは、シングルバイトの読み取り/書き込みモードを動作するように設定することができます。

  • パス·スルー·モード:外部システム·プロセッサがマスタとして機能し、補助I2Cバス端子(AUX_DAとAUX_CL)に接続された外部センサとの直接通信を行うことができます。このモードでは、MPU-9250 の補助 I2C バス制御ロジック(サード·パーティ製のセンサー·インタフェース·ブロック)が無効になり、補助 I2C 端子AUX_DAとAUX_CLは内部でアナログ·スイッチを介してメイン I2C バスに接続されています。

     パス·スルー·モードは、外部センサを構成するために、または外部センサだけが使用されている場合に低電力モードに 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 で遊ぼう。


© 2007 暇つぶしのエントロピー. Blog theme by blogstheme.com, debt consolidation.