過去曾使用樹莓派做過相關的實做,透過MPU6050 來讀取加速度跟陀螺儀的值,請參考:筆記(26):MPU-6050 加速度計與陀螺儀感測器。本篇要用Arduino 來讀取 MPU-6050的數值。MPU6050傳感器模塊是集成的6軸運動跟踪設備,它具有3軸陀螺儀,3軸加速度計,數字運動處理器,所有這些都集成在一個IC中。陀螺儀讀數以每秒度數(dps)為單位;加速度計讀數以g為單位。
MPU-6000的角速度全格感測範圍為±250、±500、±1000與±2000°/sec (dps),可準確追緃快速與慢速動作。用戶可程式控制的加速器全格感測範圍為±2g、±4g±8g與±16g。產品傳輸可透過最高至400kHz的I2C或最高達20MHz的SPI。其他規格如下:
程式庫(Library)安裝方法請參考另一篇文章: Arduino筆記:安裝 Arduino IDE 程式庫(Library)。
[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
[安裝MPU6050 Library]
本實作需要安裝以下程式庫:程式庫(Library)安裝方法請參考另一篇文章: Arduino筆記:安裝 Arduino IDE 程式庫(Library)。
[材料]
- Arduino Uno x 1
- MPU6050 (GY-521) x 1
- 連接線 x 4條
[接線與電路圖]
Arduino | MPU6050 |
---|---|
5V (VCC) | VCC |
GND | GND |
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); }
[實作結果]
[參考資料]
- Github:jarzebski/Arduino-MPU6050
你好請問我有把zip檔案丟到ardiuno裡了 但是卻是黑色的字 可否告訴為什麼
回覆刪除要解壓縮吧(?)我覺得啦
刪除請問wire.h有可以下載嗎
刪除張貼留言