去探索吧小怪獸!
文/鮑惟聖
加裝LED與紅外線感測器
現在「小怪獸」已經可以靈活的動作了,來一段有趣的舞蹈也是不難事。前面有提到我們想替「小怪獸」裝二個LED與紅外線感測器(圖A),讓它看起來更酷更聰明,現在就繼續努力吧!
圖A
首先介紹元件工作原理,大家可以對照之前SC8接線安裝圖。LED有二隻腳,長腳為正極,短腳為負極。長腳串接一個220歐姆的 電阻到5V,電阻的色碼為紅紅棕。LED的短腳再分別接到數位輸入輸出腳P0與P6。P0與P6的選擇是為了方便LED安裝在左右兩邊,沒有其他考量。再 來就是安裝紅外線發射器。這裡所使用到的就是一個紅外線LED,顧名思義,它也是一個LED。只不過發射出來的是不可見的紅外線,所以對LED的描述也適 用。這裡我們把它接到P2。紅外線接收器是一個三隻腳的元件,我這裡使用的編號為FM-9038LM-5AN。分別為正、負電源以及輸出腳。正、負電源就 分別接到5V以及GND,輸出腳則接到P4腳。紅外線LED與紅外線接收器同樣面向前方,但是紅外線會從LED側面散出,而被紅外線接收器收到,造成誤認 前方有障礙物。為避免紅外線散出,這裏使用了膠套將紅外線LED包起來,僅允許從前方發射紅外線出去。各位手邊沒有適用的膠套,則可以使用黑色電工膠帶將 LED纏繞,僅留前方開口即可。目前使用到的P0、P2、P6都是做輸出使用,只有p4是做輸入使用。(圖A)為了方便辨識,特別將須接到5V的線路選用 紅色線材,須接到GND的線路選用黑色線材,須接到各I/O接腳的線路選用黃色線材。實際接線時要注意避免金屬部分碰觸造成短路,所以電工膠帶或是塑膠套 管都是需要的。
雖然線路是相同的,但每一個人實際的接線看起來都會不太一樣,美醜就看每個人的藝術細胞有多少啦。我給每隻腳套上紅色的熱縮套管,再加熱使其收縮而不會掉落,穿上四隻小紅鞋看起來還很有造型,而且還有防滑的功效呢,希望對我的藝術細胞有加分作用,完成品請看(圖B)。
圖B
「小怪獸探索」的程式
現在開始要把感測器的輸入與動作結合,前面的程式只是練習題,現在才是正式開始撰寫「小怪獸探索」程式。這裡先介紹一下「小怪獸」的行為模式。開啟電源後「小怪獸」會先點亮LED雙眼,維持標準站姿五秒。接著做兩個「伏地挺身」暖身一下準備出發。
「小 怪獸」會隨時測量前方是否有障礙物,LED雙眼也保持每秒明滅一次的速度眨眼。一旦發現障礙物則停止前進,然後原地左轉,再次測量前方是否有障礙物,這段 期間LED雙眼以兩倍的速度明滅,讓它看起來很焦慮的樣子。如果前方依舊測量到有障礙物,則持續作左轉測量的動作,直到障礙物消失,然後繼續前進,LED 雙眼也恢復每秒明滅一次的眨眼速度。這裡的障礙物偵測距離大概是30公分,調整偵測距離的方法以後有機會再來介紹。
以下就是程式原始碼,後面有註解說明。此程式只使用到幾個副程序,提高程式閱讀性,方便入門者了解程式控制之原理。等到熟悉相關程式技巧後,可以嘗試更結構化的程式架構,以減少程式行數、提高執行效率,增加程式維護、修改的彈性。
‘—————————————————
‘ 小怪獸探索程式
‘—————————————————
Peripheral mySer As ServoRunner8A @ 0 ‘ 預設內建模組ID為0
Sub OpenEyes()
Low 0 ‘ 點亮左眼LED
Low 6 ‘ 點亮右眼LED
End Sub
Sub CloseEyes()
High 0 ‘ 熄滅左眼LED
High 6 ‘ 熄滅右眼LED
End Sub
Sub RunFrame(ID As Byte)
Myser.LoadFrame(ID) ‘ 載入編號ID的動作
Myser.Runallservo() ‘ 執行載入的動作
Pause 150 ‘ 等待伺服機完成動作(每秒4步)
End Sub
Sub Main()
Dim IR As Byte ‘ 宣告變數
‘—————————————————
‘ 點亮左右眼LED以及初始立正姿勢
‘—————————————————
OpenEyes() ‘ 點亮雙眼LED
RunFrame(0) ‘ 呼叫程序執行編號0動作
Pause 5000 ‘ 等待5秒才開始動作
‘—————————————————
‘ 伏地挺身二次
‘—————————————————
RunFrame(1) ‘ 呼叫程序執行編號1動作
RunFrame(0) ‘ 呼叫程序執行編號0動作
RunFrame(1) ‘ 呼叫程序執行編號1動作
RunFrame(0) ‘ 呼叫程序執行編號0動作
Pause 2000 ‘ 等待2秒才開始出發
‘—————————————————
‘ 程式主循環
‘—————————————————
Do
Sound(2, 5, 38400) ‘ 從第2腳發射5微秒的38.4kHz紅外線載波
IR = In(4) ‘ 從第4腳讀取紅外線載波資料
If IR = 0 Then ‘ 發現障礙物向左轉,左前足起步左轉: [4,6,2,7]
RunFrame(4) ‘ 呼叫程序執行編號4動作
CloseEyes()
RunFrame(6) ‘ 呼叫程序執行編號6動作
OpenEyes()
RunFrame(2) ‘ 呼叫程序執行編號2動作
CloseEyes()
RunFrame(7) ‘ 呼叫程序執行編號7動作
OpenEyes()
Else ‘ 未發現障礙物,右前足起步前行 [2,5,4,3]
RunFrame(2) ‘ 呼叫程序執行編號2動作
RunFrame(5) ‘ 呼叫程序執行編號5動作
CloseEyes()
RunFrame(4) ‘ 呼叫程序執行編號4動作
RunFrame(3) ‘ 呼叫程序執行編號3動作
OpenEyes()
End If
Loop
End Sub
程式輸入完畢之後,請在「建立」選單中選取「建立」功能進行程式編譯,並通過USB線下載編譯後的程式碼至SC8控制板。此時「小怪獸」不再只是會做「伏地 挺身」而已。這樣的程式流程已經讓「小怪獸」具有從迷宮脫困的基本能力。大家完成程式之後,可以嘗試定義一下更複雜的流程。原則上更複雜的流程可以讓「小 怪獸」以更聰明的方法從迷宮中脫困。或者加上更多的感測器,讓「小怪獸」可以更快速地感測周邊環境,做出更有效率的決策。這時候大家就來辦個「走迷宮競 賽」,誰的「小怪獸」厲害,高下立判。
文章接近尾聲了,當我把功能驗證完畢之後,心情剎時輕鬆了起來。拿幾個紙盒當成路障,把書房的燈給轉 暗,再啟動我的「小怪獸」。閃爍的LED光影、「嘎嘎」的伺服機轉動聲、踽踽獨行的身影,我彷彿看到「小怪獸」在火星上獨自探索。We are programmed to explore! 這就是機器人DIY的樂趣。當我神遊在自己的異想世界裡,「小怪獸」已經從紙盒做的「八卦陣」裡走了出來,我彷彿聽到「小怪獸」在說:What’s next?
*鮑惟聖
擁有中原大學電機工程學士學位,利基應用科技(www.innovati.com.tw)的創辦人。多年來一直從事微處理器應用與系統工具的開發,並致力於推廣智慧型機器人科普教育。
更多:
仿生機器人──小怪獸(製作篇)
仿生機器人──小怪獸(運用篇)
本文原發表於《Make》國際中文版vol.03