2017年10月5日 星期四

mBot x STEM:mBot 水平儀

簡介

我們很多時候看到有一些運用了手提電話內的陀螺儀應用的水平儀,這次我們也會使用 Me 陀螺儀(Me 3-Axis Accelerometer and Gyro Sensor)配合 mCore 造出一個水平儀。

Me 陀螺儀(Me 3-Axis Accelerometer and Gyro Sensor)

首先,我們了解一下 Me 陀螺儀的功能,它是一款理想的機器人運動檢測、姿態檢測模組。包含 3 軸加速度計、3 軸角速度感測器與運動處理器,並提供 I2C 介面通信。

Me 陀螺儀能夠在 X、Y、Z 軸測量加速度的變化,通過感知特定方向的慣性力總量,加速計可以測量出加速度和重力;三軸加速計意味著它能夠檢測到三維空間中的運動或重力引力。加速計可以測量重力(引力)g,如果模組靜止而沒有任何動作,地球引力對其施加的力大約為 1g;如果模組豎直放置,會檢測到 Y 軸上施加的力約為 1g。如果模組以一定角度放置,會檢測到 1g 的力會分佈在不同的軸上。

當模組在三維空間中運動或振動時,Me 陀螺儀會在一個或多個軸上檢測到大於 1g 的力並測量出加速度,對加速度積分可以獲得速度和位移。當物體繞軸旋轉時會產生角速度,Me 陀螺儀能夠檢測 X、Y、Z 軸的角速度變化量;運動處理引擎通過 I2C 埠直接輸出資料,可以減輕週邊微處理器的工作負擔並且避免了繁瑣的濾波和資料融合。

因此,我們在應用時,只需要通常簡易的計算,就可以使用了。

Me 2.2吋 TFT 液晶屏(Me TFT LCD Screen – 2.2 Inch)

除了 Me 陀螺儀外,我也用了 Me 2.2吋 TFT 液晶屏來模擬水平儀上的水珠的走動。Me 2.2吋 TFT 液晶屏的螢幕解析度為 320 寬 x 240 高,和 mBlock 的背景舞台不同,Me 2.2吋 TFT 液晶屏的起始點(0, 0)在螢幕的左上方,而非在螢幕的正中央,因此我們待會需要做一些換算,才能正常顯示。

組裝


水平儀是一個可攜帶的裝置,因此我使用了鋰充電池取代 AA 電池,同時,我也使用了鋰充電池盒安裝在 mCore 的底部,也方便作為量度時的定點。另外,安裝 Me 陀螺儀時亦要注意水平地安裝,以減少量度時出現的誤差。另外,組裝時需注意 Me 陀螺儀的方向,箭咀指向的方向是代表該座標數值的減少,留意清楚才能配合在 Me 2.2吋 TFT 液晶屏的顯示。


連接埠方面,我使用了連接埠 1 連接 Me 2.2吋 TFT 液晶屏,而 Me 陀螺儀並無指定的連接埠,因此我選擇了連接埠 4。而為了方便使用,不宜使用太長的 RJ25 連接線。

編程

Me 陀螺儀會回傳 X、Y、Z 軸的角度,根據我的組裝,X、Y、Z 軸的改變會像這個情況:


X、Y 軸的回傳數值由 -90 至 90,而 Z 軸的回傳數值則由 -180 至 180,但由於我們只量度水平狀況,所以 Z 軸的數值我們並未有使用。

然後,我們需要按 X、Y 軸的數值換成螢幕上的寬和高:


很多學生雖然懂得乘法、除法、分數甚至比例,但都未能將 X、Y 軸的數值按比例地換成螢幕上的寬和高。X 軸的角度不斷增加時,寬的座標就會不斷減少;而 Y 軸的角度不斷增加時,高的座標就會不斷增加。

這時我們發現 Y 軸的變化是一個正比,會比較容易處理,我們可以將高的一半 120 分成 90 份,然後再乘以 Y 軸的角度,最後加上高的一半,即是 120,就能成功按照高的比例增加 y Y 座標的數值。由於 Y 軸的角度可以是負數,加上 120 後就會少於 120,符合正常的情況。mBlock 的積木就如下圖所示,其中的「Height-M」就是高的一半,而「Y-Angle」就是 Y 軸的角度:


而 X 軸的變化則是一個反比,和 Y 軸相同,我們先把寬的一半 160 分成 90 份,然後再乘以 X 軸的角度,但在最後,我們把它減去寬的一半。這個做法會首先將 X 軸的角度按寬的比例變化,然後減去寬的一半,就能讓它們將最少值減到 -320,最後只要取得座標的絕對值,讓負數變回正數,正數不變,就能取得正確的 X 座標。mBlock 的積木就如下圖所示,其中的「Width-M」就是寬的一半,而「X-Angle」就是 X 軸的角度:


完整的 mBlock 程式如下:


一開始我慣常把一些恆常數值放在變數,之後取得 Me 陀螺儀的 X、Y、Z 軸的角度,值得注意的地方是,使用 Me 陀螺儀的 mBlock 積木是不需要選擇連接埠的。之後我會清除 Me 2.2吋 TFT 液晶屏上的內容,我選擇在迴圈當中清除,是因為 Me 2.2吋 TFT 液晶屏的積木可以讓它不斷在 Me 2.2吋 TFT 液晶屏上增加內容,如果不在迴圈中清除,將會看見模擬水泡的殘影。

之後,繪畫了兩條紅線來定義正中央的位置,當模擬水泡在兩條紅線的交叉點時,代表水平儀在水平狀態,最後在計算出來的座標上畫上一個綠色圓點代表模擬水泡。我刻意在每次迴圈結束前,讓它等待 0.1 秒,讓它減慢畫面閃爍的頻率,亦不減慢畫面更新的速度。

測試結果


沒有留言:

張貼留言