之前我們已經學會了控制車子的「移動」,
如何讓輪子前進、後退、左轉、右轉。
這篇要教大家如何使用 頭部紅外線 功能,
用S4A做出自走車!
讓車子可以自行判斷距離,
而不會撞到牆喔!
趕快看下去吧!
(贊助商連結)
首先我們來看一下完整的程式要怎麼寫,
大家可以先挑戰做做看,
或者後面看我們一步步的解說~
功能分析
首先來分析一下我們希望的功能:
1. 車子會不斷直走,直到碰到前方障礙。
2. 碰到障礙時,會停下來。
3. 停下後,會左右擺頭,判斷距離。
4. 判斷完距離後,先後退。
5. 若左邊距離比較長,我們就往左轉。
6. 若右邊距離比較長,我們就往右轉。
7. 重複1-6的動作。
根據上面的功能,現在來設計程式。
認識車子部位
首先來認識一下所需要用到的【馬達】跟【感應器】。
輪胎連接的 兩顆馬達 ,分別對應到motor4(左輪) 跟 motor7(右輪)。
為什麼是4號跟7號呢?
是因為左、右輪胎的接線是接到這兩個位置,
若線接不同位置腳位,控制的馬達也會改變喔!
這些之後都會介紹,這邊先略過。

控制頭部的是motor8(前方藍色馬達)。
最後紅外線感應器,對應到的是Analog3 (類比訊號)。

連線後,若機器人離障礙物越近,
Analog3顯示的數字就越大,
若離障礙物越遠,
Analog3顯示的數字就越小。
正式開始前我們再做兩件事情
1. 頭部位置校正
拉出【motor 8 angle 180】積木:
把angle設為90度。
90度理論上是像著正前方,
若頭歪掉了,請手動幫它轉向正前方。
接下來也可以試試下面的積木指令:
【motor 8 angle 0】
【motor 8 angle 180】
下面是頭部角度示意圖,
大家可以試試看,
機器人的頭會左、右轉喔!
2. 讓機器人停下來
再來,我們來作「一鍵停止全部動作」的功能按鍵。
拉出【當按下空白鍵】
接上【motor4 off】【motor7 off】【motor8 angle 90】
接上【全部停止】
現在無論發生甚麼事,只要按下空白鍵,
就能暫停全部的馬達囉!
機器人自走車實作
步驟一、
功能說明:
先點一下綠旗觸發程式,
接下來把機器人的頭擺正。
最後進入到主程式,不斷地跑我們寫的程式。
動手做:
拉出【當綠旗被點一下】
接上【motor 8 angle 90】
接上【重複執行】
步驟二、
功能說明:
如果 前方出現障礙物,
就停下來做「左右距離」判斷,
然後再決定左、右轉。
如果前方沒有障礙物,
就讓機器人一直往前走。
我們用Analog3傳回的數值來偵測前方障礙物的距離。
Analog3的數值越大,代表與障礙物的距離越近。
若Analog3的數值大於275,
則停下來做距離判斷。
這邊的275參數可以自己調整,
若希望機器人遠一點就作距離判斷,
那就把數值調小,可改成250、225等。
若希望近一點再停下作判斷,
可以把數值調大,如300、325等。
動手做:
拉出【如果...否則...】
在【如果】條件內
插入【【value of sensor Analog3】>275】
在【否則】內
插入【motor 4 direction anticlockwise】
接上【motor 7 direction clockwise】
步驟三、
功能說明:
步驟二的程式嵌入到【重覆執行】中,
讓機器人不斷確認前方距離,
若遇到障礙(Analog3>275)則做距離判斷,
若前方還有空間,則繼續直走。
動手做:
把【如果...否則】插入到【重複執行】
步驟四、
功能說明:
若距離過近(Analog3>275),
先讓車子停下來作距離判斷。
動手做:
拉出【motor 4 off】
接上【motor 7 off】
motor4 跟 motor7順序可以相反沒關係。
步驟五、
功能說明:
嵌入步驟四的程式碼。
讓機器人一旦碰到障礙物,
就先停止動作。
動手做:
【如果 【【value of sensor Analog3】>275】】裡面。
步驟六、
功能說明:
接下來,我們要設計兩個變數,
【Left】跟【Right】。
這兩個變數是用來儲存左邊跟右邊的距離,
為什麼需要知道左、右邊的距離呢?
想像自己是一台機器人,
當我們往右看的時候,我們需要一個變數,
讓我們記住右邊看到的距離。
之後往左看,我們需要另外一個變數,
幫助我們記住左邊的距離。
如此,我們就知道兩邊的距離長短,
於是就可以作出左、右轉的決定。
所以我們先讓機器人的頭往右轉,
並讓把紅外線的距離數值存到【Right】當中。
然後讓機器人的頭往左轉,
把左邊的數值也存入【Left】當中。
如此一來,機器人就知道左右邊的距離遠近了!
動手做:
左上角點選【變數】
滑鼠點選【產生一個變數】
動手做:
輸入變數名稱,取名【Left】,
然後選擇【適用所有角色】。
最後按【確定】。
動手做:
重複上述步驟,
左上角點選【變數】
滑鼠點選【產生一個變數】
輸入變數名稱,取名【Right】,
然後選擇【適用所有角色】。
最後按【確定】。
完成後,畫面會跟下面一樣。
動手做:
拉出【將變數 Left的值設為0】
拉出【value of sensor Analog3】
把【value of sensor Analog3】插入到
【將變數 Left的值設為0】當中
動手做:
【Left】變數設定完後,換【Right】。
步驟七、
功能說明:
接下來,要讓機器人頭往右前方偏,
等待一秒後,
把紅外線偵測到的值儲存進變數【Right】當中。
動手做:
拉出【motor 8 angle 180】
把angle180改成45
接上【等待1秒】
接上【將變數Right的值設為【value of senosr Analog3】】
接上【等待1秒】
步驟八、
功能說明:
接下來,要讓機器人頭往左前方偏,
等待一秒後,
把紅外線偵測到的值儲存進變數【Left】當中。
動手做:
拉出【motor 8 angle 180】
把angle180改成135
接上【等待1秒】
接上【將變數Left的值設為【value of senosr Analog3】】
接上【等待1秒】
步驟九、
功能說明:
把上面的積木合併,
讓機器人先頭往右轉、存入距離數值後,
再往左轉、存入數值。
最後,讓頭朝前。
動手做:
拉出【motor 8 angle 180】
把180改成90
連接上面的積木如下圖
最後再接上【motor 8 angle 90】
步驟十、
功能說明:
嵌入上面程式碼,
完成後,機器人就會不斷向前,
若遇到障礙物,會停下來偵測左右距離,
並把偵測到的距離存入到變數【Left】跟【Right】當中。
動手做:
嵌入上述程式碼如圖。
步驟十一、
功能說明:
我們現在已經知道左、右邊的距離了,
現在要讓機器人判斷完距離後,左轉或右轉。
這裡要加入一個條件判斷,
若【Right】變數大於【Left】,
代表右邊空間小、左邊空間大,
所以先後退,再左轉。
否則,代表【Right】小於或等於【Left】,
代表左邊空間小、右邊空間大,
所以先後退,再右轉。
動手做:
拉出【如果...否則】
插入【【Right】>【Left】】
步驟十二、
功能說明:
若判斷完,【Right】>【Left】後,
這邊我們希望車子先後退、再左轉,
所以先讓左輪(motor4)順時針轉、
右輪(motor7)逆時針轉。
然後再同時順時針轉,
動手做:
拉出【motor4 direction clockwise】
接上【motor7 direction anticlockwise】
接上【等待1秒】
把1秒,改成0.5秒
拉出【motor4 direction clockwise】
接上【motor7 direction clockwise】
接上【等待1秒】
把1秒,改成0.4秒
連結兩個積木程式。
步驟十三、
功能說明:
判斷完左、右邊的空間距離後,
若【Right】變數沒有大於【Left】變數,
則代表右邊空間比較大(或者相等),
所以我們就寫程式讓車子先後退、再右轉。
動手做:
拉出【motor4 direction clockwise】
接上【motor7 direction anticlockwise】
接上【等待1秒】
把1秒,改成0.5秒
拉出【motor4 direction anticlockwise】
接上【motor7 direction anticlockwise】
接上【等待1秒】
把1秒,改成0.4秒
連結兩個積木程式。
步驟十四、
功能說明:
把左、右轉的積木程式嵌入到判斷式當中。
動手做:
左轉程式碼嵌入到 【如果【【Right】>【Left】】】區塊。
右轉程式碼嵌入到【否則】區塊。
步驟十五、
功能說明:
S4A因為圖形化而讓使用者更容易上手,
但也因為這樣,所以相當耗電腦CPU資源,
簡單來說,有時候會當機。
為了避免發生這樣的情況,
讓機器人左、右轉完後,
停一下再前進,
就能降低當機的機率。
動手做:
拉出【motor4 off】
接上【motor7 off】
接上【等待0.3秒】
把以上積木接在條件式下面,如下圖。
步驟十六、
功能說明:
完成我們的機器自走車,
動手做:
嵌入上圖程式碼至下圖位置。
終於完成了,
趕快來看看實際走起來的狀況如何吧!
是不是很有趣呢?
上面的程式不是唯一的寫法,
很多參數都可以調整,可以試著改改看,
看看有甚麼不一樣的效果喔!
趕快來試試看吧!
喜歡我們的 文章嗎 ?
歡迎關注我們的粉絲團唷→ 親子Fun程式
若無法配合附上以上資訊,請勿轉載文章。謝謝~
(本文為CMaker專欄作者編寫 , 歡迎轉載,請同時附上CMoney本站完整名稱與網址。)
發表
我的網誌