第1篇:在最后一刻停下來!用Arduino和距離傳感器制作小雞賽車!(第1篇)
該項目旨在介紹用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。
此次的超聲波距離傳感器的測量工作將使用筆者創建的庫。您可以通過下面的鏈接下載這個庫。
下載庫文件(HCSR04.zip)
從Arduino IDE的“Sketch”菜單中選擇“Include Library”-“Add .ZIP Library”,打開下載的庫。現在,就可以使用超聲波距離傳感器庫了。
創建如下程序,通過這個程序,可以利用超聲波距離傳感器來獲取距離,并在串口顯示器上查看。
#include 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的字符,需要另外的庫。這次我們將使用筆者創建的庫來來實現顯示。您可以從下面的鏈接下載這個庫文件。
下載庫文件(AQM1602Y.zip)
從Arduino IDE的“Sketch”菜單中選擇“Include Library”-“Add .ZIP Library”,打開下載的庫。現在,就可以使用該庫了。
讓我們實際顯示一下“Chicken Racer”。創建如下程序:
#include #include 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秒的間隔反復旋轉和停止。創建如下程序:
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作為數字輸入輸出引腳來讀取微動開關的狀態。
連接好之后,創建以下程序:
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連接器”。另外,在使用連接器時,需另行準備連接用的導線。
◆◆◆
這次我們創建了電路。下次我們將完成殼體制作并創建運行程序,徹底完成小雞賽車。下一篇更精彩,敬請期待!
福田和宏
作家,居住在日本札幌。喜歡撰寫有關電子創作、電腦、Linux、智能手機等方面的文章。在為“Raspberry Pi Magazine”和“日經Linux”供稿。著有《這本書足夠!Raspberry Pi超簡單入門教程》(SOTECHSHA)、《學習各種電子元器件的控制!Arduino電子創作 實戰教程》(SOTECHSHA)、《Arduino實用入門》(技術評論出版社)等書籍。目前,創辦了“札幌電子工藝部”,這里匯集了眾多電子創作發燒友,大家使用各自的電子技能創作各種作品。任何人都可以參加,也期待您的加入!
審核編輯黃宇
-
串口
+關注
關注
14文章
1557瀏覽量
76979 -
電機驅動器
+關注
關注
16文章
648瀏覽量
64798 -
Arduino
+關注
關注
188文章
6477瀏覽量
187737 -
距離傳感器
+關注
關注
3文章
76瀏覽量
15158
發布評論請先 登錄
相關推薦
評論