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

##Arduinoを使ってI2C通信〜加速度センサ
[前回の記事](https://qiita.com/VoyagerC/items/b954f6bd9731333b5f1a)でI2C通信でセンサにアクセスすることができたので、
今回は必要なセンサ情報にアクセスして、
シリアルプロットを使ってデータの波形を見てみようと思います。

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

[MPU-6050の仕様書](https://cdn.sparkfun.com/datasheets/Sensors/Accelerometers/RM-MPU-6000A.pdf)を確認。
10進数の５９〜６６（16進数では3B~42）が今回欲しいセンサ値です。
MPU-6050のI2C通信用アドレスは６８（16進数）です。
*[前回の記事](https://qiita.com/VoyagerC/items/b954f6bd9731333b5f1a)ではなぜか、うまくいきませんでしたが。
この仕様書通りに設定します。

<img width="701" alt="MPU-6050レジスタアドレス.png" src="https://qiita-image-store.s3.amazonaws.com/0/272931/60626651-0a0c-b857-ffb3-ed3ef98b6475.png">

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

どういうことかというと…
![センサ値理論和.png](https://qiita-image-store.s3.amazonaws.com/0/272931/c1dff7db-1a47-2d29-ed5e-69018d742951.png)

##Arduinoでセンサ値を取得　シリアルプロット
サンプルコードを載せます。

```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](https://qiita-image-store.s3.amazonaws.com/0/272931/826fa705-353e-2dfb-e72c-c36175c063c5.png)

加速度センサが動いているのがわかります。
Z軸は重力のためベースが高くなっています。なぜが正の値で出ていますが。
![シリアルプロット.png](https://qiita-image-store.s3.amazonaws.com/0/272931/6bd62985-d529-cee3-e115-0a7fb828f32e.png)