2015-07-11

EV3 程式教學 25 馬達漸進加速 Ramp Up



控制NXT或EV3樂高機器人的運動時,我們都習慣直接設定馬達的馬力Power,當設定為100時,馬達便會以100%的電力轉動。

(想像一下,如果坐在靜止(時速為零)的汽車上,突然加速到時速100公里,你會因為牛頓的慣性定律,往後跌坐在椅子上。)

不過這種方式的轉動會使馬達從靜止瞬間加速。在某些情況下,機器人可能因為馬達輪胎瞬間高速旋轉,造成摩擦力不平均,機器人會偏斜。若是機器人正在搬運物品,也有可能掉落。


為了預防這種狀況發生,我們希望機器人馬達(輪胎)的轉動是溫和的漸進加速。



在NXT-G裡面的Motor命令有這種Ramp Up及Ramp Down的選項。EV3軟體取消了這些選項,所以我們必須自行撰寫程式,模擬漸進加速的功能。

首先想到的當然是調整馬達馬力,從0開始上升到100,我們可以使用一個變數Variable,在迴圈裡每次加一,將變數數值透過資料線傳送到馬達命令的馬力值。

下面是簡單範例:


設定一個變數Ramp,迴圈內變數加一,間隔0.05秒,迴圈以次數Count控制,次數設為100,程式跳出迴圈後,發出音樂聲。我們可以看到馬達漸漸越轉越快。

在探奇的EV3小品教學中,曾經提到Loop Index,它是迴圈循環的次數,每次做完迴圈內的命令就會增加一次。善加利用這個索引值,就能省掉加法計算的命令。簡單範例如下:


別忘了迴圈索引數值是從零開始計數,也就是第一次執行迴圈內部的命令時,Index=0。

馬達開始慢慢加速了嗎?

接下來請想一想,如何讓馬達漸漸減速呢?

最直接的想法就是馬力從100減到0。可是Index是往上加的。這時就需要數學運算的幫忙。

Index 0 --> Power 100
Index 1 --> Power  99
Index 2 --> Power  98
Index 3 --> Power  97
........
Index 99 --> Power 1
Index 100 --> Power 0

看到了嗎?可以用100減掉Index數值,簡單範例如下:


先將馬達以馬力100轉動,然後你的馬達會漸漸減速停止。第一個命令需要調整Brake at End:False,否則馬達會頓一下。

上面的範例是單馬達旋轉,你可以將之修改為Move,控制兩顆馬達,如此機器人就能漸進加速前進了。

祝你成功,下次上課見!


延伸閱讀:

EV3 程式教學20 - Loop Index



6 則留言:

  1. 邱老師您好,我想試著Diy ev3的color sensor ,小弟只有購買一組31131 mindstrom 機器人套件,
    常常因為感測器不夠使用,無法製作更複雜動作的機器人,Lego原廠的感應器又貴森森,
    不知道老師這邊是否有相關的電子零件配線資料? Arduino的超音波感測器套件是否能夠給EV3使用呢?

    回覆刪除
    回覆
    1. 你好:
      探奇文章:LEGO 官方的 EV3 技術資料http://touchclassroom.blogspot.tw/2015/03/lego-ev3.html
      有硬體線路圖,可以參考製作。
      EV3使用Arduino的感應器,有兩個條件,
      1. 硬體線路配合,你可以參考六芯線的訊號規範。
      2. 軟體配合,你需要自行撰寫配合的程式庫,或是利用他人的程式庫開發。
      祝你順利!

      刪除
    2. 以下是個人淺見:
      關於 EV3 或 NXT 要使用自製感應器比較簡單的方式是透過 Arduino 或 RPi控制板作為 EV3 的 I2C slave, 由 EV3 送出請求給 Arduino 去讀取感應器資料, 再回傳給 EV3, 這樣可以省掉許多處理 電子信號與EV3 端 API 的功夫.

      刪除
    3. CH Chen的建議也是一種方式,不過機器人就得背著一塊Arduino在身上。^^

      刪除
  2. 若使用on指令的馬達方塊他不是並無轉速同步功能,所以若是做加速與減速過程中可能會偏一邊,若是一顆馬達當然無此問題!但是兩顆馬達就會有轉速上的差異,所以車還是會偏一邊走囉!?

    回覆刪除
    回覆
    1. 馬達轉速一定有差異。你可以實際使用Move指令測試。
      至於偏一邊的問題,除了輪胎摩擦力,還有很多車體設計等因素。
      當然也可以想辦法加上角度控制,讓兩邊輪胎轉動誤差少一點。
      祝你成功!

      刪除

探奇歡迎大家留言討論!謝謝分享你的意見。