學習目標 : 認識faya 陀螺儀模組的功能及使用方式
學習時間 : 60 min
示範模組 : (1) fayaduino UNO
(2) faya 陀螺儀模組
====================功能介紹====================
faya 陀螺儀模組透過I2C的接線,從Arduino的函式庫下指令讀取資料,這個模組讀取的資料分別為Pitch、Roll、Yaw 3個旋轉軸的數值,與3軸加速度計模組所讀取的資料稍稍不同,本段段僅解釋範例中用到的指令,更多的函示庫指令用法可參考官方說明。
把左邊圖片中的模組想像成一個方塊如右邊圖片,綠色箭頭標示的方向就為Z軸,藍色箭頭為X軸,紅色則為Y軸。
- #include <L3G4200D.h>
引入陀螺儀的函示庫。
- #include <Wire.h>
引入I2C介面,讓Arduino打開I2C的通訊界面。
- L3G4200D 物件名稱;
此指令將陀螺儀的函示庫名稱,宣告成自己的物件名稱。
- 物件名稱.begin(L3G4200D_SCALE_2000DPS, L3G4200D_DATARATE_400HZ_50)
初始化3軸加速度模組,並設定掃描頻率為2000dps,資料輸出速度為400Hz。
- 物件名稱.calibrate(100);
在Arduino開機時,初始化陀螺儀的感測數值,請將陀螺儀模組水平放置於桌面上,後方括弧內的數值為初始化的取樣次數,請使用預設的100即可。
- 物件名稱.readNormalize();
讀取標準化後的感測數值
- millis();
計數Arduino開始執行程式以後所經過的時間,單位為毫秒
====================原理知識====================
以下解釋提供給有需要知道背後原理的人:
陀螺儀的偵測方式與3軸加速度計相同,使用電容偵測的方式感應旋轉角度與方向,只不過陀螺儀的電容偵測方式更加進階,想了解基本電容偵測可參考3軸加速度計。
陀螺儀電容偵測用的固定電極片類似音叉的外型,當加上科氏力原理(Principle of Coriolis),就可將角速率轉換成感測結構的位移量,進而得知旋轉的角度和方向。
上面的圖片是以單軸感測來解說工作原理,藍色與綠色分別為不同裝設方向的固定電極片,依照紅色箭頭的方向對模組施加旋轉的動作,內部的固定電極片則會按照黃色箭頭的方向位移,進而改變每個區塊的電容差值,就可以知道旋轉的角度和方向。
====================範例實作(一)====================
了解模組功能(原理)後,我們用以下範例來展示模組的功能:
目標:
====================範例實作(一)====================
了解模組功能(原理)後,我們用以下範例來展示模組的功能:
目標:
(1)使用Serial Monitor,查看陀螺儀模組角度偏移的資料變化
(2)請分別測試平行旋轉、前後旋轉、左右旋轉...等3個動作,查看pitch、roll、yaw的數值變化
接線:
Arduino_A5 ===> 3軸加速度計模組_SCL
範例程式:
(上傳程式前請記得下載[L3G4200D]函示庫,解壓縮並複製整個資料夾到Arduino的Lirbaries資料夾)
備註:
- L19 / L42 / L61 : 一點程式小技巧,讓每次讀取資料的時間點固定,L19設定了每10ms讀取一次感測值,但是由於Arduino讀取和秀出感測值時 (L45 ~ L58) 會花一些時間,因此我們L42先記錄起始時間,然後在L61中的 (millis() - timer) 算出總共花了多少時間,假設花了2ms,最後只要delay (10ms-2ms) = 8ms 就會得到我們希望的每10ms讀取一次感測值。
- L31: 設定感測值精準度,可選擇250 / 500 / 2000 DPS,DPS代表Degree Per Second,以2000 DPS為例,代表每秒鐘可以偵測到2000度的範圍,意味著解析度不會像250DPS那麼好,但是可以偵測比要大的變動量。
- L37 :校準三軸的初始值,內部參數為取樣次數,設定50以上就會有明顯校正效果,執行到此行時,感測器會將當時的位置的感測值設為0,所以此時的感測器應擺在初始位置,並且不要移動。
範例結果:
將模組平放如下方左圖,接著打開Serial Monitor查看Pitch、Roll、Yaw數值,都趨近為0。
最後將模組放在桌面上順時針旋轉,查看Serial Monitor,Yaw數值變為負數且小於0,可知道模組向右偏移。
範例結果:
討論:
也歡迎大家在底下留言或到我們的粉絲團留言喔!
範例程式:
(上傳程式前請記得下載[L3G4200D]函示庫,解壓縮並複製整個資料夾到Arduino的Lirbaries資料夾)
備註:
- L19 / L42 / L61 : 一點程式小技巧,讓每次讀取資料的時間點固定,L19設定了每10ms讀取一次感測值,但是由於Arduino讀取和秀出感測值時 (L45 ~ L58) 會花一些時間,因此我們L42先記錄起始時間,然後在L61中的 (millis() - timer) 算出總共花了多少時間,假設花了2ms,最後只要delay (10ms-2ms) = 8ms 就會得到我們希望的每10ms讀取一次感測值。
- L31: 設定感測值精準度,可選擇250 / 500 / 2000 DPS,DPS代表Degree Per Second,以2000 DPS為例,代表每秒鐘可以偵測到2000度的範圍,意味著解析度不會像250DPS那麼好,但是可以偵測比要大的變動量。
- L37 :校準三軸的初始值,內部參數為取樣次數,設定50以上就會有明顯校正效果,執行到此行時,感測器會將當時的位置的感測值設為0,所以此時的感測器應擺在初始位置,並且不要移動。
範例結果:
將模組平放如下方左圖,接著打開Serial Monitor查看Pitch、Roll、Yaw數值,都趨近為0。
將模組逆時針旋轉(向左旋轉),查看Serial Monitor後,就會發現Pitch變為負數且數值小於0很多,即代表模組向左傾斜,而Roll、Yaw的數值變化量沒有Pitch高。
將模組順時針旋轉(向右旋轉),繼續查看Serial Monitor,發現Pitch變為正數且數值大於0,即代表模組向右傾斜。
將模組恢復到水平位置繼續下面的動作實驗。如果回到水平位置後,3個感測數值沒有趨近為0,可以按下Arduino上的Reset按鍵,讓Arduino對模組重新初始化一次。
將模組的正面朝向自己旋轉(向後面旋轉),接著查看Serial Monitor,這次變為Roll開始變化,且數值為正數並大於0,即代表模組向後方傾斜,而Pitch、Yaw的數值變化量沒有Roll高。
接著將模組的背面朝向自己旋轉(向前面旋轉),接著查看Serial Monitor,Roll的數值變化量較Pitch、Yaw大,且為負數小於0,即代表模組向前方傾斜。
將模組放在桌面上逆時針旋轉(就像轉動電子羅盤一樣),查看Serial Monitor,變成Yaw數值產生大量的變化,數值為正數且大於0,就可以知道模組向左偏移。
最後將模組放在桌面上順時針旋轉,查看Serial Monitor,Yaw數值變為負數且小於0,可知道模組向右偏移。
範例結果:
- 如果模組平放在桌面上一段時間,可是發現Pitch、Roll、Yaw 3個數值卻變得超大(大於0)或者超小(低於0),是因為模組已經向某個方向傾斜,而且Serial Monitor顯示的Pitch、Roll、Yaw數值都為累加值,所以數值會持續變化。在範例中我們用Reset從頭來過,大家可以嘗試的用軟體自我校正。
- 比較不同的DPS值,並感受所提供的精確度對於輸出的差距。
- 如果在實驗過程中發現Serial Monitor顯示的數值停止更新,代表Arduino與模組之間的連線已經斷線,請重新確認接線後,按下Arduino 的Reset按鍵,恢復模組與Arduino之間的連線。
也歡迎大家在底下留言或到我們的粉絲團留言喔!
沒有留言:
張貼留言