MPU6050というジャイロセンサーをArduino Uno互換ボードで使ってみたので、覚書として残します。
今回は導入です。実用というより、動かし方が全く分からず、一通り動くサンプルをネットで見つけても複雑すぎて中身がよくわからないので、まずは動作する最低限のコードで色々自分で確認したり理解したい人向けの内容です。
①MPU6050の概要
MPU6050は、6軸のジャイロセンサーです。
加速度がx,y,z軸の計3軸、角速度がx,y,zの計3軸で、合わせて6軸です。
②配線とスケッチ
とりあえず、とにかく動かしてデータが出るか見たいという人は、下の配線・スケッチで動かせは動くと思います。
(プロトタイピングボードで見えないですが、マイコンボードはArduino Uno互換です。)

//S0211_SAMPLE01
#include <Wire.h>
volatile uint8_t data[14]; //センサからのデータ格納用配列
volatile int16_t ax = 0; //出力データ(生値)
void setup() {
Serial.begin(9600);//シリアル通信を開始する
Wire.begin();//I2C通信を開始する
Wire.beginTransmission(0x68);//送信処理を開始する(0x68がセンサーのアドレス)
Wire.write(0x6b); //レジスタ「0x6b」(動作状変数)を指定
Wire.write(0x00); //0x00を指定(ON)
Wire.endTransmission(); //送信を終了する
}
void loop() {
MPU_DATAGET();
Serial.print("ax: ");
Serial.println(ax);
delay(100);
}
void MPU_DATAGET() {
Wire.beginTransmission(0x68); //送信処理を開始する
Wire.write(0x3b); //(取得値の先頭を指定)
Wire.endTransmission(); //送信を終了する
Wire.requestFrom(0x68, 14); //データを要求する(0x3bから14バイトが6軸の値)
uint8_t i = 0;
while (Wire.available()) {
data[i++] = Wire.read();//データを読み込む
}
ax = (data[0] << 8) | data[1];//LowとHighを連結して、値を取得する
}
③スケッチの内容説明
Wire.beginTransmission(0x68);//送信処理を開始する(0x68がセンサーのアドレス)
Wire.write(0x6b); //レジスタ「0x6b」(動作状変数)を指定
Wire.write(0x00); //0x00を指定(ON)
Wire.endTransmission(); //送信を終了する
まずこの準備の部分ですが、センサーをONの状態にしています。レジスタ0x6Bは、スリープモードなどをコントロールする変数です。0x6bのレジスタに、0x00の値をセットし、センサーをONの状態にしています。
void loop() {
MPU_DATAGET();
Serial.print("ax: ");
Serial.println(ax);
delay(100);
}
ループ内ではデータを取得し、x軸の加速度の生値のみを出力しています。
void MPU_DATAGET() {
Wire.beginTransmission(0x68); //送信処理を開始する
Wire.write(0x3b); //(取得値の先頭を指定)
Wire.endTransmission(); //送信を終了する
Wire.requestFrom(0x68, 14); //データを要求する(0x3bから14バイトが6軸の値)
uint8_t i = 0;
while (Wire.available()) {
data[i++] = Wire.read();//データを読み込む
}
この部分では、0x3Bから14バイトを受け取り、配列に格納するという処理を実行しています。
ちなみに0x3Bって具体的に何のデータなのかについてですが、データシートによると、加速度のデータは0x3Bから始まる14バイトの領域に格納されています。

(RM-MPU-6000A-00 Revision: 4.2 P7)
ax = (data[0] << 8) | data[1];//LowとHighを連結して、値を取得する
このセンサーの各測定値は2バイトです。一方レジスタ自体は1バイトのサイズのため、各測定値は2分割されてレジスタに格納されています。
つまり測定値を得るためには分割されている値を連結する必要があります。
図で書くと↓こんな感じです

ちなみにセンサの値と実際の重力加速度の対応ですが、符号付2バイト(つまり±32767)に対して±2G~16Gまでを設定可能になっています。初期設定だと±2Gです。
重力加速度は1Gなので初期設定でセンサーを垂直にすると±16380前後になるはずです

④実行してみる
実行して見ると、データを取得できました(画面左右方向がX軸です)。
左右に一杯に傾けた時の値は確かに±16000台になってますね。