【9軸センサ】MPU9250の使い方とArduinoプログラム

ドローンを製作する上で,MPU9250という9軸(加速度,ジャイロ,磁気センサ)のセンサをArduinoを使用して使ってみました.(ちなみに温度も取れます)

使い方を理解するためにも,ライブラリを使用しないで動かしてみました.


  • 接続方法

まず,MPU9250はI2CとSPI通信が選択できますが,今回は,I2Cを選択しました.

I2Cは2端子しかないので接続はとても簡単です. SCLとSDL端子をそれぞれのデバイスのSCLとSDLに接続するだけです.

ただし,今回は,使用電圧が違うので途中にI2Cバス用双方向電圧レベル変換モジュール(PCA)を挟まないといけません.(Arduino Mega:5V,MPU9250:2.4 – 3.6V).

これは,信号の電圧を変換してくれるデバイスです.

回路図は以下の通りです. Arduino Megaの20番ピン(SDA)と,21番ピン(SCL)を使用しました.
「<ー」はArduinoのGNDです.
変換モジュールには,5Vと3.3Vの入力端子があり,5V側と3.3V側があるので注意しましょう.MPUの入力はすべて3.3Vです.


  • データの概要

まず,MPU9250の特徴として,加速度&ジャイロセンサと,地磁気センサは違うスレーブアドレスです.

つまり,2つのI2Cデバイスが1つのパッケージに入っているようなものです. よって,データを読み取るためには,データを2回に分けて取得する必要があります.

この2つを分けて説明していきたいと思います.


  • 加速度とジャイロのデータ取得方法

加速度とジャイロのスレーブアドレスは,0x68 です.

まず,最初に使用するレンジを設定します.

取得したデータは,内部レジスタの0x3bから14バイトに渡って,加速度X,Y,Z,ジャイロX,Y,Zの順で並んでいます.これをi2cReadを使用して読み取ります(この関数は,一番下にあります)

それぞれのデータは,16ビットですが,8ビットずつに2つに分かれています.よって,この2つの8ビットを足し合わせないといけません.

そして,単位を変換します.


  • 磁気センサのデータ取得方法

磁気センサのスレーブアドレスは,0x0c です.

磁気センサを使用するためには,まず設定が必要です.

磁気センサは,ST2というレジスタまで読み込まないと次の計測結果が入ってこないようになっています.

そして,データの単位を変更します.


  • 全体のプログラム

全体のプログラムです.無断転載を禁止します.

あとは,各自でジャイロのドリフトを補正したり,クォータニオン(おすすめ)などを使って工夫してみてください. ジャイロと加速度センサのレンジは変更できます.

6件のコメント

  1. こちらのプログラムのコードを使用させてもらえないでしょうか?
    MPU9250の使用のために公開されている各種ライブラリを試したのですが、どうしてもこちらのサイトに掲載されているコードしか動かず、非常に四苦八苦しています。
    今回は商用での利用も考えているため、使用させていただくにあたり何らかの条件がありましたら、
    可能な限りの対応をさせていただきます。
    検討よろしくお願いします。

    1. 具体的にどのような用途でしょうか?
      安全に関わるものへの使用は避けて頂きたいです。

  2. 初めまして
    ドローンを製作している者です.

    magX = mx / 32768.0f * 4800.0f; //[uT]に変換

    の32768.0f * 4800.0f 部分で、32768は16bitの変換についてだと思うのですが、4800の部分はどのようなものでしょうか.AK8963の概要(p.2)に測定レンジ4900μTとあるのですが関係があるのでしょうか.
    回答していただけると嬉しいです.

      1. 回答ありごとうございます。
        そのシートに書いてあったのですね、見落としてました。初歩的なものへの対応ありがとうございます。
        プログラムに詳しく説明が付いていて理解しやすく書かれていてとても読みやすいです。これからも頑張ってください。

返信を残す

メールアドレスが公開されることはありません。