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

基于Arduino Nano和HC-SR04超聲波傳感器制作社交距離項目
使用超聲波傳感器HC SR04和Arduino Uno制作超聲波距離傳感器

使用Arduino Uno和PIR傳感器的社交距離項目

使用Labview、Arduino和超聲波傳感器制作距離/測距程序

如何使用Arduino制作LED運動傳感器

用Arduino和距離傳感器制作小雞賽車!(第3篇?最終篇)

在最后一刻停下來!用Arduino和距離傳感器制作小雞賽車!(第1篇)

一款用Raspberry Pi和傳感器制作的可穿戴式小型健康管理設(shè)備!第四部分?劇終篇

評論