第1篇:在最后一刻停下來!用Arduino和距離傳感器制作小雞賽車!(第1篇)
該項(xiàng)目旨在介紹用Arduino讓傳感器工作的一個(gè)電子作品。此次的分享嘉賓是福田和宏先生!他過去曾在DevicePlus上連載過“Arduino基礎(chǔ)”等作品。
◆◆◆
大家好!在第1篇中,我為大家介紹了小雞賽車的全貌。在本文中,我們一起來了解一下小雞賽車中使用的電子部件的工作情況。然后,我們會(huì)創(chuàng)建一個(gè)電子電路,使其能夠安裝在作品主體上。
可以測(cè)量距離的“超聲波距離傳感器”
當(dāng)小雞賽車停在墻壁前面時(shí),我希望能夠測(cè)量并讓我們知道賽車的停止位置距離墻壁有多遠(yuǎn)。可以使用超聲波距離傳感器來完成這項(xiàng)任務(wù)。超聲波距離傳感器是利用超聲波(聲音)從傳感器發(fā)出、并被墻壁反射回來所需的時(shí)間來計(jì)算距離的。通過將時(shí)間乘以聲速(340.29 m/sec)即可計(jì)算出距離。然而,由于這個(gè)距離是聲音從傳感器到對(duì)象物、并從對(duì)象物被反射回到傳感器的往復(fù)距離,所以實(shí)際上到對(duì)象物的距離需要減半。雖然在不同的室溫下會(huì)多少存在一些誤差,但由于在測(cè)量短距離時(shí)忽略誤差也不會(huì)造成太大的偏差,所以我沒有給小雞賽車配備溫度校準(zhǔn)功能。
現(xiàn)在,讓我們通過Arduino Nano使用超聲波距離傳感器來測(cè)量距離吧。如下連接超聲波距離傳感器。
超聲波距離傳感器帶有稱為“TRIG”和“ECHO”的引腳。通過對(duì)“TRIG”施加“HIGH”,可以發(fā)出超聲波。此外,“ECHO”在接收到反射回來的超聲波時(shí)會(huì)變?yōu)椤癏IGH”。使用Arduino,可以通過測(cè)量從將TRIG置“HIGH”發(fā)出超聲波直到ECHO切換為“HIGH”的時(shí)間,來獲取從超聲波發(fā)射到返回所花的時(shí)間。當(dāng)然,需要將TRIG連接到Arduino Nano的數(shù)字輸入輸出引腳2,將ECHO連接到數(shù)字輸入輸出引腳3。
此次的超聲波距離傳感器的測(cè)量工作將使用筆者創(chuàng)建的庫(kù)。您可以通過下面的鏈接下載這個(gè)庫(kù)。
下載庫(kù)文件(HCSR04.zip)
從Arduino IDE的“Sketch”菜單中選擇“Include Library”-“Add .ZIP Library”,打開下載的庫(kù)。現(xiàn)在,就可以使用超聲波距離傳感器庫(kù)了。
創(chuàng)建如下程序,通過這個(gè)程序,可以利用超聲波距離傳感器來獲取距離,并在串口顯示器上查看。
#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 ); }
將程序傳輸?shù)紸rduino并打開串口顯示器,就會(huì)顯示出距離。接下來,您可以把書本等物體放在超聲波距離傳感器前來改變距離,可以看到顯示器上的距離數(shù)據(jù)也會(huì)隨之發(fā)生變化。
顯示字符的“字符液晶顯示器”
我們使用字符液晶顯示器來顯示超聲波距離傳感器測(cè)量到的結(jié)果。字符液晶顯示器是一種在內(nèi)部存儲(chǔ)有字母和數(shù)字等字符信息,可以簡(jiǎn)單地顯示字符的顯示設(shè)備。雖然能夠顯示的字符數(shù)是預(yù)先規(guī)定好的,但在顯示像這次這樣的測(cè)量距離或簡(jiǎn)單的介紹文本時(shí),足夠用了。
本次使用的字符液晶顯示器“AQM1602Y-FLW-FBW”可以在屏幕上顯示32個(gè)字符(16個(gè)字符×2行)。
AQM1602Y-FLW-FBW通過I2C由Arduino來控制。在Arduino Nano Every中,模擬輸入引腳A4和A5可用于I2C通信。
現(xiàn)在,讓我們來嘗試通過Arduino Nano實(shí)際控制字符液晶顯示器,并使之顯示任意字符。連接如下。由于背面的背光引腳的干擾,AQM1602Y-FLW-FBW可能無法插入面包板。在這種情況下,最好準(zhǔn)備一個(gè)針座并通過針座將其插入面包板。
要在AQM1602Y-FLW-FBW上顯示來自Arduino的字符,需要另外的庫(kù)。這次我們將使用筆者創(chuàng)建的庫(kù)來來實(shí)現(xiàn)顯示。您可以從下面的鏈接下載這個(gè)庫(kù)文件。
下載庫(kù)文件(AQM1602Y.zip)
從Arduino IDE的“Sketch”菜單中選擇“Include Library”-“Add .ZIP Library”,打開下載的庫(kù)。現(xiàn)在,就可以使用該庫(kù)了。
讓我們實(shí)際顯示一下“Chicken Racer”。創(chuàng)建如下程序:
#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 () 是將光標(biāo)移動(dòng)到希望開始顯示的位置。需要按照位和行的順序指定。屏幕左上角為0位0行。例如,如果要在第2位第1行顯示,就需要指定“l(fā)cddisp.move (0x01, 0x00)”。
要顯示的字符串由 lcddisp.charwrite() 指定。
當(dāng)我將程序傳輸?shù)紸rduino時(shí),顯示器上顯示“Chicken Racer”。為了便于查看,我打開了背光燈(如下面照片所示),但是實(shí)際上沒有連接背光燈,所以背光燈不會(huì)亮。
推動(dòng)車輪前進(jìn)的“電機(jī)”
小雞賽車是通過使裝有車輪的電機(jī)來推動(dòng)其前進(jìn)的。在啟動(dòng)時(shí)使電機(jī)旋轉(zhuǎn),在按下開關(guān)時(shí)使電機(jī)停止。
由于使電機(jī)運(yùn)行所需的電流較大,因此無法直接將電機(jī)連接到Arduino Nano的數(shù)字輸入輸出引腳。所以需要使用電機(jī)驅(qū)動(dòng)器由電機(jī)專用電源供電。有關(guān)電機(jī)和電機(jī)驅(qū)動(dòng)器的詳細(xì)信息,請(qǐng)參閱“Arduino基礎(chǔ):控制電機(jī)”。
要想實(shí)際驅(qū)動(dòng)電機(jī),就需要使用電機(jī)驅(qū)動(dòng)器進(jìn)行如下連接。本次使用的電機(jī)驅(qū)動(dòng)器帶有兩個(gè)控制引腳,可以控制正轉(zhuǎn)、反轉(zhuǎn)和停止。但是,由于小雞賽車只能前進(jìn),所以將正轉(zhuǎn)控制用的輸入1(引腳7)連接到Arduino進(jìn)行控制,將反轉(zhuǎn)控制用的輸入2(引腳9)連接到了GND。
另外,通過本次使用的電機(jī)驅(qū)動(dòng)器的“VREF”引腳(引腳1),還能夠調(diào)整可提供給電機(jī)的電壓。正轉(zhuǎn)或反轉(zhuǎn)時(shí),電機(jī)會(huì)輸出與VREF相同的電壓。當(dāng)施加在電機(jī)上的電壓發(fā)生變化時(shí),電機(jī)的轉(zhuǎn)速也會(huì)改變。因此,可以事先安裝旋鈕來調(diào)節(jié)施加于VREF的電壓,這樣就能夠調(diào)整電機(jī)的轉(zhuǎn)速了。這個(gè)旋鈕是學(xué)齡前兒童可以慢慢轉(zhuǎn)動(dòng)、小學(xué)生可以快速轉(zhuǎn)動(dòng)的程度。
連接完成后,讓我們?cè)囍ㄟ^Arduino來實(shí)施控制。這次我們嘗試以5秒的間隔反復(fù)旋轉(zhuǎn)和停止。創(chuàng)建如下程序:
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 ); }
通過這個(gè)程序,連接電機(jī)驅(qū)動(dòng)器的數(shù)字輸入輸出引腳(引腳4)被置“High”時(shí)將會(huì)旋轉(zhuǎn),被置“Low”時(shí)將會(huì)停止。因此,可以通過使用digitalWrite()切換引腳4的輸出來實(shí)現(xiàn)電機(jī)控制。
這次的小雞賽車采用兩個(gè)電機(jī)來使左車輪和右車輪旋轉(zhuǎn)和前進(jìn)。因此,需要為每個(gè)電機(jī)準(zhǔn)備一個(gè)電機(jī)驅(qū)動(dòng)器。如果能夠獨(dú)立控制兩個(gè)電機(jī),不僅可以使賽車前進(jìn),還可以實(shí)現(xiàn)旋轉(zhuǎn)操作,可以更靈活地進(jìn)行控制。
不過本次的賽車只需要能夠前進(jìn)和停止,因此只要讓兩個(gè)電機(jī)以相同的方式運(yùn)行即可。所以,通過將兩個(gè)電機(jī)驅(qū)動(dòng)器的控制引腳連接到Arduino的一個(gè)數(shù)字輸入輸出引腳,即可執(zhí)行相同的動(dòng)作。
當(dāng)然,在某些情況下,電機(jī)的轉(zhuǎn)速可能會(huì)有所不同,可能無法直線行駛。在這種情況下,可使用連接到VREF引腳的旋鈕將轉(zhuǎn)速調(diào)整為同一轉(zhuǎn)速。
用來檢測(cè)碰撞的“微動(dòng)開關(guān)”
要想判斷是否失敗,就需要檢測(cè)到是否與墻壁發(fā)生了碰撞;另外,當(dāng)撞到墻上時(shí)需要立即使電機(jī)停止。針對(duì)這種需求,我使用的是微動(dòng)開關(guān)。微動(dòng)開關(guān)是一種響應(yīng)性能良好的開關(guān),按下開關(guān)后,當(dāng)?shù)竭_(dá)特定位置時(shí)會(huì)立即切換。它也常用于鼠標(biāo)的單擊按鈕。
另外,如果是帶有金屬板的微動(dòng)開關(guān),那么即使按下角度有偏差,也能夠確保開關(guān)被按下。像這次需要檢測(cè)是否碰撞墻壁的情況,某些碰撞角度,可能無法按下開關(guān)。而如果使用帶有金屬板的微動(dòng)開關(guān),那么即使撞擊角度有一定程度的傾斜,開關(guān)也能夠被按下。此外,通過在左側(cè)和右側(cè)同時(shí)安裝開關(guān),可以進(jìn)一步確保開關(guān)在撞擊時(shí)被按下。
微動(dòng)開關(guān)帶有3個(gè)引腳。未按下開關(guān)時(shí),COM引腳和NC引腳處于連接狀態(tài)。當(dāng)按下開關(guān)時(shí),開關(guān)由NC切換到NO,COM引腳和NO引腳連接。
由于我們這次是希望通過開關(guān)被按下來檢測(cè)碰撞,所以將使用COM引腳和NO引腳。我們將一個(gè)引腳連接到Arduino Nano的數(shù)字輸入輸出引腳,將另一個(gè)引腳連接到GND,這樣,當(dāng)開關(guān)被按下時(shí),數(shù)字輸入輸出引腳將會(huì)被切換到GND狀態(tài)。另外,需要啟用上拉功能,使數(shù)字輸入輸出引腳在開關(guān)未被按下時(shí)處于5V狀態(tài),以穩(wěn)定輸入。
下面,讓我們來試用一下微動(dòng)開關(guān)吧。這次,先試試當(dāng)開關(guān)被按下時(shí)讓安裝在Arduino Nano上的 LED燈亮起來吧。連接方法如下。我們使用引腳12作為數(shù)字輸入輸出引腳來讀取微動(dòng)開關(guān)的狀態(tài)。
連接好之后,創(chuàng)建以下程序:
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 ); } }
當(dāng)將程序傳輸?shù)紸rduino并按下微動(dòng)開關(guān)時(shí),您可以看到安裝在Arduino Nano上的LED亮了。
在電路板上創(chuàng)建電路
在確認(rèn)了每個(gè)電子部件的工作情況之后,我們來為整個(gè)小雞賽車創(chuàng)建一個(gè)配套的電路。電路圖如下:
基本上,要讓每個(gè)確認(rèn)過的電子部件分別連接好。但是考慮到操作的方便性,我還增加了一個(gè)在調(diào)整電機(jī)轉(zhuǎn)速時(shí)使電機(jī)旋轉(zhuǎn)的開關(guān)、以及為了便于獨(dú)立控制電機(jī)而設(shè)置的切換用跳線。
這個(gè)電路是在萬用板上通過焊接來制作完成的。下面是作者做的電路板。是將主板和電機(jī)控制板分開制作的。
在制作電路板時(shí),如果使用連接器進(jìn)行連接,布線會(huì)更容易處理。這是因?yàn)橐坏╇娐酚惺裁磫栴},也可以通過插拔輕松地進(jìn)行調(diào)整。這次,我用的是小型連接器——“XH連接器”。另外,在使用連接器時(shí),需另行準(zhǔn)備連接用的導(dǎo)線。
◆◆◆
這次我們創(chuàng)建了電路。下次我們將完成殼體制作并創(chuàng)建運(yùn)行程序,徹底完成小雞賽車。下一篇更精彩,敬請(qǐng)期待!
福田和宏
作家,居住在日本札幌。喜歡撰寫有關(guān)電子創(chuàng)作、電腦、Linux、智能手機(jī)等方面的文章。在為“Raspberry Pi Magazine”和“日經(jīng)Linux”供稿。著有《這本書足夠!Raspberry Pi超簡(jiǎn)單入門教程》(SOTECHSHA)、《學(xué)習(xí)各種電子元器件的控制!Arduino電子創(chuàng)作 實(shí)戰(zhàn)教程》(SOTECHSHA)、《Arduino實(shí)用入門》(技術(shù)評(píng)論出版社)等書籍。目前,創(chuàng)辦了“札幌電子工藝部”,這里匯集了眾多電子創(chuàng)作發(fā)燒友,大家使用各自的電子技能創(chuàng)作各種作品。任何人都可以參加,也期待您的加入!
審核編輯黃宇
-
串口
+關(guān)注
關(guān)注
14文章
1557瀏覽量
77042 -
電機(jī)驅(qū)動(dòng)器
+關(guān)注
關(guān)注
16文章
648瀏覽量
64818 -
Arduino
+關(guān)注
關(guān)注
188文章
6477瀏覽量
187819 -
距離傳感器
+關(guān)注
關(guān)注
3文章
76瀏覽量
15164
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
用IR傳感器和Arduino制作一個(gè)數(shù)字轉(zhuǎn)速計(jì)(附代碼)
![<b class='flag-5'>用</b>IR<b class='flag-5'>傳感器</b>和<b class='flag-5'>Arduino</b><b class='flag-5'>制作</b>一個(gè)數(shù)字轉(zhuǎn)速計(jì)(附代碼)](https://file.elecfans.com//web2/M00/64/E9/pYYBAGMG1oyAdu7AAABGGirr35U299.png)
基于Arduino Nano和HC-SR04超聲波傳感器制作社交距離項(xiàng)目
使用超聲波傳感器HC SR04和Arduino Uno制作超聲波距離傳感器
![使用超聲波<b class='flag-5'>傳感器</b>HC SR04和<b class='flag-5'>Arduino</b> Uno<b class='flag-5'>制作</b>超聲波<b class='flag-5'>距離</b><b class='flag-5'>傳感器</b>](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
使用Arduino Uno和PIR傳感器的社交距離項(xiàng)目
![使用<b class='flag-5'>Arduino</b> Uno和PIR<b class='flag-5'>傳感器</b>的社交<b class='flag-5'>距離</b>項(xiàng)目](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
使用Labview、Arduino和超聲波傳感器制作距離/測(cè)距程序
![使用Labview、<b class='flag-5'>Arduino</b>和超聲波<b class='flag-5'>傳感器</b><b class='flag-5'>制作</b><b class='flag-5'>距離</b>/測(cè)距程序](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
如何使用Arduino制作LED運(yùn)動(dòng)傳感器
![如何使用<b class='flag-5'>Arduino</b><b class='flag-5'>制作</b>LED運(yùn)動(dòng)<b class='flag-5'>傳感器</b>](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
用Arduino和距離傳感器制作小雞賽車!(第3篇?最終篇)
![<b class='flag-5'>用</b><b class='flag-5'>Arduino</b>和<b class='flag-5'>距離</b><b class='flag-5'>傳感器</b><b class='flag-5'>制作</b><b class='flag-5'>小雞</b><b class='flag-5'>賽車</b>!(<b class='flag-5'>第</b>3<b class='flag-5'>篇</b>?最終篇)](https://file.elecfans.com/web2/M00/92/E2/pYYBAGPyzwyAGPi6AAKdW0xTFzo761.png)
在最后一刻停下來!用Arduino和距離傳感器制作小雞賽車!(第1篇)
![在最后一刻停下來!<b class='flag-5'>用</b><b class='flag-5'>Arduino</b>和<b class='flag-5'>距離</b><b class='flag-5'>傳感器</b><b class='flag-5'>制作</b><b class='flag-5'>小雞</b><b class='flag-5'>賽車</b>!(<b class='flag-5'>第</b>1<b class='flag-5'>篇</b>)](https://file.elecfans.com/web2/M00/92/5F/poYBAGPyz1KAUfxVAADOQAu7S_U103.jpg)
一款用Raspberry Pi和傳感器制作的可穿戴式小型健康管理設(shè)備!第四部分?劇終篇
![一款<b class='flag-5'>用</b>Raspberry Pi和<b class='flag-5'>傳感器</b><b class='flag-5'>制作</b>的可穿戴式小型健康管理設(shè)備!第四部分?劇終篇](https://file.elecfans.com/web2/M00/93/01/pYYBAGPzGYmAZjuOAAl8UJ8OSDY306.png)
評(píng)論