2014/07/24


萊恩大兵有個模糊的想法, 想拿三軸加速度計與陀螺儀之類的 IMU 裝置, 來做些速度有關的應用. 什麼都不懂, 會挑 MPU-6050 純粹是朋友有在用這一款, 比較心安一點. 這篇文章主要是萊恩大兵的 google 筆記與實驗心得整理, 自己動手寫的東西還不多.



[參考資料]

前前後後搜出不少連結, 讀完後覺得有體會有共鳴的, 大致列出如下:

(1) Accelerometer & Gyro Tutorial
* 這篇很詳細解釋了三軸加速度計和陀螺儀的原理與公式推導, 必讀.
(2) Bear 實驗室:利用Arduino+MPU6050慣性感測器控制Servo
*入門文章, 這篇給新手快速上手剛剛好.
(3) Arduino Sensors
* 入門文章, 可以讀一下.
(4) MPU-6050: DMP Data from i2cdevlib
* 入門文章, 內容很豐富, 必讀.
* 有提供 Arduino / Processing (The Teapot Demo) 的示範程式.
(5) Gyroscopes and Accelerometers on a Chip
* 和上一篇同作者
* 文章談到怎麼拿陀螺儀的數值來計算轉動角度, 內容很豐富, 必讀.
* 有提供 Arduino / Processing (ShowGY521Data) 的示範程式.
(6) MPU-6050 /w DMP accelerometer demo
* 有提供 Arduino / Processing (mpuAccelerometerDemo) 的示範程式.
(7) Guide to gyro and accelerometer with Arduino including Kalman filtering
* 入門文章, 內容很豐富.
(8) Arduino Sketch to automatically calculate MPU6050 offsets
* 基於 I2Cdevlib 的 calibration 程式, 有提供 Arduino (MPU6050_calibration) 示範程式.
(9) Understanding raw values of accelerometer and gyrometer
* I2Cdevlib 的補充說明.
(10) Reading a IMU Without Kalman: The Complementary Filter
* Complementary Filter 的實作示範.
* Kalman Filter 的實作示範.
(12) A practical approach to Kalman filter and how to implement it
(13) TKJElectronics/Example-Sketch-for-IMU-including-Kalman-filter
* Kalman Filter 原理說明與實作. 
* 有提供 Arduino / Processing (MPU6050) 的示範程式.
(14) http://invensense.com/mems/gyro/mpu6050.html
* 原廠 (InvenSense) 的產品網頁, 不想看/看不懂 data sheet, 至少可在這邊查到 Gyro 或 Accel Sensitivity 值. 供參考.
(15) FIFO Overflow
* Arduino + MPU6050 有時在 Monitor 可以看到有 FIFO Overflow的問題, 解決方法請參考上面連結. (感謝鋼鐵人 Greg 的指點)

[2014/8/29, 更新]
(16) Changing Acceleration Sensitivity on MPU6050 with Kalman Filter
* 更改 accel sensitivity 的作法


[實驗環境]

服用上面落落長的文章與連結, 最好要搭配 Arduino 與 MPU-6050 實際動手做, 以免打瞌睡. 請準備..

(1) MPU-6050 + Arduino Uno
* 將 MPU-6050 銲上排針, 要讓它能水平放置在麵包板上.

* 與 Arduino Uno 的腳位接法為:
   GND <-> GND
   VCC <-> 3.3V
   SDA <-> A4
   SCL <-> A5
   INT <-> D2 (某些程式範例, 例如 The Teapot Demo, 才需要接這腳位)

(2) I2Cdevlib
* 萊恩大兵看不懂 data sheet, 也還沒能力去填 register 值操控 MPU-6050. 還好有 Jeff Rowberg 發展的 I2Cdevlib library 可叫用, 省掉很多麻煩事.
* 下載 I2Cdevlib, 並匯入到 Arduino IDE 裡. 


(3) Processing
* 也是需要的.. 有很多的示範程式都是用 Processing 開發的.

[示範程式]

林林總總的示範程式, 大概包括幾個主題:

(1) 啟動 MPU-6050 與取得量測數值.

[MPU6050_raw]
* I2Cdevlib 裡面的範例程式
* 主要功能就是啟動 MPU-6050, 再把偵測值倒出來.

* setup() 裡面有一行 accelgyro.initialize() 去做 initialize 動作. 再 trace 進去, 會看到裡面有設定 gyro 和 accel range 的程式碼. 看來若要更改 MPU-6050 的 sensor range, 可以從這下手.
void MPU6050::initialize() {    setClockSource(MPU6050_CLOCK_PLL_XGYRO);    setFullScaleGyroRange(MPU6050_GYRO_FS_250);    setFullScaleAccelRange(MPU6050_ACCEL_FS_2);    setSleepEnabled(false); // thanks to Jack Elston for pointing this one out!}


(2) 校正偏移值
很多篇文章裡面都有提到 calibration 或 sensor offset 的問題. 在使用 MPU-6050 之前, 得先調整它的偏移值, 讓它水平放置時, 倒出來的偵測值為
   ax:0 ay:0 az: 16384  (accel range: +/- 2g)
   gx:0 gy:0 gz:0

[MPU6050_calibration]
* from Arduino Sketch to automatically calculate MPU6050 offsets
* 萊恩大兵的經驗, 覺得這隻程式量測出來的偏移值比較正確. 


(3) 具現化 accel 與 gyro 的量測數據
MPU-6050 丟出來的量測數據硬邦邦的, 要怎麼解讀? 這些示範程式可供參考:

[mpuAccelerometerDemo]
* from MPU-6050 /w DMP accelerometer demo
* 這隻程式具現化了 accel 數值.


[The Teapot Demo]
I2Cdevlib 裡面的範例程式
* 在 Arduino sketch [MPU6050_DMP6.ino] 得改幾個地方:
> Uncomment teapot flag

> 在 setup() 面插入 accel 與 gyro 的 sensor offset 調整值

> 編譯好且上傳到 arduino 後, 得開啟 serial monitor, 依從提示輸入個字元讓 MPU-6050 開始傳資料後, 再關掉 serial monitor, 換去執行 Processing.

* 在 Processing sketch [MPUTeapot.pde] 也得改個地方:
> 修改 setup() 裡面的 serial port name 為自己的. 
* 全部弄好, 就可以看到一架小飛機, 跟隨 MPU-6050 的轉動而轉動.

[ShowGY521]
* from Gyroscopes and Accelerometers on a Chip
* 類似 The Teapot Demo, 也是具現化 gyro 數值. 但它有用 accel 值來修正 gyro 的數值, 畫面方塊的轉動, 比較接近實際.



(4) Kalman Filter 和 Complementary Filter
量測一定會有誤差. 數篇文章裡面都有提到, accel 數值長期來看是穩定的, 短期內卻可能振盪劇烈. 而 gyro 值正好相反, 短期內可靠, 長時間卻會飄移. Kalman Filter 或 Complementary Filter 都是結合 accel 與 gyro 數值, 來計算出更貼近真實情況量測值的演算法.

[MPU6050]
* from TKJElectronics/Example-Sketch-for-IMU-including-Kalman-filter
* 這裡面的數學, 萊恩大兵已經投降了.


[Complementary Filter]
* from Reading a IMU Without Kalman: The Complementary Filter


[問題或靈異現象]

(1) 萊恩大兵還無法體會 gyro 的 drift 現象, 到底是什麼樣的問題.
* (謝謝網友 Ryan Chao 指點) 我的理解是, 物理感測器一定有解析度的限制, 即使校正到零, 也不可能剛好是零, 這一點點的誤差就會一直累積變成漂移啦. 
* 萊恩大兵的觀察: 將 The Teapot Demo 的小飛機靜置一段長時間, 就會看到飛機頭漸漸轉向. 這應該就是漂移現象.

(2) 跑示範程式時, 偶爾就會遇到 arduino + MPU-6050 凍住的現象. 通常重新啟動 arduino 即可排除, 不確定到底什麼原因造成的.
* 網友的指點大都是朝向腳位接觸不良, 或接腳不夠牢固, 造成感測器瞬間斷路所導致. (謝謝吳朝聖, 吳志允..)

(3) 跑示範程式時, 例如 The Teapot Demo , 偶就會遇到飛機轉動方向和 MPU-6050 轉動方向不一致的現象. 有點像是 YPR 解讀成 YRP. 明明接線或 MPU-6050 放置方位什麼都沒變過, 卻是這回執行結果正確, 下回再執行結果就不對. 很奇怪, 不知道是什麼原因造成的.
* 這 MPU-6050 (其它感測器也類似) 其實有個正面向上的概念. 意思就是, 它的感測器內部已有設定哪個方位是 Yaw, 哪個是 Pitch 哪個是 Roll. 在跑示範程式之前, 得先確定感測器的方位有放對. (謝謝鋼鐵人 Greg Tsai 的指點)
* 說到底其實就是萊恩大兵把 MPU-6050 拿錯邊了. 搞笑了.. :-<
MPU-6050 上面有架小飛機, 也代表 YPR 的方向.


[2014/8/29, 更新]
* 這篇文在臉書上的討論串在這.



[萊恩大兵的其它文章]

自製大四軸

自製大四軸, 實作分享@華山文創文區
自製大四軸, (1) 零組件篇, 遙控器 (Drone, Quadcopter, Futaba, Maker, Arduino, Animatronic Eye)
自製大四軸, (2) 零組件篇, 飛控板 (Drone, Quadcopter, MultiWii, Arduino, Futaba, Maker)
自製大四軸, (3) 零組件篇, 自行雷切木質機架 (Drone, Quadcopter, Maker, Laser Cut)
自製大四軸, (4) 零組件篇, 馬達與電變調整 (Drone, Quadcopter, Maker, Electric Speed Control, Motor)
自製大四軸, (5) 組裝篇, 四軸飛行器成形 (Drone, Quadcopter, MultiWii, Arduino, Maker, Electric Speed Control, Motor)
自製大四軸, (6) 調整篇, 飛行前兩三事 (Drone, Quadcopter, Maker, Futaba, Arduino, MultiWii)
自製大四軸, (7) 充電篇, iMax B6 充電器操作記要 (Charger, Battery)
自製大四軸, (8) 問題篇, 機架損壞維修 (Drone, Quadcopter, Laser Cut)
自製大四軸, (9) 改良篇, 方便拆卸的木質機架 (Drone, Quadcopter, Maker, Laser Cut)

自動報球速的棒球



CC2540 Bluetooth Low Energy
筆記, CC2540 Bluetooth Low Energy, (1) 開發環境 架設 (Bluetooth, CC2540)
筆記, CC2540 Bluetooth Low Energy, (2) 跑第一個範例程式 (Bluetooth, CC2540)
筆記, CC2540 Bluetooth Low Energy, (3) SimpleBLEPeripheral 簡單介紹 (Bluetooth, CC2540)
筆記, CC2540 Bluetooth Low Energy, (4) 在智慧手機上執行範例程式 (Bluetooth, CC2540)
筆記, CC2540 Bluetooth Low Energy, (5) 偵測與發送 iBeacon 訊號 (Bluetooth, CC2540, iBeacon)
實作, iBeacon 發訊器 x 防丟器 (Bluetooth, CC2540, iBeacon)
實作, iBeacon 尋寶遊戲 (Bluetooth, CC2540, iBeacon, iOS app)
實作, BLE + iOS app, 遙控燈泡君 (Bluetooth, CC2540, iOS app)
做實驗, 用 iBeacon 做自動控制的可行性 (Bluetooth, iBeacon, CC2540, Automation, URL Scheme, iOS app)

藍色小鋪一起來做

藍色小鋪一起來做, (1) 用 beacon 控制開關的枱燈
藍色小鋪一起來做, (2) 講解 BLE CC2540 UART 通訊範例程式 (Bluetooth, CC2540, UART)
藍色小鋪一起來做, (3) 藍牙枱燈專案實作 (上) (Bluetooth, CC2540)
藍色小鋪一起來做, (4) 藍牙枱燈專案實作 (下) (Bluetooth, CC2540)
藍色小鋪一起來做, (5) iBeacon scanner 專案示範與解說 (Bluetooth, CC2540, iBeacon)
藍色小鋪一起來做, (6) 完成, 用 iBeacon 控制開關的枱燈 (Bluetooth, CC2540, iBeacon)
藍色小鋪, 初嚐樹莓派 (Raspberry Pi)

小惡魔 無線溫度感測器

108 大眼仔
Plot Clock
體驗, 原住民互動故事書@宜蘭大同鄉泰雅生活館
體驗, 蛋生音互動裝置@兒童美術館 (Arduino, 3D Printing, HC-SR04, Interactive)



實作, 電容感應音樂樹

4 意見:

張貼留言