該專案是在介紹用Arduino讓感測器工作的一個電子作品。此次的分享嘉賓是福田和宏先生!他過去曾在Device Plus上連載過“Arduino基礎”等作品。
在第2篇中,我們瞭解了小雞賽車中使用的電子零件的工作情況以及整個電子電路的製作過程。本文是第3篇,也是本項目的最後一篇,在這裡我們將製作殼體和程式,徹底完成小雞賽車。
我決定使用第1篇中提到的“圓形機器人底盤套件”來製作殼體。利用圓形機器人底盤套件中的兩枚金屬板做成兩層,再安裝上透過和車輪,即可輕鬆完成能行駛的車身了。
但是,對於這次需要安裝兩塊電路板、兩節電池、還有超聲波距離感測器和微動開關的情況而言,實在是顯得太擁擠了。另外,僅憑圓形機器人底盤套件附帶的前輪用球頭難以直行,而且一旦有點臺階,行進方向還可能會發生偏移。
因此,我決定使用3D印表機自己製作所需零件,以完成殼體制作。我使用的是3D印表機,這種印表機也可以加工板子類的零件,大家也可以試試。
在最底下的一層,除了左右兩個透過外,還需要安裝第2篇中製作的用來控制透過的電路板。另外,我在賽車的前部安裝了自己用3D列印機制作的支架,使之起到加長的作用,以便安裝迷你四驅車輪作為前輪。此外,還在與前方牆壁碰撞的部分安裝了左右兩個微動開關。
在透過上方一層安裝電池。這次,我分別準備了Arduino和透過工作用的電池。兩者都是可提供9V電壓的006P電池。小雞賽車會受到諸如與牆壁碰撞等的衝擊。因此,如果不將電池安裝牢固,就可能會脫落。另外,由於透過的用電量較大,所以很容易耗盡電池電量。為了便於在沒電時更換電池,我用3D印表機做了一個電池盒,這樣就能從背面很方便地更換電池了。
除此之外,還在前方安裝了超聲波感測器,以測量到牆壁之間的距離。這次使用的超聲波感測器“HC-SR04”無法測量小於2cm的距離。出於這個原因,超聲波感測器應安裝在至少離小雞賽車頭部(微動開關被按下的位置)之後2cm的位置。
將主機板安裝到賽車頂部。我用3D列印機制作了電池盒的頂蓋,這樣,就可以將主機板安裝在它上面了。
組裝好車身後,安裝車輪,然後將每個電子零件的導線連接到主機板上,就完成了。
另外,由於控制開關是用導線連接的,因此需要準備幾米左右的導線並將其接到開關上。
如果玩家未能在最後一刻將賽車停下來,那麼小雞賽車就會撞到牆上。而撞到牆上後,車身就會受到衝擊。特別是如果有像這次這樣的由3D印表機列印的零件時,它們可能會因撞擊而開裂。而且,超聲波距離感測器也可能會錯位,從而無法準確地測量距離。
基於這些可能出現的問題,我給小雞賽車安裝了“保險桿”,以緩衝賽車與牆壁碰撞時的衝擊力,防止車身斷裂。保險桿上帶有彈簧,可以吸收撞擊牆壁時的衝擊力,從而避免其影響車身。
這次我使用了透過3D列印機制作的保險桿。另外,在保險桿上面還裝上了兩個微動開關,用來檢測與牆壁的碰撞。安裝位置要確保牆壁碰到保險桿時開關被按下。
當然,如果您打算以低速行駛賽車,即使有碰撞也不會產生多大的衝擊力,那麼就不需要安裝保險桿。
殼體做好後,我們還需要完成程式設計工作。程式的主要結構如下:
要想實現各個功能,就需把第1篇和第2篇中介紹過的讓每個零零件工作的方法通過程式設計結合起來。例如,賽車行駛起來之後,判斷控制開關被按下了還是保險杠被撞了的程式如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
lcddisp.clear(); lcddisp.move( 0x00, 0x00 ); lcddisp.charwrite( " G O ! " ); digitalWrite( MOTOR1_PIN, HIGH ); flag = 0; while( 1 ){ if( digitalRead( BUMPER_PIN ) == LOW ){ flag = 2; break; } if( digitalRead( SW_PIN ) == LOW ){ flag = 1; break; } } digitalWrite( MOTOR1_PIN, LOW ); |
第1行到第3行,是在液晶顯示器上顯示“GO!”,讓玩家知道即將開始行駛。通過第5行的digitalWrite() 將連接到透過驅動器的引腳設置為“HIGH”,透過旋轉,賽車向前行駛。
通過第8行的while(),一直持續行駛,直到控制開關被按下或保險杠的微動開關被按下。在保持行進過程中,會隨時確認控制開關和微動開關的狀態。
第9行用來判斷保險杠的開關是否被按下,即是否撞到了牆壁。通過digitalRead來確認微動開關所連接的引腳的狀態,若為Low,則判斷微動開關已被按下。通過將flag變數置“2”來記錄撞到了牆壁。通過第11行的“break”退出while迴圈。
第13行用來判斷控制開關被按下,即玩家按下停止開關。和微動開關的情況一樣,通過確認控制開關所連接的引腳的狀態,當變為“Low”時,判斷開關已被按下。在flag變數中記錄“1”並通過break退出迴圈。
退出迴圈後,通過第19行,將透過驅動器所連接的引腳置“Low”,使透過停止運行。
然後,確認flag變數並進行相應的處理。如果為“1”,則判斷“成功”,通過超聲波距離感測器測量到牆壁的距離,並顯示在液晶顯示器上。如果為“2”,則在液晶顯示器上顯示“Fail …”,表示挑戰失敗。
整個程式可以從以下連結下載:
關於其他處理,請參考下載的程式。您可以通過Arduino IDE打開檔,並將程式傳輸到Arduino Nano,即可用於小雞賽車。
在測量到牆壁之間的距離時,需要使撞牆狀態下的距離為“0cm”。這個可以通過從超聲波距離感測器測得的距離中減去超聲波感測器和微動開關之間的距離來計算。例如,超聲波距離感測器和微動開關之間的距離是3.5cm,測得的距離是5.1cm,那麼到牆壁的距離可以計算得出“1.6cm”。
但是,在使用過程中,安裝位置可能會發生偏移,超聲波距離感測器和微動開關之間的距離可能會發生變化。這樣的話,即使撞牆,也不會是0cm,成功時測得的距離甚至可能會顯示為負數。
在這種情況下,需要每次在程式中改寫計算公式並將其傳輸到Arduino,這需要花費大量的時間和精力。因此,我決定安裝一個可以輕鬆調整距離校準值的功能。
要進行校正,請確保小雞賽車處於撞牆狀態(微動開關被按下的狀態),然後按下位於液晶顯示器右下方的距離校準開關。接著,測量到牆壁的距離,通過從實際測量值中減去該值,即可得到正確的距離。
現在,讓我們試試做好的小雞賽車能不能跑起來。打開電源開關後,液晶顯示器將顯示“Chicken Racer”。想玩賽車比賽遊戲時,請按下有線連接的控制開關。然後,LED將開始倒計時。
當倒計時LED變為綠燈時,小雞賽車開始向前行駛。在快要撞上牆壁之前,按下控制開關,讓小雞賽車停下來。
如果您可以在不撞牆的情況下停下來,液晶顯示器上將會顯示出與牆壁之間的距離。如果失敗,則會顯示“Fail …”,讓您知道失敗了。如果在遊戲結束後按下保險杠上的微動開關,就會被重置,您可以重新開始遊戲。
到這裡,小雞賽車就大功告成了。本系列連載文章中介紹的電子零件的操作方法和製作過程,在創作其他作品時也會用得到,歡迎參考並嘗試使用Arduino挑戰各種電子作品的創作!