前一篇 "三軸重力加速計" 介紹 ADXL335 晶片的重力加速計 (也稱加速規),主要能偵測出三軸的重力變化,便能得知物體轉動方向方位。有一個特殊情況可解釋陀螺儀的作用,當加速規放置水平時,此時轉動轉動 Z 軸,我們會發現 X/Y 軸的重力值變化量其實並不大,請參考底下的實驗影片。這樣的變化量可能被誤以為是雜訊,不容易判斷物體是否方向方位在改變。如果能再多計算每一軸轉動的速度,由轉動的角速度輔助,便能計算物體位移量。於是,陀螺儀正是用來計算角速度的,配合重力計一起使用。因此,若加速規再輔以陀螺儀的功能,這樣能更精準算出物體的移動與轉動方向 (我覺得這是很複雜的數學)。
Arduino 官方網站中提供好多種重力加速計與陀螺儀的模組,我便找了一顆 MPU6050 晶片來測試。這顆晶片不只具有三軸重力加速計,還有陀螺儀的功能,對外的通訊介面為 I2C 方式。首先,實驗過程我採用恩智浦的 LPC1114 控制器來比較一下 MPU6050 與 ADXL335 的重力數值,如圖一所示。圖一的 LCM 第一行顯示的是 MPU6050 X, Y, Z 軸的重力值,第二行顯示的是 ADXL335 的三軸重力值,我已經把兩塊模組的 X/Y 軸方向調整為一致了 (兩塊模組的三軸定義方向其實不太一樣,用軟體方式調整),如圖右下角所示。圖中,X 軸的重力值約為 -0.023g 和 -0.018g,Y 軸的重力值約為 -0.016g 和 0.018g,Z 軸的重力值約為 0.964g 和 1.112g。兩者數值的誤差,我的解釋是實驗過程並沒有做校正的動作,因此兩者模組存在一些誤差。撇開誤差,如果我們的實驗對精準度沒有要求太高的話,倒是很快取得三軸重力數值並計算出大概方位。
圖一:MPU6050 與 ADXL335的加速規數值 (單位 mg)
下圖二是 MPU6050 晶片的陀螺儀規格,這顆可提供四種精度,如果物體的轉速慢,則可以選擇 FS_SEL=0,角速度範圍在正負250度/秒。如果物體的轉速快,則需要選擇較大的角速度範圍。這顆晶片內建有 16-bit ADC 功能,所以角速度會轉換成 -32767 ~ +32767 的有號數。角速度 0 的數值為 16384,然後每一度代表多少數值則由範圍決定 (參考 scale factor 欄位)。
圖二:MPU6050 陀螺儀的規格
下圖三是 MPU6050 晶片的重力加速計規格,也是可提供四種精度,如果物體的震動或移動較慢,則可以選擇 AFS_SEL=0,重力值範圍在正負2g。如果物體的震動或移動變化較大的話,則需要選擇較大的重力值範圍,可高達 16g,比如常見行車紀錄器裡有個碰撞偵測的設定,判斷的依據就是依這個 g 值大小來決定啟動錄影。此外,它與 ADXL335 不同的地方,ADXL335 的感測範圍固定在正負 3g,不像 MPU6050 使用上有彈性。還有一點,由於這顆晶片內建有 16-bit ADC 功能,所以重力值會被轉換成 -32767 ~ +32767 的有號數。第一步我們必須找到 0g 的數值,不同的範圍有不同的 0g 對應值。
圖三:MPU6050 重力加速計的規格
為了要了解陀螺儀的角速度變化,我做了轉動的實驗,比較能產生具體的印象。實驗中,測試板螢幕的第一行顯示目前的三軸重力數值,第二行顯示陀螺儀的角速度。首先,將 MPU6050 放置水平,然後旋轉 Z 軸,順時針轉或逆時針轉。靜止時,三軸的角速度均為 0,當逆時針轉時,Z 軸的角速度瞬間會變大 (正值),然後停下來後再趨於零。當順時針轉時,Z 軸的角速度瞬間也會變大 (負值),停下來後便趨於零。轉動的同時,我觀察另外兩軸的角速度幾乎是零。
同樣地,我對 X 軸做旋轉的實驗。靜止時,三軸的角速度均為 0,當我將板子提起的瞬間,角速度會變大 (負值),然後停下來後再趨於零。當我將板子快速放下的瞬間,X 軸的角速度瞬間也會變大 (正值),停下來後便趨於零。轉動的同時,觀察另外兩軸的角速度也是幾乎為零。希望從這個實驗的過程能讓大家了解到陀螺儀這個數據所代表的意義。
參考資料:
[1] 筆記, MPU-6050, google 搜尋與實驗心得 (MPU-6050, Arduino)
[2] Arduino範例21:利用MPU6050取得空間姿態的row data
[3] 利用MPU6050透過Arduino及Processing展現姿態演算
[4] 使用 MPU-6050 的 DMP 來取得更精準的運動感測資料
留言列表