MPU6050は ICである 3軸加速度計と組み合わせた3軸ジャイロセンサ 一つのユニットに。また、複雑なタスクを実行するための温度センサーとDCMも搭載しています。MPU6050は、ドローンや自己バランスロボットなどの他のリモートロボットの構築に一般的に使用されます。このプロジェクトでは、MPU6050とArduinoを使用してデジタル分度器を構築します。ここでは、サーボモーターを使用して分度器の画像に角度を表示します。サーボモーターシャフトには分度器の画像上で回転する針が取り付けられており、16xLCDディスプレイにも表示される角度を示します。詳細に入る前に、ジャイロスコープセンサーについて学びましょう。
加速度計とジャイロスコープセンサーとは何ですか?
加速度計は、加速度を測定するために使用されます。実際には、静的加速度と動的加速度の両方を感知します。たとえば、携帯電話は加速度センサーを使用して、携帯電話が横向きモードまたは縦向きモードにあることを検知します。以前、Arduinoで加速度計を使用して次のような多くのプロジェクトを構築しました。
ジャイロスコープは、地球の重力を使用して移動中のオブジェクトの方向を決定する角速度を測定するために使用されます。角速度は、回転体の角位置の変化率です。
たとえば、今日の携帯電話は、ジャイロスコープセンサーを使用して、携帯電話の向きに応じてモバイルゲームをプレイしています。また、VRヘッドセットはジャイロスコープセンサーを使用して360度のビューを表示します
したがって、加速度計は線形加速度を測定できますが、ジャイロスコープは回転加速度を見つけるのに役立ちます。両方のセンサーを別々のモジュールとして使用すると、方向、位置、速度を見つけるのが難しくなります。しかし、2つのセンサーを組み合わせることにより、慣性測定ユニット(IMU)として機能します。したがって、MPU6050モジュールでは、加速度計とジャイロスコープが単一のPCBに存在し、方向、位置、および速度を検出します。
アプリケーション:
- 方向制御のためにドローンで使用されます
- 自己バランスロボット
- ロボットアーム制御
- 傾斜センサー
- 携帯電話、ビデオゲーム機で使用
- ヒューマノイドロボット
- 航空機、自動車などで使用されます。
MPU6050加速度計とジャイロスコープセンサーモジュール
MPU6050は、内部に3軸加速度計と3軸ジャイロスコープで構成される微小電気機械システム(MEMS)です。温度センサーも付いています。
それは測定することができます:
- 加速度
- 速度
- オリエンテーション
- 変位
- 温度
このモジュールには、複雑な計算を実行するのに十分強力な(DMP)デジタルモーションプロセッサも含まれているため、マイクロコントローラーの作業が解放されます。
このモジュールには、磁力計などの外部IICモジュールとのインターフェースに使用できる2つの補助ピンもあります。モジュールのIICアドレスは構成 可能であるため、AD0ピンを使用して複数の MPU6050センサーをマイクロコントローラーに接続できます。
機能と仕様について:
- 電源:3-5V
- 通信:I2Cプロトコル
- 内蔵の16ビットADCは高精度を提供します
- 内蔵のDMPは高い計算能力を提供します
- 磁力計などの他のIICデバイスとのインターフェースに使用できます
- 構成可能なIICアドレス
- 内蔵温度センサー
MPU6050のピン配置:
ピン番号 | ピン名 | 使用する |
1 | Vcc | モジュールに電力を供給します。+ 3V〜 + 5Vにすることができます。通常、+ 5Vが使用されます |
2 | 接地 | システムのアースに接続 |
3 | シリアルクロック(SCL) | I2C通信にクロックパルスを提供するために使用されます |
4 | シリアルデータ(SDA) | I2C通信を介してデータを転送するために使用されます |
5 | 補助シリアルデータ(XDA) | 他のI2CモジュールをMPU6050とインターフェースするために使用できます。オプションです |
6 | 補助シリアルクロック(XCL) | 他のI2CモジュールをMPU6050とインターフェースするために使用できます。オプションです |
7 | AD0 | 1つのMCUで複数のMPU6050を使用する場合は、このピンを使用してアドレスを変更できます。 |
8 | 割り込み(INT) | データがMCUが読み取ることができることを示す割り込みピン。 |
以前は、ArduinoでMPU6050を使用して、セルフバランシングロボットと傾斜計を構築しました。
必要なコンポーネント
- Arduino UNO
- MPU6050ジャイロスコープモジュール
- 16x2LCDディスプレイ
- ポテンショメータ10k
- SG90-サーボモーター
- 分度器の画像
回路図
このDIYArduino分度器の回路図を以下に示します。
Arduino UNOとMPU6050間の回路接続:
MPU6050 |
Arduino UNO |
VCC |
+ 5V |
GND |
GND |
SCL |
A5 |
SDA |
A4 |
Arduino UNOとサーボモーター間の回路接続:
サーボモーター |
Arduino UNO |
赤(VCC) |
+ 5V |
オレンジ(PWM) |
9 |
ブラウン(GND) |
GND |
ArduinoUNOと16x2LCD間の回路接続:
LCD |
Arduino Nano |
VSS |
GND |
VDD |
+ 5V |
V0 |
ポテンショメータセンターPINへ LCDのコントラストを制御するため |
RS |
2 |
RW |
GND |
E |
3 |
D4 |
4 |
D5 |
5 |
D6 |
6 |
D7 |
7 |
A |
+ 5V |
K |
GND |
プログラミングの説明
いつものように、デモンストレーションビデオを含む完全なプログラムは、このチュートリアルの最後にあります。
ここでサーボモーターはArduinoに接続されており、そのシャフトは傾斜したMPU6050の角度を示す分度器の画像に投影されています。このチュートリアルのプログラミングは簡単です。詳しく見ていきましょう。
まず、必要なすべてのライブラリを含めます。サーボを使用するためのサーボモーターライブラリ、LCDを使用するためのLCDライブラリ、およびI2C通信を使用するためのワイヤライブラリです。
MPU6050はI2C通信を使用するため、ArduinoのI2Cピンにのみ接続する必要があります。そのため、 Wire.h ライブラリを使用してArduinoUNOとMPU6050間の通信を確立します。以前、MPU6050をArduinoとインターフェースし、16x2 LCDにx、y、z座標値を表示しました。
#include
次に、Arduino UNOに接続されているLCDディスプレイピンRS、E、D4、D5、D6、D7を定義します。
LiquidCrystal lcd(2,3,4,5,6,7);
次に、MPU6050のI2Cアドレスが定義されます。
const int MPU_addr = 0x68;
次に、サーボクラスと3つの変数を使用してX、Y、Z軸の値を格納するために myservo オブジェクトを初期化します。
サーボmyservo; int16_t axis_X、axis_Y、axis_Z;
次の最小値と最大値は、0から360までの角度を測定するために265と402に設定されます。
int minVal = 265; int maxVal = 402;
void setup():
では 、ボイドセットアップ 機能最初のI2C通信が開始され、送信が0x68のアドレスでMPU6050で始まりました。
Wire.begin(); Wire.beginTransmission(MPU_addr);
0x6Bを書き込んでMPU6050をスリープモードにし、0を書き込んでMPU6050をスリープ解除します。
Wire.write(0x6B); Wire.write(0);
MPU6050をアクティブにした後、送信を終了します
Wire.endTransmission(true);
ここでは、サーボモーターのPWMピンがArduinoUNOピン9に接続されています。
myservo.attach(9);
回路の電源を入れるとすぐに、LCDにウェルカムメッセージが表示され、3秒後にクリアされます
lcd.begin(16,2); // LCDを16X2モードに設定します lcd.print( "CIRCUIT DIGEST"); delay(1000); lcd.clear(); lcd.setCursor(0,0); lcd.print( "Arduino"); lcd.setCursor(0,1); lcd.print( "MPU6050"); delay(3000); lcd.clear();
void loop():
ここでも、I2C通信はMPU6050で開始されます。
Wire.beginTransmission(MPU_addr);
次に、レジスタ0x3B(ACCEL_XOUT_H)から開始します。
Wire.write(0x3B);
これで、終了送信をfalseに設定することでプロセスが再開されますが、接続はアクティブです。
Wire.endTransmission(false);
その後、14個のレジスタからデータを要求します。
Wire.requestFrom(MPU_addr、14、true);
これで、尊重される軸レジスタ値(x、y、z)が取得され、変数axis_X、axis_Y、axis_Zに格納されます。
axis_X = Wire.read()<< 8-Wire.read(); axis_Y = Wire.read()<< 8-Wire.read(); axis_Z = Wire.read()<< 8-Wire.read();
次に、これらの値を265から402まで-90から90としてマップします。これは、3つの軸すべてに対して実行されます。
int xAng = map(axis_X、minVal、maxVal、-90,90); int yAng = map(axis_Y、minVal、maxVal、-90,90); int zAng = map(axis_Z、minVal、maxVal、-90,90);
x値を度(0〜360)で計算する式を以下に示します。ここでは、サーボモーターの回転はx値の動きに基づいているため、xのみを変換します。
x = RAD_TO_DEG *(atan2(-yAng、-zAng)+ PI);
0〜360度のX角度値は、0〜180に変換されます。
int pos = map(x、0,180,0,180);
次に、角度の値を書き込んで分度器の画像にサーボを回転させ、それらの値を16x2LCDディスプレイに印刷します。
myservo.write(pos); lcd.setCursor(0,0); lcd.print( "Angle"); lcd.setCursor(0,1); lcd.print(x); delay(500); lcd.clear();
これが、Arduinoを搭載したMPU6050を使用して角度を測定する方法です。このプロジェクトの完全なコードとビデオを以下に示します。