Arduinoから MPU6050の値を取得してみる

 MPU6050(6軸センサー)をArduino経由で使ってみました。

 

 MPU6050の使い方を中心に、下の動画に使用したArduino側スケッチ(ソース)説明を備忘録として纏めておきます。

 

▼動作確認▼

 Processingを使用してリアルタイムで描画してます。なるべくシンプルで高速な処理をしたかったのでライブラリは使用しないでソース書いてます。(あまり変わらないかな?i2c通信はwire.hライブラリ仕様してます)今回はちゃんと3軸ベクトル計算したためyaw軸(z軸)回転もきちんと再現できてます。

▼MPU6050セットアップ部のソースです▼

void set_up_MPU6050() {
  Wire.beginTransmission(0x68);
  Wire.write(0x6B);
  Wire.write(0x00);
  Wire.endTransmission();

  //Gyro初期設定
  Wire.beginTransmission(0x68);
  Wire.write(0x1B);
  Wire.write(0x08);
  Wire.endTransmission();

  //加速度センサー初期設定
  Wire.beginTransmission(0x68);
  Wire.write(0x1C);
  Wire.write(0x10);
  Wire.endTransmission();

  //LPF設定
  Wire.beginTransmission(0x68);
  Wire.write(0x1A);
  Wire.write(0x03);
  Wire.endTransmission();
}

 デバイスアドレスは[0x68]です。最初の4行でクロックの設定してます。クロック設定は[0x6B]レジスタの下位3bitで設定。

 

▼データシートより[0x6B]Register▼

 今回は内部クロックを設定してます。

 

 次にジャイロの初期設定。[0x1B]レジスタのbit4、bit3の2bitでジャイロのスケールレンジが設定できます。
▼レジスタ▼

 

▼またレンジによるLSB(スケールファクター)は▼

 角速度へ変換するときに必要な数値です。

 

 今回はレンジ:500deg/s、SF:65.5LSB/(deg/s)で設定してます。

 

 次に加速度センサーの初期設定。[0x1C]レジスタのbit4、bit3の2bitで加速度センサーのスケールレンジが設定できます。
▼レジスタ▼

<スポンサーリンク>

 

▼LSB(スケールファクター)▼

 今回はレンジ:±8G、SF:4096LSB/Gで設定しました。

 

 最後にローパスフィルターの設定です。ローパスフィルターの設定もできるのですね。[0x1A]レジスタの下位3bitで設定できます。

▼レジスタ▼

 フィルター関係は難しくてよく理解できていないんですけどね・・。1次のローパスフィルターは大きくとると波形(値)が鈍って、遅れるという認識です。私の場合はセンサーに乗る高周波ノイズの除去にソフトで実装してたりします。今回は≒43Hzに設定してます。

 

 これで初期設定は完了。続いて値の読み出しです。

 

▼値読み出し部のソース▼

void readMPU6050() {
  Wire.beginTransmission(0x68);
  Wire.write(0x3B);
  Wire.endTransmission();
  Wire.requestFrom(0x68, 14);

  while (Wire.available() < 14);
  axRaw = Wire.read() << 8 | Wire.read();
  ayRaw = Wire.read() << 8 | Wire.read();
  azRaw = Wire.read() << 8 | Wire.read();
  temperatureRaw = Wire.read() << 8 | Wire.read();
  gxRaw = Wire.read() << 8 | Wire.read();
  gyRaw = Wire.read() << 8 | Wire.read();
  gzRaw = Wire.read() << 8 | Wire.read();
}

 加速度センサー(3軸)、デバイス温度、ジャイロ(3軸)の値を取り出します。検出値はそれぞれ16bit(2byte)の長さで、レジスタアドレス[0x3B]から順に14byteで格納されてます。

 

 ですので[0x3B]から14byte分のデータを要求。読みだした値を8bitずつ順に結合していけば生データの読み出し完了です。

 

 生データのままでは32767~-32768(2byte)のデータとなるためそれぞれ加速度、温度、角速度へ変換します。

 

 今回は割愛しますが、取得した値をキャリブレーションして、加速度、角速度へ変換、姿勢角計算して、ドリフト補正して、、、とすると記事冒頭のような3軸の傾きを表現できるようになります。ここら辺は要望があるようなら別途紹介したいと思います。

 

▼ソース全体▼
MPU6050から取得した生値をそのままシリアル出力しているスケッチです。

#include <Wire.h>

int16_t axRaw, ayRaw, azRaw, gxRaw, gyRaw, gzRaw, temperature;

void setup() {
  pinMode(13, OUTPUT);

  Serial.begin(9600);
  Wire.begin();
  TWBR = 12;

  Wire.beginTransmission(0x68);
  Wire.write(0x6B);
  Wire.write(0x00);
  Wire.endTransmission();
  Wire.beginTransmission(0x68);
  Wire.write(0x1C);
  Wire.write(0x10);
  Wire.endTransmission();
  Wire.beginTransmission(0x68);
  Wire.write(0x1B);
  Wire.write(0x08);
  Wire.endTransmission();
  Wire.beginTransmission(0x68);
  Wire.write(0x1A);
  Wire.write(0x05);
  Wire.endTransmission();
}

void loop() {
  Wire.beginTransmission(0x68);
  Wire.write(0x3B);
  Wire.endTransmission();
  Wire.requestFrom(0x68, 14);
  while (Wire.available() < 14);
  axRaw = Wire.read() << 8 | Wire.read();
  ayRaw = Wire.read() << 8 | Wire.read();
  azRaw = Wire.read() << 8 | Wire.read();
  temperature = Wire.read() << 8 | Wire.read();
  gxRaw = Wire.read() << 8 | Wire.read();
  gyRaw = Wire.read() << 8 | Wire.read();
  gzRaw = Wire.read() << 8 | Wire.read();

  Serial.print(axRaw); Serial.print(",");
  Serial.print(ayRaw); Serial.print(",");
  Serial.print(azRaw); Serial.print(",");
  Serial.print(gxRaw); Serial.print(",");
  Serial.print(gyRaw); Serial.print(",");
  Serial.println(gzRaw);
}
<スポンサーリンク>


この投稿へのコメント

  1. 匿名 said on 2017-11-14 at 12:40

    MPU6050の勉強をしています。
    GithubのJeff Rowbergのスケッチはちょっと長すぎるのでこのブログを
    拝見して勉強しているのですが、可能であればスケッチの全文をブログ
    に掲載、もしくはメールで教えて頂けないでしょうか。

    • imo said on 2017-11-15 at 16:14

      匿名さん、こんにちは。コメント有難う御座います。
      記事内容のままですが・・、MPU6050のセンサー値取得部ソースを記事にアップしておきました。
      参考にして下さい。

  2. 匿名 said on 2017-11-18 at 17:18

    ありがとうございます。早速試してみます。

  3. 匿名 said on 2017-11-19 at 01:02

    無事にデータが取り出せました。ありがとうございます。
    「ジャイロ(角速度)から角度の算出方法」も勉強中です。

    > 今回は割愛しますが、取得した値をキャリブレーションして、加速度、角速度へ変換、姿勢角計算して、
    >ドリフト補正して、、、とすると記事冒頭のような3軸の傾きを表現できるようになります。ここら辺は要望>があるようなら別途紹介したいと思います。

    ぜひ教えてください。

    • imo said on 2017-11-19 at 13:36

      無事にデータが取り出せたようですね。センサー値からの角度算出についてはこのサイトでもちらほら触れております。目的や使い方で考え方が様々かと思いますが一例をここである程度纏めてありますので一度ご確認下さい。

コメントを残す

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

この投稿へのトラックバック

トラックバックはありません。

トラックバック URL