2019年2月10日 星期日

模組介紹 : faya 陀螺儀模組


學習目標 : 認識faya 陀螺儀模組的功能及使用方式
學習時間 : 60 min
示範模組 : (1) fayaduino UNO
                   (2) faya 陀螺儀模組

====================功能介紹====================

faya 陀螺儀模組透過I2C的接線,從Arduino的函式庫下指令讀取資料,這個模組讀取的資料分別為Pitch、Roll、Yaw 3個旋轉軸的數值,與3軸加速度計模組所讀取的資料稍稍不同,本段段僅解釋範例中用到的指令,更多的函示庫指令用法可參考官方說明。


介紹指令前,先看一下faya 陀螺儀模組的外觀,它的左邊有六個埠,分別是SCL、SDA、SDO、CS、INT1、INT2,與3軸加速度計模組的腳位幾乎一樣,只有CS的腳位電位相反,這個模組同樣也是使用I2C通訊協定。

模組的右下角有一個用來指示旋轉方向的圖案,分別標示X、Y、Z 共3個軸,其中Z軸需要發揮一點想像力,因為Z軸的方向是與模組平面向上垂直的方向,可搭配下圖互相比照。


把左邊圖片中的模組想像成一個方塊如右邊圖片,綠色箭頭標示的方向就為Z軸,藍色箭頭為X軸,紅色則為Y軸


上面圖片為Arduino UNO中的I2C的腳位。左、右兩邊的SDASCL各別互相導通,因此從右邊接線或者左邊接線都可以使用。

接下來介紹使用指令
  • #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的數值變化

接線:
(1) 電源線連接如下圖所示,連接的說明請看這篇文章簡易版




(2) 訊號線連接

                   Arduino_A4 ===> 3軸加速度計模組_SDA
                   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後,就會發現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,即代表模組向前方傾斜。



將模組恢復到水平,而且這次要放在桌面上,準備進行最後的動作實驗。同樣如果回到水平位置後,3個感測數值沒有趨近為0,按下Reset按鍵讓Arduino對模組重新初始化。

將模組放在桌面上逆時針旋轉(就像轉動電子羅盤一樣),查看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之間的連線。

也歡迎大家在底下留言或到我們的粉絲團留言喔!
====================================

沒有留言:

張貼留言