這個角度變化速率就是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)
沒有留言:
張貼留言
探奇歡迎大家留言討論!謝謝分享你的意見。