學習目標 : 認識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資料夾)
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// 2019/02/11 | |
// Faya-Nugget 範例程式 (Gyroscope_1.ino) | |
// 單元: 模組介紹-faya陀螺儀模組 | |
// 網址:https://fayalab.blogspot.com/2019/02/gyroscope.html | |
// 目標: (1)使用Serial Monitor,查看陀螺儀模組角度偏移的資料變化 | |
// (2)請分別測試平行旋轉、前後旋轉、左右選轉...等3個動作, | |
// 查看Pitch、roll、yaw的數值變化 | |
// 接線: Arduino ==> faya模組 | |
// A4 ==> SDA (陀螺儀模組) | |
// A5 ==> SCL (陀螺儀模組) | |
// | |
#include <Wire.h> // 引入Wire函式庫 | |
#include <L3G4200D.h> // 引入L3G4200D函式庫 | |
L3G4200D faya_gyro; // 建立物件,名稱為 faya_gyro | |
// Timers | |
unsigned long timer = 0; | |
float timeStep = 0.01; | |
// 宣告Pitch, Roll, Yaw的儲存變數 | |
float pitch = 0; | |
float roll = 0; | |
float yaw = 0; | |
void setup() | |
{ | |
Serial.begin(115200); | |
Serial.println("Initialize L3G4200D"); | |
// 設定掃描頻率為2000dps,資料輸出速度為400Hz | |
while(!faya_gyro.begin(L3G4200D_SCALE_2000DPS, L3G4200D_DATARATE_400HZ_50)) | |
{ | |
Serial.println("Could not find a valid L3G4200D sensor, check wiring!"); | |
delay(500); | |
} | |
// 校準陀螺儀的感測數值,請在通電以後將陀螺儀模組水平放置於桌面上 | |
faya_gyro.calibrate(100); | |
} | |
void loop() | |
{ | |
timer = millis(); | |
// 讀取感測數值 | |
Vector norm = faya_gyro.readNormalize(); | |
// 將讀取的感測數值換算為Pitch, Roll, Yaw | |
pitch = pitch + norm.YAxis * timeStep; | |
roll = roll + norm.XAxis * timeStep; | |
yaw = yaw + norm.ZAxis * timeStep; | |
// 將Pitch, Roll, Yaw的換算結果顯示在Serial Monitor | |
Serial.print(" Pitch = "); | |
Serial.print(pitch); | |
Serial.print(" Roll = "); | |
Serial.print(roll); | |
Serial.print(" Yaw = "); | |
Serial.println(yaw); | |
// 等待下個讀取資料的時間點 | |
delay((timeStep*1000) - (millis() - timer)); | |
} |
備註:
- 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之間的連線。
也歡迎大家在底下留言或到我們的粉絲團留言喔!
沒有留言:
張貼留言