Posts 9軸センサの値を取得しよう
Post
Cancel

9軸センサの値を取得しよう

ライブラリのインストール


100kinSATには9軸センサが搭載されています。 加速度、ジャイロ、地磁気に関して、それぞれX・Y・Z軸の3方向測定できるので3×3で9軸センサとなっています。

100kinSATのマイコン(ESP32)と9軸センサはI2C(アイスクエアドシー、アイツーシー)という通信規格でデータのやり取りを行います。 I2C通信についてはここでは詳しく説明しません。 9軸センサを簡単に扱えるライブラリがあるため、今回はそちらをインストールして使います。

https://github.com/bolderflight/mpu9250-arduinoのGitHubリポジトリからライブラリをインストールしましょう。 下記画像に示すように「Code」→「Download ZIP」とクリックしてZIPファイルをダウンロードします。

mpu1 ライブラリのダウンロード

そして、Arduino IDEのライブラリにインポートします。 インポートはArduino IDEのメニューから「スケッチ」→「ライブラリをインクルード」→「.ZIP形式のライブラリをインストール」で先ほどダウンロードしたZIPファイルを選択します。 これでライブラリのインストールは完了です。

mpu2 ライブラリのインストール

サンプルプログラムの実行


ライブラリをインストールしたので、サンプルプログラムを実行してみましょう。 サンプルプログラムは、Arduino IDEのメニューから「ファイル」→「スケッチ例」→「Bolder Flight Systems MPU9250」→「Basic_I2C」をクリックして開きます。

mpu3 サンプルプログラムを開く

サンプルプログラムが開けたら、パソコンと100kinSATをケーブルで接続していることを確認して、Arduino IDEのメニューから「ツール」でボードを「ESP32 Dev Module」に設定して、シリアルポートを選択します。 「マイコンボードに書き込む」のボタンを押してサンプルプログラムを100kinSATに書き込みます。 書き込みが成功したら、シリアルモニタを開いて動作を確認しましょう。 画像のように各センサの値が表示されれば成功です。 もし何も表示されなかったり文字化けしていたりする場合は、ボーレートが115200になっているか確認してみてください(画像の赤枠で囲ったところ)。

mpu4 ボーレートの設定

シリアルモニタには9軸センサから取得した値がそれぞれ表示されています。 しかし、これではただ数字が表示されているだけでよくわかりません。 Arduino IDEにはシリアルモニタ以外にシリアルプロッタという機能があります。 シリアルプロッタを使用すると、センサから取得した値をグラフとしてみることができます。

シリアルモニタを閉じてから、Arduino IDEのメニューの「ツール」→「シリアルプロッタ」をクリックしてみてください。 シリアルプロッタが開き、画像のようにセンサの値がグラフとして描画されるはずです。 100kinSATを上下に振ってみたり、左右に揺らしてみたりしてセンサの値が変化することをグラフで確認してみてください。

mpu5 シリアルプロッタを開く mpu6 シリアルプロッタの画面

ソースコードの説明


最初の行でMPU9250のライブラリをincludeして、次の行でインスタンスを初期化しています。 インスタンスの初期化の際、コンストラクタに引数を渡しています。 渡している引数は、第一引数がWireライブラリのインスタンス、第二引数がMPU9250のI2Cアドレスです。

1
2
3
4
#include "mpu9250.h"

/* An Mpu9250 object with the MPU-9250 sensor on I2C bus 0 with address 0x68 */
Mpu9250 imu(&Wire, 0x68);

setup関数では、シリアル通信の初期化と9軸センサとの通信の開始(I2C通信の開始)をしています。

imu.Begin()が9軸センサとの通信の開始です。 Begin()メソッドは9軸センサの初期設定を行い、通信の準備が完了すると返り値としてtrueを返します。 初期設定に失敗するとfalseが返って来ます。 if文による判定で初期設定に失敗したらエラーのメッセージがシリアルモニタに表示されます。 初期設定に成功したらloop関数に遷移します。

1
2
3
4
5
6
7
8
9
10
void setup() {
  /* Serial to display data */
  Serial.begin(115200);
  while(!Serial) {}
  /* Start communication */
  if (!imu.Begin()) {
    Serial.println("IMU initialization unsuccessful");
    while(1) {}
  }
}

loop関数では、9軸センサから値を取得してシリアルモニタに出力する処理を行っています。

imu.Read()でセンサの値を読み取っています。 読み取った値のうち加速度センサのX軸の値はaccel_x_mps2()メソッドで取得できます。 Y軸、Z軸はaccel_y_mps2accel_z_mps2()メソッドで取得できます。 同様に、ジャイロセンサや地磁気センサの各値も取得するメソッドも用意されています。

Serial.print("\t");の「\t」はタブ文字を出力しています。 各センサの値の間にタブを出力することで、シリアルモニタに表示したときに見やすくしています。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
void loop() {
  /* Read the sensor */
  if (imu.Read()) {
    /* Display the data */
    Serial.print(imu.accel_x_mps2(), 6);
    Serial.print("\t");
    Serial.print(imu.accel_y_mps2(), 6);
    Serial.print("\t");
    Serial.print(imu.accel_z_mps2(), 6);
    Serial.print("\t");
    Serial.print(imu.gyro_x_radps(), 6);
    Serial.print("\t");
    Serial.print(imu.gyro_y_radps(), 6);
    Serial.print("\t");
    Serial.print(imu.gyro_z_radps(), 6);
    Serial.print("\t");
    Serial.print(imu.mag_x_ut(), 6);
    Serial.print("\t");
    Serial.print(imu.mag_y_ut(), 6);
    Serial.print("\t");
    Serial.print(imu.mag_z_ut(), 6);
    Serial.print("\t");
    Serial.println(imu.die_temperature_c(), 6);
  }
  delay(100);
}
This post is licensed under CC BY 4.0 by the author.

モータの制御プログラムをライブラリ化しよう

緯度と経度を取得しよう