該專案旨在介紹用Arduino讓感測器工作的一個電子作品。此次的分享嘉賓是福田和宏先生!他過去曾在DevicePlus上連載過“Arduino基礎”等作品。
◆◆◆
大家好!在第1篇中,我為大家介紹了小雞賽車的全貌。在本文中,我們一起來瞭解一下小雞賽車中使用的電子零件的工作情況。然後,我們會創建一個電子電路,使其能夠安裝在作品主體上。
當小雞賽車停在牆壁前面時,我希望能夠測量並讓我們知道賽車的停止位置距離牆壁有多遠。可以使用超聲波距離感測器來完成這項任務。超聲波距離感測器是利用超聲波(聲音)從感測器發出、並被牆壁反射回來所需的時間來計算距離的。透過將時間乘以聲速(340.29 m/sec)即可計算出距離。然而,由於這個距離是聲音從感測器到物件物、並從物件物被反射回到感測器的往復距離,所以實際上到物件物的距離需要減半。雖然在不同的室溫下會多少存在一些誤差,但由於在測量短距離時忽略誤差也不會造成太大的偏差,所以我沒有給小雞賽車配備溫度校準功能。
現在,讓我們透過Arduino Nano使用超聲波距離感測器來測量距離吧。如下連接超聲波距離感測器。
超聲波距離感測器帶有稱為“TRIG”和“ECHO”的引腳。透過對“TRIG”施加“HIGH”,可以發出超聲波。此外,“ECHO”在接收到反射回來的超聲波時會變為“HIGH”。使用Arduino,可以透過測量從將TRIG置“HIGH”發出超聲波直到ECHO切換為“HIGH”的時間,來獲取從超聲波發射到返回所花的時間。當然,需要將TRIG連接到Arduino Nano的數位輸入輸出引腳2,將ECHO連接到數位輸入輸出引腳3。
此次的超聲波距離感測器的測量工作將使用筆者創建的資料庫。您可以透過下面的連結下載這個資料庫。
從Arduino IDE的“Sketch”功能表中選擇“Include Library”-“Add .ZIP Library”,打開下載的資料庫。現在,就可以使用超聲波距離感測器資料庫了。
創建如下程式,透過這個程式,可以利用超聲波距離感測器來獲取距離,並在串口顯示器上查看。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
#include <HCSR04.h> const int US_TRIG_PIN = 2; const int US_ECHO_PIN = 3; HCSR04 hcsr04( US_TRIG_PIN, US_ECHO_PIN ); void setup() { Serial.begin( 9600 ); hcsr04.begin(); } void loop() { float distance; distance = hcsr04.get_length(); Serial.print( distance ); Serial.println( "cm" ); delay( 500 ); } |
將程式傳輸到Arduino並打開串口顯示器,就會顯示出距離。接下來,您可以把書本等物體放在超聲波距離感測器前來改變距離,可以看到顯示器上的距離資料也會隨之發生變化。
我們使用字元液晶顯示器來顯示超聲波距離感測器測量到的結果。字元液晶顯示器是一種在內部存儲有字母和數位等字元資訊,可以簡單地顯示字元的顯示裝置。雖然能夠顯示的字元數是預先規定好的,但在顯示像這次這樣的測量距離或簡單的介紹文本時,足夠用了。
本次使用的字元液晶顯示器“AQM1602Y-FLW-FBW”可以在螢幕上顯示32個字元(16個字元×2行)。
AQM1602Y-FLW-FBW透過I2C由Arduino來控制。在Arduino Nano Every中,模擬輸入引腳A4和A5可用於I2C通信。
現在,讓我們來嘗試透過Arduino Nano實際控制字元液晶顯示器,並使之顯示任意字元。連接如下。由於背面的背光引腳的干擾,AQM1602Y-FLW-FBW可能無法插入麵包板。在這種情況下,最好準備一個針座並透過針座將其插入麵包板。
要在AQM1602Y-FLW-FBW上顯示來自Arduino的字元,需要另外的資料庫。這次我們將使用筆者創建的資料庫來來實現顯示。您可以從下面的連結下載這個資料庫檔。
從Arduino IDE的“Sketch”功能表中選擇“Include Library”-“Add .ZIP Library”,打開下載的資料庫。現在,就可以使用該資料庫了。
讓我們實際顯示一下“Chicken Racer”。創建如下程式:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
#include <AQM1602Y.h> #include <Wire.h> int VDD_VOLT = 5; const int AQM1602Y_ADDR = 0x3E; AQM1602Y lcddisp( AQM1602Y_ADDR, VDD_VOLT ); void setup() { lcddisp.begin(); lcddisp.set_cursol( false ); lcddisp.set_blink( false ); lcddisp.set_contrast( 0x0f ); lcddisp.move( 0x01, 0x00 ); lcddisp.charwrite("Chicken Racer"); } void loop() { } |
lcddsip.move () 是將游標移動到希望開始顯示的位置。需要按照位元和行的順序指定。螢幕左上角為0位0行。例如,如果要在第2位元第1行顯示,就需要指定“lcddisp.move (0x01, 0x00)”。
要顯示的字串由 lcddisp.charwrite() 指定。
當我將程式傳輸到Arduino時,顯示器上顯示“Chicken Racer”。為了便於查看,我打開了背光燈(如下面照片所示),但是實際上沒有連接背光燈,所以背光燈不會亮。
小雞賽車是透過使裝有車輪的馬達來推動其前進的。在啟動時使馬達旋轉,在按下開關時使馬達停止。
由於使馬達運行所需的電流較大,因此無法直接將馬達連接到Arduino Nano的數字輸入輸出引腳。所以需要使用馬達驅動器由馬達專用電源供電。有關馬達和馬達驅動器的詳細資訊,請參閱“Arduino基礎:控制馬達”。
要想實際驅動馬達,就需要使用馬達驅動器進行如下連接。本次使用的馬達驅動器帶有兩個控制引腳,可以控制正轉、反轉和停止。但是,由於小雞賽車只能前進,所以將正轉控制用的輸入1(引腳7)連接到Arduino進行控制,將反轉控制用的輸入2(引腳9)連接到了GND。
另外,透過本次使用的馬達驅動器的“VREF”引腳(引腳1),還能夠調整可提供給馬達的電壓。正轉或反轉時,馬達會輸出與VREF相同的電壓。當施加在馬達上的電壓發生變化時,馬達的轉速也會改變。因此,可以事先安裝旋鈕來調節施加於VREF的電壓,這樣就能夠調整馬達的轉速了。這個旋鈕是學齡前兒童可以慢慢轉動、小學生可以快速轉動的程度。
連接完成後,讓我們試著透過Arduino來實施控制。這次我們嘗試以5秒的間隔反復旋轉和停止。創建如下程式:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
const int MOTOR1_PIN = 4; void setup() { pinMode( MOTOR1_PIN, OUTPUT ); } void loop() { digitalWrite( MOTOR1_PIN, HIGH ); delay( 5000 ); digitalWrite( MOTOR1_PIN, LOW ); delay( 5000 ); } |
透過這個程式,連接馬達驅動器的數字輸入輸出引腳(引腳4)被置“High”時將會旋轉,被置“Low”時將會停止。因此,可以透過使用digitalWrite()切換引腳4的輸出來實現馬達控制。
這次的小雞賽車採用兩個馬達來使左車輪和右車輪旋轉和前進。因此,需要為每個馬達準備一個馬達驅動器。如果能夠獨立控制兩個馬達,不僅可以使賽車前進,還可以實現旋轉操作,可以更靈活地進行控制。
不過本次的賽車只需要能夠前進和停止,因此只要讓兩個馬達以相同的方式運行即可。所以,透過將兩個馬達驅動器的控制引腳連接到Arduino的一個數位輸入輸出引腳,即可執行相同的動作。
當然,在某些情況下,馬達的轉速可能會有所不同,可能無法直線行駛。在這種情況下,可使用連接到VREF引腳的旋鈕將轉速調整為同一轉速。
要想判斷是否失敗,就需要檢測到是否與牆壁發生了碰撞;另外,當撞到牆上時需要立即使馬達停止。針對這種需求,我使用的是微動開關。微動開關是一種響應性能良好的開關,按下開關後,當到達特定位置時會立即切換。它也常用於滑鼠的按一下按鈕。
另外,如果是帶有金屬板的微動開關,那麼即使按下角度有偏差,也能夠確保開關被按下。像這次需要檢測是否碰撞牆壁的情況,某些碰撞角度,可能無法按下開關。而如果使用帶有金屬板的微動開關,那麼即使撞擊角度有一定程度的傾斜,開關也能夠被按下。此外,透過在左側和右側同時安裝開關,可以進一步確保開關在撞擊時被按下。
微動開關帶有3個引腳。未按下開關時,COM引腳和NC引腳處於連接狀態。當按下開關時,開關由NC切換到NO,COM引腳和NO引腳連接。
由於我們這次是希望透過開關被按下來檢測碰撞,所以將使用COM引腳和NO引腳。我們將一個引腳連接到Arduino Nano的數字輸入輸出引腳,將另一個引腳連接到GND,這樣,當開關被按下時,數位輸入輸出引腳將會被切換到GND狀態。另外,需要啟用上拉功能,使數位輸入輸出引腳在開關未被按下時處於5V狀態,以穩定輸入。
下面,讓我們來試用一下微動開關吧。這次,先試試當開關被按下時讓安裝在Arduino Nano上的 LED燈亮起來吧。連接方法如下。我們使用引腳12作為數位輸入輸出引腳來讀取微動開關的狀態。
連接好之後,創建以下程式:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
const int LED_PIN = 13; const int BUMPER_PIN = 12; void setup() { pinMode( LED_PIN, OUTPUT ); pinMode( BUMPER_PIN, INPUT_PULLUP ); } void loop() { if( digitalRead( BUMPER_PIN ) == LOW ){ while( digitalRead( BUMPER_PIN ) == LOW ){ delay( 10 ); } digitalWrite( LED_PIN, HIGH ); } else { digitalWrite( LED_PIN, LOW ); } } |
當將程式傳輸到Arduino並按下微動開關時,您可以看到安裝在Arduino Nano上的LED亮了。
在確認了每個電子零件的工作情況之後,我們來為整個小雞賽車創建一個配套的電路。電路圖如下:
基本上,要讓每個確認過的電子零件分別連接好。但是考慮到操作的方便性,我還增加了一個在調整馬達轉速時使馬達旋轉的開關、以及為了便於獨立控制馬達而設置的切換用跳線。
這個電路是在萬用板上透過焊接來製作完成的。下面是作者做的電路板。是將主機板和馬達控制板分開製作的。
在製作電路板時,如果使用連接器進行連接,佈線會更容易處理。這是因為一旦電路有什麼問題,也可以透過插拔輕鬆地進行調整。這次,我用的是小型連接器——“XH連接器”。另外,在使用連接器時,需另行準備連接用的導線。
◆◆◆
這次我們創建了電路。下次我們將完成殼體制作並創建運行程式,徹底完成小雞賽車。下一篇更精彩,敬請期待!