到目前為止,我們已經在DevicePlus上介紹過Arduino的使用方法和一些應用案例。在本文中,我們將嘗試一個用Arduino讓感測器工作的電子作品。此次的分享嘉賓是福田和宏先生!他過去曾在Device Plus上連載過“Arduino 基礎”等作品。
◆◆◆
大家好!讓我們直接進入主題吧。透過將幾個微控制器和電子元件相組合,就能創作出很多不同的作品。從機器人和無人機等流行設備到鬧鐘和玩具等小物件,您可以實現各種創意。這次要為大家介紹的是一款名為“小雞賽車”的車形機器人製作過程。
使用這次的作品可以玩一種遊戲,讓名為“小雞賽車”的車形機器人向著牆壁行駛,比賽從機器人停下的地方到牆壁的距離誰最短。它採用了可以透過按鈕來操作車形機器人的設計,因此任何人都可以輕鬆享受競賽遊戲。
這款小雞賽車中配有馬達,透過開關使其前進。參加遊戲的人手握按鈕,當小車馬上要撞上牆壁時按下按鈕使之停止。
然後使用距離感測器來測量賽車與牆壁之間的距離。即使和好幾個人一起玩,只要能測量出到牆壁的距離,就能比出誰在離牆壁最近的位置停下來了,是不是很有趣?
另外,我們還需要提前準備一個用來檢測是否已碰撞到牆壁的機制。我的設計是在小雞賽車的前端安裝了開關,這樣,如果它撞到牆上開關就會被按下。如果這個開關被按下,就意味著玩家失敗。
在確定了小雞賽車的大致動作之後,讓我們來看看需要使用哪些電子零件。這次我們將使用Arduino進行控制。由於“Arduino UNO”等產品體積較大,不適合安裝在這麼小的作品上,因此,我決定使用體積小巧的“Arduino Nano”。“Arduino Nano”的尺寸為45×18mm,大小是可以放在食指上的程度,所以正好可以安裝在作品上,而不用擔心尺寸太大。另外,雖然體積更小,但卻具有與“Arduino Uno”相同的功能,這點很關鍵。
驅動馬達使用配有齒輪的馬達。這是因為齒輪會增強驅動的力量,這樣即使放置電池等較重的零件,也可以輕鬆地讓賽車跑起來。此外,還需要馬達驅動器讓馬達運轉。
使小雞賽車停下來的操作,我用按鈕開關來實現。這次,我想將開關線延長,以便從遠處也可以控制賽車。
我使用微動開關來判斷小雞賽車是否撞到了牆上,選用了附有金屬板的微動開關。金屬板的存在可以確保開關被按下而不必擔心碰撞角度。此外,透過在前方安裝左右兩個微動開關,可以提高發生碰撞時按下開關的準確性。
停止時,需要測量到牆壁的距離,我使用距離感測器來完成這項工作。這次用的是可以使用超音波測量距離的距離感測器。
另外,我還希望在顯示器上顯示結果,以便讓玩家知道測量出來的距離。我使用的是文字液晶顯示器,這樣可以比較容易地顯示文字。
可以透過LED讓玩家知道開始的時間以及是否成功。安裝一個綠色和三個紅色的LED。透過倒數計時來通知開始時間,先是所有紅色LED點亮,然後逐一熄滅,綠色LED點亮表示開始,賽車駛出。另外,如果成功了,綠色LED亮起;如果失敗了,則紅色LED亮起,據此來告知參賽者結果。
除此之外,還要配備調整馬達速度和設置距離的功能。
接下來,我們根據小雞賽車的結構,來選擇電子零件。這次使用的電子零件如下:
使用“Arduino Nano Every”作為微控制器來負責控制。Arduino Nano Every是一款於2019年5月發售的新Arduino Nano。當然,如果不想使用Arduino Nano Every,使用舊Arduino Nano或與Arduino Nano相容的產品也沒有問題。
透過發射超音波並測量接收到牆壁反射回來的超音波時間,來測量與物件之間的距離。
可以顯示文字和符號的顯示器。這次使用的是“AQM1602Y-FLW-FBW”,最多可以顯示2行16個文字。此外,該顯示器有背光,因此即使在較暗的環境下也可以查看所顯示的文字。
該套件中包括馬達、車輪和外殼。馬達採用驅動力量較大的減速馬達(齒輪馬達)。按照說明書組裝,可以很容易地製作出小雞賽車外殼。將電子電路和感測器等安裝到這個外殼裡面,即可完成製作。當然,您也可以只購買馬達,自己來製作外殼。
使用輸出為1.0A的馬達適用的可逆馬達驅動器來驅動馬達。這次我使用的產品規格如下:
【絕對最大額定值(Ta=25℃)】
電源電壓(VCC):18V
電源電壓(VM):18V
輸出電流(lomax):1A
工作溫度範圍:-20〜75℃
保存溫度範圍:-55〜150℃
【推薦工作範圍】
電源電壓(VCC):6.5〜15V
電源電壓(VM):6.5〜15V
輸出H電壓設置:<VCC,VM
編號 | 引腳名 | 功能 |
1 | VREF | 輸出H電壓設置引腳 |
2 | OUT2 | 輸出引腳 |
3 | RNF | 輸出單元GND |
4 | OUT1 | 輸出引腳 |
5 | VM | 電源(馬達輸出單元) |
6 | VCC | 電源(小信號單元) |
7 | FIN | 控制輸入(正) |
8 | GND | GND |
9 | RIN | 控制輸入(反) |
為了使賽車的左右兩個車輪轉動,我使用了2個馬達。
使用LED來通知倒數計時和結果資訊。我準備了3個紅色和1個綠色的LED。
供玩家用來控制小雞賽車。為了便於操作,最好選擇能夠連接到面板的形狀。
用來檢測是否與牆壁發生了碰撞。在賽車前方安裝左右兩個微動開關。
除了上述零件之外,我還使用了以下電子元件:
另外,需要使用如下排母將每個電子元件用導線連接起來。如果直接將佈線焊接起來則不需要這些元件。
當然,如果能實現同樣的功能,選擇其他電子元件也沒有問題。在這種情況下,需要注意它們的連接方法和控制方向。
首先需要確保為Arduino提供的電源。由於這是一個能夠移動的作品,所以需要在作品自身上安裝電池等作為電源。Arduino Nano可以透過連接USB資料線供電。因此,還可以透過安裝行動電源等來實現供電。然而,目前市場上的行動電源很多是針對智慧手機的,往往又大又重。此外,Arduino消耗的電量很小,不需要像行動電源那麼大的容量。
因此,這次我用的是電池。Arduino中配有稱為“VIN”的引腳,當它與最大21V的電源相連接時,就會將電壓轉換為5V並為Arduino供電。因此,我使用了可輸出9V電壓的006P電池來供電。
將電池扣的正極(紅線)連接到“VIN”引腳,將負極(黑線)連接到“GND”引腳即可實現供電。
準備好電子零件後,需要確認每個電子零件是否可以正常工作。這是為了一旦出現無法工作的情況,便於採取諸如更換成其他電子零件等的措施。
在確認時,最好使用麵包板進行連接。另外,如果能事先確認作品應該可以在實裝後正常工作,那麼您在編寫程式時會更安心。
首先,我們來確認LED和開關是否能夠正常工作。另外,我們要確認一下按下開關後是否開始計數。
將LED連接到Arduino的數位輸出引腳可以打開和關閉LED。此外,我們還需要給LED連接一個電阻,以防止過電流(關於更詳細的LED使用方法,請參閱“Arduino基礎:透過數位輸出來控制LED照明”“Arduino基礎:透過數位輸出來控制LED照明”。
這次我使用3個紅色LED和1個綠色LED。將LED分別連接到Arduino的數位輸出引腳8、9、10、11。
玩家操作時使用的按鈕開關,連接數位輸入引腳即可讀取開關狀態。此外,透過將另一個引腳連接到GND,按下按鈕時數位輸入引腳的狀態會變為0V。另外,還要透過程式設計來啟用上拉功能,以使其在未按下按鈕時處於5V狀態,如果要瞭解更詳細的內容,請參考“Arduino基礎:讀取開關狀態”Arduino基礎:讀取開關狀態”。這次,我們連接數字輸入引腳7。
現在,讓我們將LED和開關連接到麵包板上來嘗試計數吧。電子零件的連接如下圖所示。由於開關不能直接連接到麵包板上,所以我們用焊接導線的方式連接。
連接好之後,創建以下程式。透過這個程式,當您按下開關時,所有紅色LED燈亮起,然後每秒熄滅1個LED燈,最後綠色LED燈亮起。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 |
const int LED_RED1_PIN = 8; const int LED_RED2_PIN = 9; const int LED_RED3_PIN = 10; const int LED_GREEN_PIN = 11; const int SW_PIN = 7 void setup() { pinMode( LED_RED1_PIN, OUTPUT ); pinMode( LED_RED2_PIN, OUTPUT ); pinMode( LED_RED3_PIN, OUTPUT ); pinMode( LED_GREEN_PIN, OUTPUT ); pinMode( SW_PIN, INPUT_PULLUP ); digitalWrite( LED_RED1_PIN, LOW); digitalWrite( LED_RED2_PIN, LOW); digitalWrite( LED_RED3_PIN, LOW); digitalWrite( LED_GREEN_PIN, LOW); } void loop() { if( digitalRead( SW_PIN ) == LOW ){ while( digitalRead( SW_PIN ) == LOW ){ delay( 10 ); } digitalWrite( LED_RED1_PIN, HIGH ); digitalWrite( LED_RED2_PIN, HIGH ); digitalWrite( LED_RED3_PIN, HIGH ); digitalWrite( LED_GREEN_PIN, LOW ); delay( 3000 ); digitalWrite( LED_RED1_PIN, LOW ); delay( 1000 ); digitalWrite( LED_RED2_PIN, LOW ); delay( 1000 ); digitalWrite( LED_RED3_PIN, LOW ); digitalWrite( LED_GREEN_PIN, HIGH ); } |
將程式傳輸到Arduino,就可以確認按下按鈕時LED是否按預期工作啦。
◆◆◆
這次我簡單為大家介紹了“小雞賽車”以及所需的電子零件。下一次,我將為大家介紹如何確認超音波距離感測器等電子零件的工作情況,以及整個電子電路的創建方法。