【Arduino】 6軸モーションセンサ (MPU-6050)

LESSON 032

6軸モーションセンサーで傾きを調べる

 

○ 6軸モーションセンサーは三軸ジャイロセンサー+三軸加速度計で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(三軸)方向に対してコリオリの力(向心力)または、自転する物体に働く慣性力(ジャイロ効果)が回転する力になります。
            
○ 6軸モーションセンサーの原理
 可動電極に加速度方向に変位が生じた場合、可動電極と固定電極との間の距離が変わります。その変化が静電容量の変化になりよって加速度の大きさを検出できます。
  
        • 加速度の変化の仕組みは稼働電極が移動する事により、
             

目 次

    • 構成部品
    • 配線図
    • スケッチ
    • 結果
    • まとめ
       
構成部品

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  
     
  
         
スケッチ《 test027》 

   
#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);
}
   

  

解説
#include <Wire.h>
  I2C/TWI デバイスとの通信を可能にするライブラリです。
  
#define 変数 0x68 
 I2Cを用いる時、接続された機器にSlaveAddress (スレーブアドレス)を指定します。
       
int16_t ax, ay, az, gx, gy, gz, Temp;
 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を参考に作っていますが、私なりに噛み砕いて書いているつもりですが、判らない点がありましたら連絡下さい。
       

目次