LESSON 032
6軸モーションセンサーで傾きを調べる
-
-
-
- 移動方向、向き、回転、温度を検出することができるセンサ
- 名称:MPU-6050モジュール
チップ:MPU-6050
電源:3-5v(内部低ドロップアウト・レギュレータ)
通信:IIC通信プロトコル標準
チップ内部:16ビットのADコンバータ、16ビットのデータ出力
ジャイロ範囲:±250~5001000~2000°/秒
アクセラレーション範囲:±2±4±8±16g
- MEMS(Micro Electro Mechanical System)技術を応用した半導体微細加工技術を用いたセンサです。
- 三軸加速度とはX・Y・Z(三軸)方向に対して移動(傾き)を回転を加速度と言います。
- 三軸ジャイロとはX・Y・Z(三軸)方向に対してコリオリの力(向心力)または、自転する物体に働く慣性力(ジャイロ効果)が回転する力になります。
-
-
-
-
-
-
加速度の変化の仕組みは稼働電極が移動する事により、
-
-
-
-
- 構成部品
- 配線図
- スケッチ
- 結果
- まとめ
Arduino
USBケーブル
ブレッドボード
MPU-6050モジュール
ジャンパー線
SCL ⇒ MPU-6050 ー SCL
SDA ⇒ MPU-6050 ー SDA
5V ⇒ MPU-6050 ー VCC
GND ⇒ MPU-6050 ー GND
※ A4・A5のIPはSDL・SDLとしても使えます。
SCL = A5
SDL = A4
#include <Wire.h>
#define MPU6050_ADDR 0x68
int16_t ax, ay, az, gx, gy, gz, Temp;
float x, y, z, ggx, ggy, ggz, HTemp;
void setup() {
Serial.begin(9600);
Wire.begin();
Wire.beginTransmission(MPU6050_ADDR);
Wire.write(0x6b);
Wire.write(0x00);
Wire.endTransmission();
}
void loop() {
Wire.beginTransmission(MPU6050_ADDR);
Wire.write(0x3B);
Wire.endTransmission(false);
Wire.requestFrom(MPU6050_ADDR, 14, true);
ax = Wire.read() << 8 | Wire.read();
ay = Wire.read() << 8 | Wire.read();
az = Wire.read() << 8 | Wire.read();
Temp = Wire.read() << 8 | Wire.read();
gx = Wire.read() << 8 | Wire.read();
gy = Wire.read() << 8 | Wire.read();
gz = Wire.read() << 8 | Wire.read();
x = ax / 16384.0;
y = ay / 16384.0;
z = az / 16384.0;
ggx = gx / 131.0;
ggy = gy / 131.0;
ggz = gz / 131.0;
HTemp=Temp/340.00+36.53;
Serial.print(x); Serial.print(" g, ");
Serial.print(y); Serial.print(" g, ");
Serial.print(z); Serial.print(" g, ");
Serial.print(ggx); Serial.print(" deg/s, ");
Serial.print(ggy); Serial.print(" deg/s, ");
Serial.print(ggz); Serial.print(" deg/s, ");
Serial.print(HTemp); Serial.println(" ℃ ");
delay(20);
}
I2Cを用いる時、接続された機器にSlaveAddress (スレーブアドレス)を指定します。
16bitの符号付き整数を格納するための宣言です。
- id setup()
Wire.beginTransmission(address);
指定したアドレスのI2Cスレーブに対して送信処理を初め、この関数の実行後、write()でデータをキューへ送り、endTransmission()で送信を実行します。Wire.begin();
Wireライブラリを初期化し、I2Cバスにマスタかスレーブとして接続します。
Wire.beginTransmission(address);
指定したアドレスのI2Cスレーブに対して送信処理を初め、この関数の実行後、write()でデータをキューへ送り、endTransmission()で送信を実行します。Wire.write(address);
スレーブデバイスがマスタからのリクエストに応じてデータを送信するときと、マスタがスレーブに送信するデータをキューに入れるときに使用します。beginTransmission()とendTransmission()の間で実行します。
0x6b 動作状変数を指定
0x00 0x00を指定(ON)
0x3b 取得値の先頭を指定 - void loop()
Wire.requestFrom(address, 14, true);
MPU-6050に対して14byte分データを要求、I2Cバス開放
ax = Wire.read() << 8 | Wire.read(); x軸の加速度の読み取り 16bit
ay = Wire.read() << 8 | Wire.read(); y軸の加速度の読み取り 16bit
az = Wire.read() << 8 | Wire.read(); z軸の加速度の読み取り 16bit
Temp = Wire.read() << 8 | Wire.read(); 温度の読み取り 16bit
gx = Wire.read() << 8 | Wire.read(); x軸の角速度の読み取り 16bit
gy = Wire.read() << 8 | Wire.read(); y軸の角速度の読み取り 16bit
gz = Wire.read() << 8 | Wire.read(); z軸の角速度の読み取り 16bit
シフト演算と論理和で16bitのデータを変数に格納
ax~gzまで、16bit(2byte) × 7 = 14byte
ax/16384.0 x軸の加速度(G)
ay/16384.0 y軸の加速度(G)
az/16384.0 z軸の加速度(G)
gx/131.0 x軸の角速度(deg/s)
gy/131.0 y軸の角速度(deg/s)
gz/131.0 z軸の角速度(deg/s)
温度/340.00+36.53 温度換算
換算 0, ±2g, 16384LSB/g
0, ±250deg/s, 131LSB/deg
結果
○ MPU-6050モジュールは三軸加速度計+三軸ジャイロセンサー+温度を測定出来ます。
○ 今回は換算値で表示しましたが、換算値より生データの方がいいかもしれません。
○ Arduino を 学ぶ上で書籍やWebpageを参考に作っていますが、私なりに噛み砕いて書いているつもりですが、判らない点がありましたら連絡下さい。