IoT何をいまさら(44) MPU9250、9軸センサモジュール

JosephHalfmoon
JosephHalfmoon

前々回のプログラムで、モーションセンサ・モジュールMPU9250の加速度センサ部分からデータを読みだして、マイクロSDに書き込みました。遅延関数で10ms待って測定していたので「だいたい100Hz」くらいのレートです。もっと正確なインターバルで測定しようと思ったのですが、その前に、このセンサって最短どのくらいの周期で読み取れるものなの?実用的にはどのくらいのレートにするのが適正?だいたいフルスケールはどのくらい?精度は?いろいろ疑問が浮かびます。やはり、一度データシートを読んでおくというものでしょう。早速、InvenSense MPU-9250 Product Specification Revision 1.1をダウンロードさせてもらいました。

まずは、このセンサーモジュールの製造元であるInvenSense社へのURLを貼り付けておきます。

https://www.invensense.com/

元々InvenSense社は、米シリコンバレー本拠のMEMSセンサメーカであったわけですが、2017年5月に日本のTDKが買収して100%子会社になっています。そのときのTDKのプレスリリースはこちら

M5Stackに使用されているMPU-9250 モーション・センサ・モジュールですが、2019年12月現在のInvenSense社のホームページでは、

Not Recommended for New Designs

という扱いのようです。製造は継続しているけれども、新規設計には使わないでね状態。この会社のモーションセンサ製品、型番を観察するとかっては

MPUxxxx

という型番がつけられており、そのxxxxの4桁の数字の最上位に軸の数がくるという分かり易い命名体系だったようです。つまり、今見ているMPU-9250は9軸の製品となります。なお、最近「推し」のモーションセンサの新製品は、MPUxxxxという型番が付いておらず

ICM-yyYyy

とICMで始まり5桁の数字が続く型番の体系に改まっているようです。その際、軸の数は百の位の3桁目、上の表記のYの桁に書かれているようです。モーションセンサ以外のセンサも含めると軸の数としては2軸くらいの製品からあるのですが、モーションセンサとしては以下のように6軸、7軸、9軸の製品がみつかります。

  • 6軸:3軸のジャイロセンサ+3軸の加速度センサ
  • 7軸:3軸のジャイロセンサ+3軸の加速度センサ+圧力センサ(スカラー量)
  • 9軸:3軸のジャイロセンサ+3軸の加速度センサ+3軸の地磁気コンパス

MPU-9250自体は、型番から分かるとおり、9軸で3種のセンサがワンパッケージになっていますが、パッケージ内部に2個チップを含む「モジュール」製品です。

  • InvenSenseの3軸のジャイロセンサ+3軸の加速度センサ
  • AK8963 3軸地磁気センサ

AK8963は、AKMと略記されることの多い旭化成エレクトロニクス(英文名称はAsahi Kasei Microdevices)社の磁気センサです。MPU-9250自体は、

たった3㎜角のQFPパッケージ

なのですが、この小さな中に出所の異なる2つのセンサが存在していることになります。このため、6軸のInvenSenseのセンサ部分と、3軸のAKMのセンサ部分は、I2Cバスに接続した場合、異なるI2Cアドレスに存在するように見えます。M5StackのMU9250.hヘッダファイル内では、

  • MPU9250_ADDRESSという定数でアクセスできる方がInvenSenseの6軸
  • AK8963_ADDRESSという定数でアクセスできる方がAKMの3軸

です。

今回は、まず加速度センサにフォーカスしているので、加速度センサの定義を見てきます。データシートを読むとフルスケールは、±2G、±4G、±8G、±16Gの4通りから選択できるようになっています。これに対して内部のADCは2の補数型式の16ビット数を常に返し、±2G設定であれば、1Gを16384目盛りで読めるけれど、±16G設定であれば、1Gが2048目盛りになる、ということが分かります。

 MPU9250クラスの内部では、Ascaleという変数でこのフルスケールを管理していますが、初期値としてヘッダファイルのクラス定義で代入されているのは、2Gの値でした。前々回のように初期化関数 initMPU9250() を呼んだだけで、何も設定しないのであれば、フルスケール2Gのままの筈。目盛り上は16384分の1G単位でセンサは数値を返していることになります(実際には雑音があるのでその処理が必要ですが。)なお、センサが返してくる符号付きの16ビット整数を浮動小数点数に変換するために呼んでいるgetAres()関数は、この「目盛り」に対応する浮動小数点値を計算するだけの関数でした。前々回のコードでは測定の度に呼び出すようなコードにしてしまったのですが、Ascaleを頻繁に変更するようなことは無い場合、これは無駄です。Ascaleを変更するような事態になったら、変更後1度だけ呼び出せば良い筈。

加速度センサの精度設定のところを書いていただけで今回は予定数終了。測定のタイミングはまた今度ですかね。

データシート読んでいて1点、ちょっとびっくりした点だけ書いておきます。InvenSenseの6軸部分は、純粋なセンサだけでなく、

Digital Motion Processor(DMP)

とよぶ回路も積んでいて、これで身体の動き(ジェスチャー)などをとらえて割り込み発生できるようなのですが、これを使うとホストCPUが寝ている間も測定可能な歩数計(Pedometer)を実現できるようです。歩数計アルゴリズムを内蔵しているということでしょう。これはこれで面白いので、M5Stack上でも利用できそうであったらやってみることにしてみたいと思います。(歩数計をちょっと比較してみた回はこちら

IoT何をいまさら(43) M5Stack.hの中身を確認しとこう。へ戻る

IoT何をいまさら(45) MPU9250、ノイズとLPF へ進む