【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というレジスタまで読み込まないと次の計測結果が入ってこないようになっています.

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


  • 全体のプログラム

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

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

14件のコメント

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

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

      1. 返答いただいたのに2週間経過してまして申し訳ありません。

        安全にかかわるようなことではなく、iotの用途で3軸の合成加速度を取得して
        加速度の有無で装置が動作しているかしていないかを取得する用途です。

        例えば、プレス加工機が動いている際に、加速度があると動作しているが、加速度がほとんどないと動作を止めていることを感知するなどです。

        なぜか既存ライブラリだとうまく動かず、ライブラリを用いないakira様のだと動くので、使わせてもらえると幸いです。
        こちらのサイトから引用させてもらったとの趣旨はソースコード上に必ず残すようにしますので、検討いただけると幸いです。
        よろしくお願いします。

        1. 分かりました。
          誤動作を起こす可能性もあるので気をつけてください。

          使って頂いて大丈夫です。

          1. 許可いただきありがとうございます。
            自己責任かつ、転載元をソースに記載したまま使用させてもらいます。
            いいもの作れるように頑張ります。

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

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

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

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

  3. はじめまして
    愛知県の大学生です

    講義でmpu-9250の動作確認をするためにこちらのコードを使わさせていただきたいです。

  4. 趣味で釣りをしております。
    これをボートの方位センサーに使用できますか?
    色々なセンサーを試しているのですが磁方位誤差が数度もあり、また少しのピッチやロールに対しても誤差が大きくなって使い物になりませんでした。
    このMPU9250で方位センサーとして使用できますでしょうか?
    趣旨とかけ離れた質問で申し訳ございません。

    1. 数分間でしたら磁気なしでも誤差なく使えますが、釣りでしたら長時間使うと思うので少しずつ角度がズレてしまいます。なので、磁気センサは必須になります。

      磁気センサと加速度、ジャイロを使うと1番正確な正確な角度はでます。

      1. 早速ご回答頂きましてありがとうございます。
        今まで9軸で色々試しましたが良い結果にならず苦労しています。
        もう少し頑張ってみます。

返信を残す

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