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

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


  • 全体のプログラム

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

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

27件のコメント

  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軸で色々試しましたが良い結果にならず苦労しています。
        もう少し頑張ってみます。

  5. はじめまして。
    現在大学院生で、加速度センサを用いて様々な運動の動きを解析するための
    研究をしております。その研究のために、こちらのコードを使わせていただいてよろしいでしょうか。
    よろしくお願いいたします。

    1. 使っても大丈夫です.
      正確な値が出力されているかは,ご自身でご確認ください.

  6. いつも参考にさせていただいております。(以前、一度問い合わせをさせていただいたことがあります。)
    私もMPU9250を自身のコードで使っていますが、静止体につけたジャイロの値に不定期(数秒に1回)に異常値が
    生じます。正常値は±1.0度/秒以下で推移しますがたまに ±15度/秒となります。
    ちなみに新品でも発生しております。こういった経験はお持ちでしょうか?ちなみにジャイロのフルスケ-ルをけても異常値が吐き出されます。
    よろしくご教示いただきますと幸いです。

    1. 異常値が出たことは今のところないです.
      新品でも出るようならば,プログラムか回路の問題ではないでしょうか.
      他に実行されているプログラムが影響していたりするのかもしれません.

  7. arduino uno r3を用いて、同様のセンサーを用いて加速度の取得を行おうとしています。しかし、付属の説明書や他のウェブサイトを参照しても、接続方法が分からず、動かすことができず、手を焼いております。そこで、お聞きしたいのですが、

    arduino uno r3を使う場合には、 どのように配線すればよいのか、図などを用いてご教示いただけませんでしょうか?

    また、その配線にて動作を確認する際に、本サイトにて公開されているコードを使用させていただけませんでしょうか?

    1. 使用については大丈夫です.
      正確な値が出力されているかは,ご自身でご確認ください.

      「MPU9250 配線」などで検索すれば,たくさん結果が出てくると思うので,そちらを参考にしてみてください.
      基本的には,SPIとI2Cという接続方式が使えます.

  8. こちらの方のプログラムを使用させて貰えないでしょうか?
    研究にて、9軸センサーを使用しており、なかなか苦労していたところこのプログラムを見つけ研究で試してみようと思ったからです。使用許可が降りた際、参考文献としても掲載致しますのでよろしくお願いします。

    1. 使って大丈夫です。
      精度などについては、ご自身で御確認ください。

    2. こんにちは。

      某高専機械科の者です。
      自主実験において、
      サーボモータの制御用に使用したいです。ご承諾お願いします。

  9. 某高専機械科の者です。
    自主実験において、
    サーボモータの制御用に使用したいです。ご承諾いただきたいです。

  10. こちらのプログラムを使用させてもらえないでしょうか?
    高校生なのですが個人研究でMPU9250を使用していまして、既存のArduinoライブラリだと正確に動作しませんでした。ライブラリなしのこのプログラムなら正確に動作するのではないかと思い、一部参考にさせていただきたいです。よろしくお願いします。

Ryota へ返信する コメントをキャンセル

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