電子工作 その17(6軸ジャイロセンサー:MPU-6050の使い方)
こんにちは、Ideagearの鈴木陽介です。
今回は、Arduino Unoを用いた6軸ジャイロセンサー(MPU-6050)の使い方についてご説明します。
このセンサーはI2C接続が可能なため、配線は4本だけ。しかもライブラリー無しでも動くため非常に扱いやすく、一方で、移動させたり、傾けたりするだけで値がリアルタイムでダイナミックに変化するため、初心者に大人気なセンサーの一つです。
はじめに
MPU-6050は、その昔、私がコロナ前に手掛けたIoTダンベル/バーベルのプロトタイプで活躍してもらいました。そういう意味では、一時期かなりお世話になったセンサーですが、最近までその存在をすっかり忘れていましたw
撮影日:2019年4月30日
こちらはMPU-6050を使う前に試したLSM6DS3という別のジャイロセンサーです。ただ、この時はSPI接続で試したため、今回のI2C接続よりやや面倒で苦戦しました。
撮影日:2019年5月2日
こちらはMPU-6050を使っていますが、センサーとマイコンを一緒にIoTバーベルに組み込んで、なおかつラズパイにデータを送りたかったため、Arduino UnoではなくESP32を採用しました。
こちらはセンサーの表面です。ITG/MPU6050というセンサー名やピン配置等が刻印されています。なお、使用するのは右4つのVCC、GND、SCL、SDAの4ピンだけで、一般的には、左4つのXDA、XCL、AD0、INTは使いませんので、今回は説明を割愛させていただきます。
こちらは裏面です。GY-521というシルク文字が見て取れます。
ちなみに、MPU-6050とGY-521という2つの型番があってややこしいですが、前者がセンサーで、後者がそれを使ったモジュールの型番です。
参考記事
ArduinoでGY-521(3軸 加速度・角速度センサ)から加速度と角速度を読み出す仕様を調べました
Arduino 入門 Lesson 31 【6軸モーションセンサ編 その1】
MPU6050をArduinoで使う②6軸分のデータを取得する
ピン配置
Arduino Unoには、デフォルトでSDAとSCLのピンがあるため、今回はそこをそのまま使用します。
Arduino Uno | MPU-6050 |
---|---|
5V | VCC |
GND | GND |
SDA | SDA |
SCL | SCL |
ブレッドボード図
下記は、実際にArduino Unoと配線した時の様子です。
ライブラリー
ライブラリーは不要。
というより、I2C接続に必要な<Wire.h>という下記ライブラリーが最初からインクルード済みです。
ソースコード
Arduino公式のソースコードをそのまま拝借。詳細は下記:
// MPU-6050 Short Example Sketch
// By Arduino User JohnChi
// August 17, 2014
// Public Domain
#include<Wire.h>
const int MPU_addr=0x68; // I2C address of the MPU-6050
int16_t AcX,AcY,AcZ,Tmp,GyX,GyY,GyZ;
void setup(){
Wire.begin();
Wire.beginTransmission(MPU_addr);
Wire.write(0x6B); // PWR_MGMT_1 register
Wire.write(0); // set to zero (wakes up the MPU-6050)
Wire.endTransmission(true);
Serial.begin(9600);
}
void loop(){
Wire.beginTransmission(MPU_addr);
Wire.write(0x3B); // starting with register 0x3B (ACCEL_XOUT_H)
Wire.endTransmission(false);
Wire.requestFrom(MPU_addr,14,true); // request a total of 14 registers
AcX=Wire.read()<<8|Wire.read(); // 0x3B (ACCEL_XOUT_H) & 0x3C (ACCEL_XOUT_L)
AcY=Wire.read()<<8|Wire.read(); // 0x3D (ACCEL_YOUT_H) & 0x3E (ACCEL_YOUT_L)
AcZ=Wire.read()<<8|Wire.read(); // 0x3F (ACCEL_ZOUT_H) & 0x40 (ACCEL_ZOUT_L)
Tmp=Wire.read()<<8|Wire.read(); // 0x41 (TEMP_OUT_H) & 0x42 (TEMP_OUT_L)
GyX=Wire.read()<<8|Wire.read(); // 0x43 (GYRO_XOUT_H) & 0x44 (GYRO_XOUT_L)
GyY=Wire.read()<<8|Wire.read(); // 0x45 (GYRO_YOUT_H) & 0x46 (GYRO_YOUT_L)
GyZ=Wire.read()<<8|Wire.read(); // 0x47 (GYRO_ZOUT_H) & 0x48 (GYRO_ZOUT_L)
Serial.print("AcX = "); Serial.print(AcX);
Serial.print(" | AcY = "); Serial.print(AcY);
Serial.print(" | AcZ = "); Serial.print(AcZ);
Serial.print(" | Tmp = "); Serial.print(Tmp/340.00+36.53); //equation for temperature in degrees C from datasheet
Serial.print(" | GyX = "); Serial.print(GyX);
Serial.print(" | GyY = "); Serial.print(GyY);
Serial.print(" | GyZ = "); Serial.println(GyZ);
delay(333);
}
テスト
Arduino IDEのシリアルモニタを開いて値の変化を確認します。
おまけ
過去の実績動画も併せて共有します。
MPU-6050は加速度や角速度も測れますが、この時はESP32を使ってとりあえず3軸のAngle、つまり、XYZの角度のみ測定して動作確認しました。(撮影日:2019年5月2日)
まとめ
いかがでしたでしょうか?
MPU-6050は、角度、加速度、角速度を測定できるセンサーとして非常に便利で安価です。単価でわずか数百円ということもあり、micro:bitにはデフォルトで埋め込まれています。
あとは、検出した角度や傾きを使って何をするかですね。
ただ単に、移動したとか、倒れたとかがわかれば十分であれば、それらのデータを用いて制御するのは簡単ですが、さらに高度な制御をしようとする場合は、プログラミングの技術や別のセンサーとの併用が必票になってくるでしょう。
ジャイロセンサーは、かつて私が電子工作を始めた頃に、Arduino、ESP32、micro:bit(内臓のものを使用)というメジャーな3つのマイコンで使い、かつ取得したデータをESP32からRaspberry Piへ送るという荒技(当時の私からすればw)もしていたため、当時はセンサーといえばジャイロセンサーというほどよく使っていました。
ですので、また機会があれば使っていきたいと思います。
それではまた!
Discussion