Arduinoを使ってI2C通信〜加速度センサ
前回の記事でI2C通信でセンサにアクセスすることができたので、
今回は必要なセンサ情報にアクセスして、
シリアルプロットを使ってデータの波形を見てみようと思います。
MPU-6050のレジスタアドレス(センサ値が格納されている場所)
MPU-6050の仕様書を確認。
10進数の59〜66(16進数では3B~42)が今回欲しいセンサ値です。
MPU-6050のI2C通信用アドレスは68(16進数)です。
*前回の記事ではなぜか、うまくいきませんでしたが。
この仕様書通りに設定します。

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