Arduino 自走車教學系列 – 單元(三)循線與避障

一、前言

相信大家閱讀完單元(二)後都已經相當熟悉自走車的移動控制,接下來就讓我們增加一些功能到自走車上,這個單元我們將會增加「循線」與「避障」這兩個常見的功能。話不多說,我們就從循線感測器開始吧!

二、增加循線功能

1. 安裝循線感測器

a. 首先準備我們的自走車,並拿取「循線感測器 x2」、「M3 x8mm 螺絲 x4」與「3cm雙母金屬銅柱 x2」。

若是發現感測器訊號太強,我們可以改用「M3 六角細牙銅柱10mm x4」兩個兩個一組組合成兩支20mm的銅柱來使用,讓感測器離地面遠一點。

Arduino 自走車教學系列 - 單元(三)循線與避障

b. 將銅柱與感測器利用螺絲安裝在一起。

Arduino 自走車教學系列 - 單元(三)循線與避障

c. 將組裝好的感測器與銅柱,依照下圖所示用螺絲安裝在車板前端,位置在靠近前端的橫向溝槽。安裝時請讓兩個感測器保持一些距離(1~3mm左右)。

Arduino 自走車教學系列 - 單元(三)循線與避障

d. 由底部觀看如下圖所示:

Arduino 自走車教學系列 - 單元(三)循線與避障

e. 接著拿取「杜邦雙母連接線 x6」,一個感測器需要3條杜邦連接線,連接方式如下表所示:

Arduino 自走車教學系列 - 單元(三)循線與避障

f. 實際在擴充板的位置圖如下:

Arduino 自走車教學系列 - 單元(三)循線與避障

2. 循線感測器運作原理

循線感測器是由一個紅外線發射器,與一個紅外線接收器所組成。當正常供電時紅外線發射器會不停的發射紅外線,當紅外線經過物體表面會有二種情形:

● 第一種:絕大部份的紅外線經由表面反射。

● 第二種:絕大部份的紅外線經由表面吸收,極少部份反射。

當大部分的紅外線經由反射,被紅外線接收器接收到時,感測器電路會發送一個訊號給 Arduino UNO,訊號為 1。

若是表面會吸收紅外線,或是表面較不平整,導致朝不同方向反射,只有極少部份的反射紅外線被紅外線接收器接收到,但因為能量太少,所以就像沒收到一樣,此時感測器電路會發送一個訊號給 Arduino UNO,訊號為0。

小知識

只會發送 0 與 1 訊號的感測器,我們稱為數位類型的感測器。

如上圖所示,一般白色的表面較黑色的表面易反射大部份的紅外線,所以循線的自走車通常都是沿著白底黑線跑,或是黑底白線,藉由循線感測器可以讓 Arduino UNO 感測到黑與白的區別。說到這,大家是不是發現自走車沿著黑線走的秘密了呢?

3. 循線過程會遇到的情況

以白底黑線為例,自走車會遭遇的情況有下列四種,我們以「黃色和藍色表示左邊與右邊的循線感測器」,經由兩個感測器分別在黑線上的位置會有四種情況。

Arduino 自走車教學系列 - 單元(三)循線與避障

● 狀態 1:兩個感測器都在黑線內(左側感測器讀值:0,右側感測器讀值:0)。

● 狀態 2:左側感測器跑出黑線外(左側感測器讀值:1,右側感測器讀值:0)。

● 狀態 3:右側感測器跑出黑線外(左側感測器讀值:0,右側感測器讀值:1)。

● 狀態 4:兩個感測器跑出黑線外(左側感測器讀值:1,右側感測器讀值:1)。

當我們知道自走車在循線時會遭遇的情況,就能依照各個情況下達程式指令,例如當面臨狀態 2(自走車向左邊偏移時),我們就能透過程式控制車子向右邊移動,讓車子回到黑線上面。若是遇到狀態 1(自走車在黑線正上方),我們就能下達前進的指令,讓自走車繼續向前移動。

4. 循線功能程式撰寫

我們以上個單元的移動程式作衍伸,因為我們使用的循線感測器是「數位類型」的感測器,所以在讀取上需要選擇「讀取數位引腳」。編號的部份因為是連接在 A0 與 A1,轉換成數位腳位編號的話則是 14 與 15,所以請在引腳欄位填上 14 或 15。

Arduino 自走車教學系列 - 單元(三)循線與避障

透過「運算」欄位內的「等於」、「且」兩個比較邏輯的程式,可以幫助我們設定感測器的四種狀態。

Arduino 自走車教學系列 - 單元(三)循線與避障

關於四種狀態的程式撰寫如下圖所示:

Arduino 自走車教學系列 - 單元(三)循線與避障

接著從「控制」欄位內選擇「如果…否則…」這個程式,這個程式能幫助我們設定當遭遇何種狀況時,所要執行的動作。

Arduino 自走車教學系列 - 單元(三)循線與避障

將「如果…否則…」與四種情況組合完成後如下圖所示:

Arduino 自走車教學系列 - 單元(三)循線與避障

接下來依照不同情況填入控制車子的程式。

Arduino 自走車教學系列 - 單元(三)循線與避障

將撰寫好的程式,依照上個單元的教學步驟燒錄到 Arduino UNO 上,並在空曠的地上黏貼 3cm 寬的黑色膠帶路線試試看,自走車是不是沿著黑線移動呢?

若是發現感測器訊號太強,碰到黑線都沒變化,我們可以改用「M3 六角細牙銅柱10mm x4」兩個兩個一組組合成兩支20mm的銅柱來使用,讓感測器離地面遠一點。

5. 如何使循線前進變得更順暢

雖然依照上述的程式已經可以循線了,但移動的過程中,車子搖頭晃腦的修正路線,看起來就是有點卡。

● 修正方法 1

我們能透過修正馬達轉彎方式來改進這個問題,沒錯!請調整左轉與右轉的方式。

如下圖,這是我們原先的過彎方式,一個輪子前進,另一個輪子後退。在修正路線的過程中,因為圓心在兩個輪子中央,所以車子基本上就是定在原地做修正,所帶來的效果就是修正完路線才會再前進,這就是跑起來不順暢的原因。

Arduino 自走車教學系列 - 單元(三)循線與避障

所以我們可以將轉彎的方式換成,一個輪子前進,另一個輪子不動。在修正路線的過程中,不動的輪子就像畫圓規時的定點一樣,修正的工作就交給前進的輪子,優點是修正的過程中車子依舊是朝前方移動,而不是停在原地。如下圖所示:

Arduino 自走車教學系列 - 單元(三)循線與避障

● 修正方法 2

車子經由「修正方法 1」跑起來已是相當順暢,但若是車速過快,或是面臨急彎,還是會不時「後退」回到線上,此時可以拿掉後退,正確來說應該是拿掉第四種情況的應對程式,再重新燒錄程式到 Arduino 上,就會發現車子好像跑的更順了喔,沒錯!拿掉「第四種情況」,修正後的程式如下圖所示:

Arduino 自走車教學系列 - 單元(三)循線與避障

至於為什麼這樣能讓車子跑得更順,就留給大家思考。其實不難理解,與程式邏輯有關,大家可以觀察看看當車子兩個感測器都跑出去黑線時,自走車後續的動作,並搭配上面的程式動動腦。

三、增加避障功能

1. 安裝超音波距離感測器

a. 首先準備「超音波距離感測器」與「超音波固定支架」。

Arduino 自走車教學系列 - 單元(三)循線與避障

b. 拆卸固定循線感測器的銅柱與車板上的螺絲。

Arduino 自走車教學系列 - 單元(三)循線與避障

c. 將支架置於車板上,再用螺絲穿過支架→車板→銅柱,用螺絲起子固定。

Arduino 自走車教學系列 - 單元(三)循線與避障

d. 從另一個方向觀看如下圖:

Arduino 自走車教學系列 - 單元(三)循線與避障

e. 接著將超音波感測器的發射與接收管,直接卡在支架上。

小提醒

因為超音波感測器的做工多少都會有誤差,有些可以巧妙的卡住,有些較易脫落,不妨可以點些熱熔膠稍微固定。
Arduino 自走車教學系列 - 單元(三)循線與避障

f. 接著拿取「杜邦雙母連接線 x4」,連接方式如下表所示:

Arduino 自走車教學系列 - 單元(三)循線與避障

g. 實際在擴充板的位置圖如下:

Arduino 自走車教學系列 - 單元(三)循線與避障

2. 超音波距離感測器運作原理

超音波距離感測器與循線感測器很像,都是有一個發射(T),一個接收(R)。當供電時,發射端會開始發送超音波,當發射出去的超音波撞到物體便會反射回來,接收器接收到回來的超音波後,便會依照發射出去到接收回來的時間作為依據並計算距離。

Arduino 自走車教學系列 - 單元(三)循線與避障

小提醒

每個超音波模組都有自己的量測範圍,例如常見的 HC-SR04 這個型號的感測器,量測範圍在 2cm~450cm 之間。

3. 避障功能程式撰寫

在「感測器」欄位內有個「超音波距離感測器…」的程式,這個程式會自動幫我們計算偵測到的距離,會以數字表示並且單位是公分,若遇上偵測失敗的情況時,感測器會傳送 0。請將程式拉出,並依照我們連接的腳位填入 11 與 12。

Arduino 自走車教學系列 - 單元(三)循線與避障

小提醒

除了太近或太遠,導致不在偵測的範圍內之外,若物體無法使超音波正確反射,例如不規則面或是剛好打在稜角上,物體過小也是原因之一,都會產生讓超音波無法回到接收端的情況。

我們在避障的流程上,會設定一個距離,例如我們以 15cm 來看,當偵測到的距離大過我們設定的距離時,表示前方沒有障礙物,反之當偵測到的距離小於設定距離時,我們就得下達閃避或是停止的指令給自走車。

Arduino 自走車教學系列 - 單元(三)循線與避障

正常來說這樣撰寫就沒有問題了,但難免會遭遇偵測不到,誤判的狀況,所以在偵測條件上,我們需要再加上大於 0 這個條件,如下圖所示:

Arduino 自走車教學系列 - 單元(三)循線與避障

完整判斷的寫法如下圖所示,當偵測到的距離小於 15 並大於 0 的情況,我們就能正確下達閃避或停止的指令,避免只是前方毫無障礙物,導致感測器收不到反射的超音波,讀值為 0 的情況。

Arduino 自走車教學系列 - 單元(三)循線與避障

4. 避障功能整合循線功能

接下來我們將避障的功能,加入到我們之前的循線程式。在判斷次序上,我們習慣以避障為優先,當前方毫無障礙時,才執行循線的功能。

為了讓程式可讀性增加,方便我們除錯,建議可以把循線的程式包成自訂積木。

Arduino 自走車教學系列 - 單元(三)循線與避障

包成自訂積木後使用起來就比較簡潔,如下圖:

接著就將超音波避障的功能加入到程式內,依照剛才說的流程,先檢測超音波,當有障礙物時可做出相對應的動作,沒有時則繼續循線。

Arduino 自走車教學系列 - 單元(三)循線與避障

遇到障礙物後的程式寫法,可以依照大家的情況設定,文章示範會以停止馬達轉動,作為小車遭遇障礙物時的判斷。

Arduino 自走車教學系列 - 單元(三)循線與避障

完成的程式如下圖所示:

Arduino 自走車教學系列 - 單元(三)循線與避障

最後將程式燒錄到 Arduino UNO,在循線的過程中試著遮擋自走車,觀察看看是否在障礙物前確實停止移動。

四、結語

這是我們自走車系列的最後一個單元,從組裝、馬達控制、循線、改善移動到結合避障,將自走車最經典的兩個主題學了一遍。大家可以依照自己的情況修正程式碼,例如將避障的判斷程式修正成閃避的功能,或是在循線的過程中,加入判斷斷線的部份該如何動作,全憑自己發揮。

喜歡我們文章的夥伴們,請幫我們多多分享,並且持續關注我們喔!