2015-03-14

『EV3 小品程式教學』EV3 角度感應器 - 神奇觸碰

今天的EV3小品程式教學要告訴大家角度感應器 Rotation Sensor 的應用。

角度感應器在EV3馬達內,可以利用作為馬達轉動角度的控制。在EV3軟體中還提供角度變化速率,我們不用辛苦撰寫程式計算每秒鐘角度感應器偵測角度的差異。

這個角度變化速率就是Current Power Level,英文名稱容易誤導大家,簡單的說就是:當我們指定EV3馬達的馬力值,EV3主機會自行調整電力輸出,讓馬達旋轉並且維持在一定的轉動速率,所以EV3主機會不斷地監測角度感應器數值,計算出馬達旋轉速率所相對應的馬力數值,這就是Current Power Level。

如果Current Power Level比設定的馬達馬力數值低,表示遇到阻礙,馬達轉動變慢;相反的如果太高,表示遇到助力,馬達旋轉變快。

我們可以利用這個Current Power Level的特性,偵測機器人是否撞到牆壁。過去有人稱之為隱形觸碰。

請看下面的等待命令方塊,Wait for Motor Rotation, 針對Current Power的比較。


先撰寫第一個程式PowerTest1,

首先如果設定馬力值40,讓C馬達轉動,馬力值設定為等待0.2秒,讓馬達維持在一定的轉速,接著等待C馬達的角度感應器,它的旋轉速率所換算的目前馬力設定值(Current Power Level)如果小於39,表示機器人遇到阻礙物,馬達轉動變慢。於是下令讓馬達停止,並且發出聲音。

程式如下圖:


接著是第二個程式 DisplayPower1,

 將Current Power Level 的數值,以及每隔一秒的角度差異(角度旋轉速度)同時顯示在EV3主機螢幕上。程式如下圖:


結果請看下圖:一般穩定狀態的對應馬力值為40,自行計算的角度速度為408。


用手阻擋馬達,Current Power Level隨即下降,自行計算角度速度似乎差不多,或許是顯示上的反應比較慢。


用手阻擋馬達旋轉後,馬達需要快速反應,加大馬力輸出,於是有時會出現超高數值。


另外一種使用的方法就是Change模式,等待的條件變成『當 Current Power Level 下降的數值大於3』,例如原本是40,如果下降到37,就符合條件。


綜合上面兩種Wait for Motor Rotation的用法,我們製作一台EV3三輪車,使用B+C馬達控制機器人。

任務A:程式 RunStop 1


動作跟PowerTest1很像,我們只偵測C馬達的角度感應器,效果不錯!


任務B:程式 RunStop 2


動作跟任務A相同,增加顯示C馬達角度感應器的Current Power Level數值。機器人不論輪胎空轉(無負載)或是放在地板運動(有負載),都能維持 Current Power Level在40。不用擔心負載的問題。

任務C:程式 RunStop 3


最後讓機器人遇到阻礙時,自動後退轉彎,連續行走。

請看示範測試影片:



有了 Current Power Level 功能,機器人馬達遇到障礙物,負載過大,或是運動機構的死點(Dead Point),都能偵測,加以做出相對適當的處理。不論是機器人撞到牆壁的情況,或是夾爪張開合起的狀態,都能保護馬達的運轉。真是方便好用的功能。

可惜在NXT主機上無法正常使用這個 Current Power Level 功能,必須自行撰寫程式讀取角度變化值再加以判斷。

最後想到一點,既然EV3主機控制馬達使用這種 Regular 方式穩定維持馬答的轉速,那麼在不同的電池電壓情況下(滿電高電壓與沒電低電壓),是否依然能保持最佳的穩定旋轉狀態呢?

如果上述的答案是肯定的,機器人馬達以時間秒數控制轉動,例如一秒鐘,在不同電壓下,會有相同的轉動角度嗎?(機器人前進同樣的距離嗎?)這點還需要再尋找答案。

歡迎討論。

延伸閱讀:

CH先生的文章:兩種EV3馬達「Power Level設定」與「輸出轉速」之間的關聯測試

Danny 書籍的Google連結:The LEGO MINDSTORMS EV3 Laboratory)