MPU6050 + Arduino Uno 實作


利用MPU6050取得空間姿態的數據(raw data) 

 









GY-521的感測器(Sensor),其核心的晶片是MPU-6050,是一個內包含三軸陀螺儀以 及三軸加速計,結合在一起的數位運動處理器(簡稱DMP),以 I²C 輸出6軸的旋轉矩陣的數位資料。若再包含三軸的電子羅盤(BMP180)可以處理複雜的9軸MotionFusion運算。

GY-521規格:
1.    核心晶片:MPU-6050模塊(三軸陀螺儀 + 三軸加速度)
2.    供電電源:3-5v(內部低壓差穩壓)
3.    通信方式:標準 I²C通信協議
4.    晶片內置16bit AD轉換器,16位數據輸出
5.    陀螺儀範圍:±250 500 1000 2000 °/s
6.    加速度範圍:±2±4±8±16g


I²C函式庫:
     MPU-6050靠 I²C和Arduino溝通,I²C函式庫(library)採用Jeff Rowberg寫的開放原始碼,可以到Github 頁面將原始碼下載下來,將其放到 Arduino 工作目錄中的 libraries 資料夾中。做法如下:

1.    到 I2Cdevlib 找到MPU6050的 library相關資料,點選Source的連結
2.    點選右下角的Download ZIP下載函式庫壓縮檔。










3.    下載後的檔案,解壓縮,找到其中MPU-6050 及 I2Cdev目錄,複製到Arduino的library資料夾中。
4.    重開Arduino IDE,就可以看到Example之下有MPU6050_raw的範例。

5.    如下圖載入 MPU6050_DMP6.ino 範例。

 6.    驗證發生錯誤
        D:\Arduino\libraries\MPU6050\MPU6050.cpp:1997:6: error: prototype for 'bool     MPU6050::getMotionStatus()' does not match any in class 'MPU6050'
 bool MPU6050::getMotionStatus() {
      ^
In file included from D:\Arduino\libraries\MPU6050\MPU6050.cpp:37:0:
D:\Arduino\libraries\MPU6050\MPU6050.h:611:17: error: candidate is: uint8_t MPU6050::getMotionStatus()         uint8_t getMotionStatus();

7.    是因為 MPU6050.cpp的函式 getMotionStatus()
       宣告為 bool MPU6050::getMotionStatus()

        而 MPU6050.h 的函式 getMotionStatus()
        宣告為 uint8_t MPU6050::getMotionStatus()

        兩個宣告不一致,所以造成編譯錯誤。

8.    用文字編輯器(Notepad / Emedit / Ultraedit)打開MPU6050.h。
       搜尋 getMotionStatus(), 更改如下後存檔。
     =============================================================
       uint8_t getMotionStatus(); --->  // uint8_t getMotionStatus();
       在下一行增加  bool getMotionStatus();
     =============================================================

接線
1.    Arduino Uno +5V    ---->GY-521 的 VCC。
2.    Arduino Uno GND  ---->GY-521 的 GND。
3.    Arduino Uno A4      ---->GY-521 的 SDA。
4.    Arduino Uno A5      ---->GY-521 的 SCL。
5.    Arduino Uno D2     ---->GY-521 的 INT。
















程式測試
1.    開範例 MPU6050_raw ,檢查代碼是否如下。
     =============================================================
    // initialize serial communication
    // (38400 chosen because it works as well at 8MHz as it does at 16MHz, but
    // it's really up to you depending on your project)
    Serial.begin(38400);
    =============================================================

2.    把範例上傳,之後就會開始運行了,打開串列埠可看到大量的訊號輸出,鮑率要改為38400。移動翻轉 GY-521 ,串列埠數字會明顯的改變。

MPU Teapot 3D 程式測試
1.    下載 processing IDE
2.    執行processing IDE。
















3.    打開偏好設定,檢查SketchBook 位置,一般是在 C:\Users\xxx\Documents\Processing
4.    下載  “Toxi” 函式庫,解壓縮會得到 toxiclibs-complete-0020 目錄,複製到C:\Users\xxx\Documents\Processing\Libraries,如果沒有Libraries目錄,須自己新建。
5.    複製Arduino IDE 的Libraries下的MPU6050目錄下的MPUTeapot目錄到C:\Users\xxx\Documents\Processing。

Processing
                  +libraries
                  |         +toxiclibs-complete-0020
                  |
                  +MPUTeapot
                            -MPUTeapot.pde

6.    開啟上傳MPUMPU6050_DMP6,修改如下後上傳。     
      ============================================================= 
      #define OUTPUT_READABLE_YAWPITCHROLL --->  //#define          OUTPUT_READABLE_YAWPITCHROLL

    //#define OUTPUT_TEAPOT --->  #define OUTPUT_TEAPOT       ============================================================= 


7.   再用Processing IDE 開啟MPUTeapot.pde,修改如下後執行。
     =============================================================

    String portName = "/dev/ttyUSB1";   ---->  //String portName = "/dev/ttyUSB1";   
    //String portName = "COM4";  ---->   String portName = "COM4";

     =============================================================

8.   圖形約需10秒才會穩定,待穩定後可翻轉GY-521,看3D圖形變化。