LoginSignup
4
2

More than 3 years have passed since last update.

Arduinoで読んだセンサー値をシリアルプロッタでプロットしてみる

Last updated at Posted at 2019-02-05

Arduinoを使ってI2C通信〜加速度センサ

前回の記事でI2C通信でセンサにアクセスすることができたので、
今回は必要なセンサ情報にアクセスして、
シリアルプロットを使ってデータの波形を見てみようと思います。

MPU-6050のレジスタアドレス(センサ値が格納されている場所)

MPU-6050の仕様書を確認。
10進数の59〜66(16進数では3B~42)が今回欲しいセンサ値です。
MPU-6050のI2C通信用アドレスは68(16進数)です。
*前回の記事ではなぜか、うまくいきませんでしたが。
この仕様書通りに設定します。

MPU-6050レジスタアドレス.png

センサ値の重複?データの読み方

レジスタアドレス3B,3Cは共にACCEL_XOUT(x軸加速度)のデータが格納されています。何が違うかというと、
3Bの加速度は上8bitのデータ 3Cは下8bitのデータを格納しています。
つまり、3B+3Cの16ビットでx軸加速度の値を表しているのです。

どういうことかというと…
センサ値理論和.png

Arduinoでセンサ値を取得 シリアルプロット

サンプルコードを載せます。

Gyro.ino
// MPU-6050 Accelerometer + Gyro

// I2CにアクセスするためにWireライブラリを使用
#include <Wire.h>

// レジスタアドレス
#define MPU6050_I2C_ADDRESS  0x68
//#define MPU6050_PWR_MGMT_1   0x6B  // R/W
#define MPU6050_GFS_SELL     0x1B   //角速度のフルスケールレンジ指定
#define MPU6050_AFS_SELL     0x1B   //加速度のフルスケールレンジ指定
#define MPU6050_CLK_SELL     0x6B   //内部クロック指定


// デバイス初期化時に実行される
void setup() {
  Wire.begin();


  Serial.begin(115200); // シリアルモニタのレートを115200bpsにセット

  Wire.beginTransmission(MPU6050_I2C_ADDRESS);
  Wire.write(MPU6050_GFS_SELL); //角速度フルスケール設定があるレジスタ
  Wire.write(0b00000000); //4,3bitを00に指定することで+-250degree/secまで測れる
  Wire.endTransmission();

  Wire.beginTransmission(MPU6050_I2C_ADDRESS);
  Wire.write(MPU6050_AFS_SELL); //加速度のフルスケール設定があるレジスタ
  Wire.write(0b0001100); //4,3bitを00に指定することで+-2gまで測れる。gが重力加速度
  Wire.endTransmission();

  Wire.beginTransmission(MPU6050_I2C_ADDRESS);
  Wire.write(MPU6050_CLK_SELL); //クロック設定があるレジスタ
  Wire.write(0b0000000); //2,1,0bitを000に指定することで、20MHz振動に設定
  Wire.endTransmission();
  delay(1000);
}

uint8_t Data[7] = {0};
int16_t RawData[3] = {0};
float AData[3] = {0};

void loop() {
 Wire.beginTransmission(MPU6050_I2C_ADDRESS);
 Wire.write(0x3B); //加速度のフルスケール設定があるレジスタ
 Wire.endTransmission();
 Wire.requestFrom(MPU6050_I2C_ADDRESS, 14);

 uint8_t index = 0;
 while(Wire.available()) {     //データを受信するまで繰り返しするようになっている
  Data[index++] = Wire.read(); //Wire.readから、読み出したデータ(1byte=8bit=1レジスタ分)が戻ってくる
 }

 RawData[0] = (int16_t) (Data[0]<<8 | Data[1]); //X軸 加速度
 RawData[1] = (int16_t) (Data[2]<<8 | Data[3]); //Y軸 加速度
 RawData[2] = (int16_t) (Data[4]<<8 | Data[5]); //Z軸 加速度
 RawData[3] = (int16_t) (Data[6]<<8 | Data[7]); //センサ校正用温度

 AData[0] = ((float)RawData[0]/16384)*9.81;
 AData[1] = ((float)RawData[1]/16384)*9.81;
 AData[2] = ((float)RawData[2]/16384)*9.81;

 Serial.print(AData[0]);    Serial.print(",");
 Serial.print(AData[1]);    Serial.print(",");
 Serial.println(AData[2]);

 delay(10);
}

Arduino シリアルプロット

上記コードを実行、Arduinoに書き込み後、
ツール > シリアルプロッタ を選択。
Arduinoシリアルプロット.png

加速度センサが動いているのがわかります。
Z軸は重力のためベースが高くなっています。なぜが正の値で出ていますが。
シリアルプロット.png

4
2
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
2