Arduino筆記(71):MPU-6050 (GY-521) 三軸陀螺儀+三軸加速計感測模組

過去曾使用樹莓派做過相關的實做,透過MPU6050 來讀取加速度跟陀螺儀的值,請參考:筆記(26):MPU-6050 加速度計與陀螺儀感測器。本篇要用Arduino 來讀取 MPU-6050的數值。MPU6050傳感器模塊是集成的6軸運動跟踪設備,它具有3軸陀螺儀,3軸加速度計,數字運動處理器,所有這些都集成在一個IC中。陀螺儀讀數以每秒度數(dps)為單位;加速度計讀數以g為單位。

[MPU6050三軸陀螺儀+三軸加速計感測模組]

MPU-6000為全球首例整合性6軸運動處理組件,相較於多組件方案,免除了組合陀螺儀與加速器時之軸間差的問題,減少了大量的包裝空間。 MPU-6000整合了3軸陀螺儀、3軸加速器,並含可藉由第二個I2C端口連接其他廠牌之加速器、磁力傳感器、或其他傳感器的數位運動處理(DMP: Digital Motion Processor)硬件加速引擎,由主要I2C端口以單一數據流的形式,向應用端輸出完整的9軸融合演算技術 InvenSense的運動處理資料庫,可處理運動感測的複雜數據,降低了運動處理運算對操作系統的負荷,並為應用開發提供架構化的API。

MPU-6000的角速度全格感測範圍為±250、±500、±1000與±2000°/sec (dps),可準確追緃快速與慢速動作。用戶可程式控制的加速器全格感測範圍為±2g、±4g±8g與±16g。產品傳輸可透過最高至400kHz的I2C或最高達20MHz的SPI。其他規格如下:
  • 使用晶片:MPU-6050
  • 供電電源:3~5V(內部低壓差穩壓)
  • 通信方式:標準IIC通信協定
  • 晶片內置16bit AD轉換器 / 16位元資料輸出
  • 陀螺儀範圍:±250 / 500 / 1000 / 2000°/s
  • 加速度範圍:±2 / ±4 / ±8 / ±16g 
  • 引腳間距2.54mm
GY-521的感測器(Sensor),其核心的晶片是MPU-6050,是一個內包含三軸陀螺儀以 及三軸加速計,結合在一起的數位運動處理器(簡稱DMP),以 I²C 輸出6軸的旋轉矩陣的數位資料。若再包含三軸的電子羅盤(BMP180)可以處理複雜的9軸MotionFusion運算。

[安裝MPU6050 Library]

本實作需要安裝以下程式庫:
程式庫(Library)安裝方法請參考另一篇文章:  Arduino筆記:安裝 Arduino IDE 程式庫(Library)

[材料]

  • Arduino Uno x 1
  • MPU6050 (GY-521) x 1
  • 連接線 x 4條

[接線與電路圖]

ArduinoMPU6050
5V (VCC)VCC
GNDGND
A4 (SDA)SDA
A5 (SCL)SCL


[程式]

從MPU6050模組讀取加速度計及陀螺儀參數,並將其顯示在Arduino串行監視器上。程式中用到兩個函數:
  • readRawAccel():此函數取得 X,Y和Z方向上加速度的16位元的十進位值。不是以重力加速度g 的加速度值。 
  • readNormalizeAccel():該功能以重力加速度 g為單位給出X,Y和Z方向上的加速度值,加速度計選擇的範圍設置和相應的靈敏度,可以從 0 到所選範圍變化。
#include <Wire.h>
#include <MPU6050.h>

MPU6050 mpu;

void setup() 
{
  Serial.begin(115200);
  Serial.println("Initialize MPU6050");

  while(!mpu.begin(MPU6050_SCALE_2000DPS, MPU6050_RANGE_2G))
  {
    Serial.println("Could not find a valid MPU6050 sensor, check wiring!");
    delay(500);
  }

  checkSettings();
}

void checkSettings()
{
  // 列出各項設定 
  Serial.println();
  Serial.print(" * Sleep Mode:            ");
  Serial.println(mpu.getSleepEnabled() ? "Enabled" : "Disabled");
  Serial.print(" * Clock Source:          ");
  switch(mpu.getClockSource())
  {
    case MPU6050_CLOCK_KEEP_RESET:     Serial.println("Stops the clock and keeps the timing generator in reset"); break;
    case MPU6050_CLOCK_EXTERNAL_19MHZ: Serial.println("PLL with external 19.2MHz reference"); break;
    case MPU6050_CLOCK_EXTERNAL_32KHZ: Serial.println("PLL with external 32.768kHz reference"); break;
    case MPU6050_CLOCK_PLL_ZGYRO:      Serial.println("PLL with Z axis gyroscope reference"); break;
    case MPU6050_CLOCK_PLL_YGYRO:      Serial.println("PLL with Y axis gyroscope reference"); break;
    case MPU6050_CLOCK_PLL_XGYRO:      Serial.println("PLL with X axis gyroscope reference"); break;
    case MPU6050_CLOCK_INTERNAL_8MHZ:  Serial.println("Internal 8MHz oscillator"); break;
  }
  
  Serial.print(" * Accelerometer:         ");
  switch(mpu.getRange())
  {
    case MPU6050_RANGE_16G:            Serial.println("+/- 16 g"); break;
    case MPU6050_RANGE_8G:             Serial.println("+/- 8 g"); break;
    case MPU6050_RANGE_4G:             Serial.println("+/- 4 g"); break;
    case MPU6050_RANGE_2G:             Serial.println("+/- 2 g"); break;
  }  

  // 加速度偏移量
  Serial.print(" * Accelerometer offsets: ");
  Serial.print(mpu.getAccelOffsetX());
  Serial.print(" / ");
  Serial.print(mpu.getAccelOffsetY());
  Serial.print(" / ");
  Serial.println(mpu.getAccelOffsetZ());
  
  Serial.println();
  Serial.println("       Accelarometer                      Gyrometer           ");
  Serial.println("--------------------------------------------------------------");
  Serial.println(" Xraw      Yraw       Zraw        Xnorm     Ynorm     Znorm   ");
    
}

void loop()
{
  // 讀取加速計跟陀螺儀的值
  Vector rawAccel = mpu.readRawAccel();
  Vector normAccel = mpu.readNormalizeAccel();

  Serial.print(rawAccel.XAxis);
  Serial.print("   ");
  Serial.print(rawAccel.YAxis);
  Serial.print("   ");
  Serial.print(rawAccel.ZAxis);
  Serial.print("     ");

  Serial.print(normAccel.XAxis);
  Serial.print("     ");  
  Serial.print(normAccel.YAxis);
  Serial.print("      ");  
  Serial.println(normAccel.ZAxis);
  
  delay(1000);
}

[實作結果]


[參考資料]

3 留言

  1. 你好請問我有把zip檔案丟到ardiuno裡了 但是卻是黑色的字 可否告訴為什麼

    回覆刪除

張貼留言

較新的 較舊