2014年5月11日 星期日

Arduino範例21:利用MPU6050取得空間姿態的row data


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

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


2、I²C函式庫
而MPU-6050的因為是靠 I²C溝通的,所以需要到I2Cdevlib去找相關的函式庫 library.

I2Cdevlib 是一個開放原始碼的專案,裡頭提供許多微處理裝置的函式庫供使用。要安裝該函式庫只需要到其 Github 頁面將原始碼下載下來,並將其中Arduino 資料夾內的內容通通放到 Arduino 工作目錄中的 libraries 資料夾中。做法如下:

    1. 到 I2Cdevlib 找到MPU6050的 library相關資料,點選Source的連結
    2. 連結到GitHub,點選右上角的Code的小方塊


   3. 進到下一個頁面之後,右下角有一個Download ZIP,就按下下載。
   4. 下載後的檔案,解壓縮,找到其中MPU-6050,丟到Arduino的library資料夾中。


 5. 此時重開Arduino IDE,就可以看到Example之下有MPU6050_raw的範例

3、接線
接線的部分一樣就是把SCL與SDA接起來,如此便可以了。
若有要使用MPU-6050 DMP6的範例程式,需另外再接ADO到3.3V去。
(參考 http://blog.kuoe0.tw/posts/2013/12/29/arduino-with-gy-521-mpu6505-imu-sensor)

4、Code
接下來可以在 libraries/MPU6050/Examples/MPU6050_raw 中找到範例程式。裡頭有兩個範例,先用 MPU6050_raw 跑一次看看以取得原始資料。選好硬體規格與串列埠,把範例upload之後就會開始運行了,只要打開串列埠即可看到大量的訊號輸出,記得這種鮑率要改為38400。這時只要隨意地揮動 GY-521 這塊板子,就能發現輸出的訊號會有較明顯的改變。

其中數據顯示的對應關係取決於所選擇的靈敏度,在I2Cdevlib的函式庫裡,加速度靈敏度預設值為+/- 2G,角速度靈敏度預設值為+/- 250 °/s,如果該設備是完全水平和不動的,那麼:

(1) X軸與Y軸量測到的加速度應該為 0
(2) Z軸量測到的加速度應為1G,也就是16384 (在2G的靈敏度的時候)
(3) X / Y / Z軸角速度的陀螺儀應該為 0 (最大到




但在現實中,加速軸將不完全為 0,因為它是很難做到完全水平,並有一定的雜訊與誤差,而陀螺儀也同樣不會準確地讀出0值 。

接下來我們就可以用這個加速規量測空間用的物體勢態,與加速度、角速度了。


---------------------------------------------------------
參考資料:
i2c函式庫網站:http://www.i2cdevlib.com/devices/mpu6050#source
datasheet:http://www.invensense.com/mems/gyro/documents/PS-MPU-6000A.pdf
Bear 實驗室:http://www.takobear.tw/12/post/2014/01/bear-arduinompu6050servo.html

74 則留言:

  1. 請問如何消除雜訊合誤差?...THX

    路人甲

    luck_1682000@pchome.com.tw

    回覆刪除
    回覆
    1. 以現在這塊晶片來說,我們已經不可能去改電路了,
      你能做的就只有在程式端數值上做調整。
      看要犧牲即時性,做過去時間的平均
      還是犧牲精度,取高斯

      刪除
  2. 感謝您詳細的介紹
    常常因為國外的網路空間人生地不熟
    甚麼都看不懂

    回覆刪除
    回覆
    1. 別這麼說,資料也都是大家都互相分享學習

      刪除
    2. 真的感謝...以前沒有注意到
      要使用MPU-6050 DMP6的範例程式
      需另外再接其他腳位
      想說怎麼都不會動

      刪除
  3. 補充一下,『MPU6050』『I2Cdev』一定要放在Arduino\libraries的目錄下,否則會出現compile錯誤。

    我的情況是將『MPU6050』放在Arduino\libraries\MEMS下而出現錯誤訊息。

    回覆刪除
    回覆
    1. 請問我已經將『MPU6050』『I2Cdev』都放在Arduino\libraries下
      可是執行時依然會跑出
      Arduino:1.6.5 (Mac OS X), 板子:"Arduino Uno"

      In file included from /Users/apple/Documents/Arduino/libraries/I2Cdev/I2Cdev.h:37:0,
      from MPU6050_DMP6.ino:46:
      /Users/apple/Documents/Arduino/libraries/MPU6050/em_cmu.h:37:23: fatal error: em_device.h: No such file or directory
      #include "em_device.h"
      ^
      compilation terminated.
      編譯時發生錯誤

      刪除
  4. 怎麼都出現這個 試了好多次
    MPU6050_raw.ino:36:20: error: I2Cdev.h: No such file or directory

    回覆刪除
  5. 把解壓縮得的I2Cdev目錄整個copy到 Arduino/Library目錄下試看看

    回覆刪除
  6. 謝謝分享,我看國外的資料看到頭昏了還是沒搞懂,看你的十分鐘搞定。多謝

    回覆刪除
  7. 作者已經移除這則留言。

    回覆刪除
  8. 我已經把I2CDev 跟MPU6050放到libraries 下面了
    可他還是顯示:
    fatal error: msp430.h: No such file or directory
    #include
    compilation terminated.
    是不是我少放了什麼阿?

    回覆刪除
    回覆
    1. 我發現我的I2CDev 裡面有多出兩個msp430 .c 和.h檔
      我把他們刪掉之後就可以跑了.. 但是跑出來都是一堆亂碼
      不知道發生什麼事..

      刪除
    2. Baud rate 改 384000,在畫面的右下角

      刪除
  9. 可是我的右下角沒有38400這個選項~ 怎麼會這樣...

    回覆刪除
  10. 所以我剛剛把兩邊傳輸率改成57600 就可以跑了...
    不知道為什麼?

    回覆刪除
    回覆
    1. 看來是兩邊速度都一樣就好!!

      刪除
    2. 是的,看來您解決問題的動作很快。

      刪除
  11. 請問一下 ax ay az gx gy gz 個代表什麼阿?
    新手剛接觸不太懂@@

    回覆刪除
  12. 不好意思請問一下
    那些加速度 角加速度是怎麼計算出來的
    因為我想把他用來控制馬達
    新手QQ

    回覆刪除
    回覆
    1. 不好意思,他內部的原理我只知道是用微機電製程做磁力與重力方向的感測,然後微分之後得到加速度,與角加速度。公式可以在大學機動學的課本裡找到。但您要我詳細指出怎麼算出來的,我需要花一點時間複習。

      刪除
    2. 請問一下,他顯示的單位是什麼?
      怎麼換算成 公尺/米平方

      刪除
  13. MPU6050_raw.ino:36:20: error: I2Cdev.h: No such file or directory

    不好意思 ,請問一下我試了好幾次一直出現這個問題,請問要如何解決呢

    回覆刪除
    回覆
    1. 不知是不是lib放錯地方?有在example看到mpu6050嗎?

      刪除
    2. 有耶 我有在example 裡面看到,mpu6050_raw

      刪除
    3. 試了好幾次還是失敗 不知道有解決方法嗎

      刪除
    4. 沒有放到 I2Cdev資料夾,I2Cdev資料夾 和 MPU6050資料夾 都要放入目錄

      刪除
  14. 您好:想請教您,如果我用的板子是UNO R3的話,有辦法直接套用MPU 6050的EXAMLE嗎?

    回覆刪除
    回覆
    1. UNO的 SCL SDA在a4、a5所以應該可以用,不過你的腳位要改!

      刪除
  15. 想請問
    如果想將針腳從20及21改到其他的針腳,程式該如何修改呢?

    回覆刪除
    回覆
    1. 不是幾號針腳的問題,而是一定得是SCL & SDA的腳位。不同arduino的版本,SCL與 SDA的腳位還不太一樣。

      刪除
  16. 請問這要怎樣解決
    MPU6050_raw.ino:36:20: fatal error: I2Cdev.h: No such file or directory
    compilation terminated.
    Error compiling.

    回覆刪除
    回覆
    1. 也……就像訊號寫的,I2Cdev.h: No such file。

      刪除
  17. 可問可否教學一下
    我想用Arduino+MPU6050+步進馬達來 做自動轉向大燈
    可以給我一件要怎摸寫嘛哈哈我者是參考參考

    回覆刪除
  18. 是否可以解使一下 它可以用在甚麼地方

    回覆刪除
    回覆
    1. 飛行器 或者需要量測平衡的地方

      刪除
  19. 請問如何更改輸出速率呢??

    回覆刪除
  20. 意思是我想改成每秒100個輸出 請問要如何更改及如何來計算

    回覆刪除
  21. 您好 我有個問題想請教
    我使用這塊板子時發現
    平行旋轉的部分只能使用陀螺儀計算
    無法融合加速計數據
    請問作者有甚麼這方面的解決方法嗎

    回覆刪除
    回覆
    1. 我沒有親自試過,不過您有對旋轉的角度做二次微分嗎?雖然理論上可行,不過sample rate不夠的話,也許做出來的效果很差。您可以試看看。

      刪除
  22. 請問這也可以用Arduino Nano嗎?

    回覆刪除
  23. 請問陀螺儀多個 SCL跟SDA不夠怎麼辦?
    兩個以上陀螺儀程式需要改哪邊?
    感謝大大回答

    回覆刪除
  24. 請問如果只要取樣物體的XYZ軸,程式碼該如何修改

    回覆刪除
  25. 您好,請問要怎麼更改"I2Cdevlib的函式庫裡 加速度和腳加速度靈敏度預設值"。例如把2G改成16G

    回覆刪除
    回覆
    1. 我也有同樣問題 有人可幫忙嗎

      刪除
    2. 終於找到了
      在初始化那附近
      加入這個
      初始化時就改變了

      accelgyro.setFullScaleGyroRange(MPU6050_GYRO_FS_2000);
      accelgyro.setFullScaleAccelRange(MPU6050_ACCEL_FS_4);

      後面自己改
      一個是250 500 1000 2000
      2 4 8 16

      刪除
    3. 請問更改"I2Cdevlib的函式庫裡(MPU6050.cpp裡)加速度和角加速度靈敏度預設值"="將sensor讀取值的速度加快"的意思嗎?

      刪除
  26. 你好,如果要使用uno连接的话,该怎么样接线啊

    回覆刪除
  27. 你好,如果要使用uno连接的话,该怎么样接线啊

    回覆刪除
    回覆
    1. VCC <--> 5V
      GND <--> GND
      SCL <--> A5
      SDA <--> A4

      刪除
  28. ad0不是要接地或著接高電位這樣才有正確的地址? 空接可以嗎?

    回覆刪除
  29. 請問可以透過訊號控制servo的開關嗎,在mpu6050一直執行的狀態下,雖然馬達一直接收到平衡角度的訊息,但是我希望能控制馬達旋轉的開關,在某些時候不希望伺服馬達開啟

    回覆刪除
  30. 不好意思請問一下~
    uno接線如下
    VCC <--> 3.3V
    GND <--> GND
    SCL <--> A5
    SDA <--> A4

    上傳MPU6050_raw的範例程式
    為什麼有讀到值但全都是0
    QQ

    回覆刪除
  31. 請問一下 為何照著版大的方法我會得到Invalid library found in C:\Users\User\Documents\Arduino\libraries\arduino: Missing 'author' from library

    回覆刪除
  32. 請問一下 跑範例MPU6050_raw都沒問題,但不知為什麼我將旁邊一顆伺服馬達打開,系統就停一下了,是干擾嗎?

    回覆刪除
  33. 你好,若想改成+/- 16G 的話,要怎麼改呢?

    回覆刪除
  34. 你好 請問讀到的數據 要如何作積分 這些數據是存在哪裡??

    回覆刪除
  35. 請問一下我的六軸跑出來為什麼一直都是0

    回覆刪除
  36. 想問個問題,我用arduino 做一台兩輪式機器車,但無法精準的轉向90度還是180度,可以用陀螺儀來做嗎

    回覆刪除
  37. A






    C:\Users\雿喟?Desktop\Arduino\libraries\MPU6050\examples\MPU6050_raw\MPU6050_raw.ino:36:20: fatal error: I2Cdev.h: No such file or directory

    compilation terminated.

    exit status 1
    開發板 Arduino/Genuino Uno 編譯錯誤。
    一直舞法編譯 請問我該怎麼辦?

    回覆刪除
    回覆
    1. 把I2Cdev資料夾中的I2Cdev.cpp與I2Cdev.h放到library的MPU6050資料夾裡試試看,我試完就沒有您所說的問了

      刪除
  38. 作者已經移除這則留言。

    回覆刪除
  39. 想問我上傳授後出現在C:\Users\sky\Documents\Arduino\libraries\i2cdevlib-master: C:\Users\sky\Documents\Arduino\libraries\i2cdevlib-master裡找到無效的程式庫
    這是甚麼原因

    回覆刪除
  40. 我其實是想找個零件顯示目前傳感器的姿勢的。有一點攪不明白:如果初始時傳感器傾斜擺放,並傳感器靜止不動,那麼偵測出來的數據應該都是0,因為沒有角速度啊

    回覆刪除
  41. 請問這個程式碼可以套用到M0 pro嗎

    回覆刪除
  42. 請問一下 COM讀到的值是不是LSB值? 然後應該還要單位換算一下才能得到 g 和 deg/s 單位的值?

    回覆刪除
  43. 為甚麼我的監控視窗只跑出這一行就沒了
    Initializing I2C devices...

    回覆刪除
  44. 請問使用 arduino uno 時如何接腳?

    回覆刪除
  45. 請問出現的數據為亂碼 是怎麼回事

    回覆刪除