arduino黑线循迹小车程序_循迹小车:给我一条线,我能自己走完全程
在老少通吃的智能小車到底是什么呢?科普來嘍!一文中,我們介紹了智能小車的分類及組成,為什么循跡小車能夠追蹤黑線軌跡呢?
智能小車在畫有黑線的白紙?“路面”上行駛,由于黑線和白紙對光線的反射系數(shù)不同,可根據(jù)接收到的反射光的強(qiáng)弱來判斷“道路”—黑線利用了簡單、應(yīng)用比較普遍的檢測方法—發(fā)光二極管+光敏電阻。發(fā)光二極管+光敏電阻,即利用光線在不同顏色的物理表面具有不同的反射性質(zhì)的特點(diǎn),在小車行駛過程中不斷地向地面發(fā)射白光,當(dāng)白光遇到白色地面時(shí)發(fā)生漫發(fā)射,反射光被裝在小車上的接收管接收;如果遇到黑線則紅外光被吸收,則小車上的接收管接收不到信號。
讓我們一起來試驗(yàn)一下吧!
一.實(shí)驗(yàn)說明
1、使用尋線傳感器控制開發(fā)板自帶LED。
2、紅外尋跡模塊是利用紅外線反射的原理,根據(jù)反射的強(qiáng)度來判定顏色。本尋跡模塊是用來識別黑白線,黑線輸出低電平,白線輸出高電平。
二.物料清單
三.模塊說明
四.連線圖
五.實(shí)驗(yàn)代碼
int num1;int num2;int num3;int num4;int num5;void setup(){ pinMode(7, INPUT); pinMode(8, INPUT); pinMode(9, INPUT); pinMode(10, INPUT); pinMode(11, INPUT); //定義該接口為接口為輸入接口 pinMode(13,OUTPUT);}void loop(){ num1 = digitalRead(7); num2 = digitalRead(8); num3 = digitalRead(9); num4 = digitalRead(10); num5 = digitalRead(11); //讀出信號接口的值 if (num1 ==LOW) { //如果1號傳感器監(jiān)測到黑線,燈亮一次 digitalWrite(13, HIGH); delay(500); digitalWrite(13, LOW); delay(5000); } else if (num2 == LOW) { //如果2號傳感器監(jiān)測到黑線,燈亮兩次 digitalWrite(13, HIGH); delay(500); digitalWrite(13, HIGH); delay(500); digitalWrite(13, LOW); delay(5000); } else if (num3 == LOW) { //如果3號傳感器監(jiān)測到黑線,燈亮三次 digitalWrite(13, HIGH); delay(500); digitalWrite(13, HIGH); delay(500); digitalWrite(13, HIGH); delay(500); digitalWrite(13, LOW); delay(5000); } else if (num4 == LOW) { //如果4號傳感器監(jiān)測到黑線,燈亮四次 digitalWrite(13, HIGH); delay(500); digitalWrite(13, HIGH); delay(500); digitalWrite(13, HIGH); delay(500); digitalWrite(13, HIGH); delay(500); digitalWrite(13, LOW); delay(5000); } else if (num5 == LOW) { //如果5號傳感器監(jiān)測到黑線,燈亮五次 digitalWrite(13, HIGH); delay(500); digitalWrite(13, HIGH); delay(500); digitalWrite(13, HIGH); delay(500); digitalWrite(13, HIGH); delay(500); digitalWrite(13, HIGH); delay(500); digitalWrite(13, LOW); delay(5000); }}六.相關(guān)介紹
1、尋線傳感器
尋線傳感器是光電傳感器的一種,是根據(jù)反射式光電傳感器原理開發(fā)的專用機(jī)器人產(chǎn)品,可以幫助你的機(jī)器人進(jìn)行白線或黑線跟蹤,可以檢測白底中的黑線,也可以檢測黑底中的白線。尋線反饋信號可以提供穩(wěn)定的TTL電平輸出(開關(guān)量),使尋線更準(zhǔn)確更穩(wěn)定。其可用于光電測速、程控小車尋線,是輪式機(jī)器人的必備傳感器。
2、光電傳感器
光電傳感器是各種光電檢測系統(tǒng)中實(shí)現(xiàn)光電轉(zhuǎn)換的關(guān)鍵元件,它是把光信號(紅外、可見及紫外光輻射)轉(zhuǎn)變成為電信號的器件。由于光電傳感器具有結(jié)構(gòu)簡單、重量輕、體積小、響應(yīng)快、性能穩(wěn)定及具有很高的靈敏度等優(yōu)點(diǎn),因此在檢測和自動控制等領(lǐng)域中應(yīng)用廣泛。
光電傳感器按其工作原理可分為模擬式和脈沖式兩類。所謂模擬式,是指光敏器件的光電流的大小隨光通量的大小而變,為光通量的函數(shù)。而脈沖式光敏器件的輸出狀態(tài)僅有兩種穩(wěn)定的狀態(tài),也就是“通”與“斷”的開關(guān)狀態(tài),即光敏器件受光照時(shí),有電信號輸出,不受光照射時(shí),無電信號輸出。
光電傳感器在工業(yè)應(yīng)用中可歸納為直射式、透射式、反射式和遮蔽式等四種基本形式。Mini紅外尋線傳感器是根據(jù)反射式光電傳感器原理開發(fā)設(shè)計(jì)的,所以簡單介紹下此種工作方式。當(dāng)光源發(fā)射出的光通量(紅外線)投射到被測物體上,被測物體又將部分光通量反射到光敏器件上。反射的光通量取決于被測物體的反射條件。該形式常用于表面測量和轉(zhuǎn)速測量。
七、總結(jié)和經(jīng)驗(yàn)
根據(jù)以上原理我們設(shè)計(jì)了一個(gè)智能循跡小車,經(jīng)過不斷調(diào)試最終能在規(guī)定的黑線跑道上行駛。智能循跡小車作為機(jī)器人的典型代表,能夠?qū)崿F(xiàn)自動導(dǎo)引功能。它的原理是主要通過傳感器來感知導(dǎo)引線實(shí)現(xiàn)自動識別路線,選擇正確的行進(jìn)路線,并作出判斷和相應(yīng)的執(zhí)行動作。
此次循跡小車由5個(gè)傳感器傳輸信號,中間傳感器檢測黑線小車直行,左右各2個(gè)負(fù)責(zé)轉(zhuǎn)彎,當(dāng)檢測到黑線時(shí),循跡模塊紅燈亮起,管腳讀取值為0,檢測到白線時(shí)紅燈熄滅,管腳讀取值為1。
這里的循跡是指小車在白色地板上循黑線行走,采取的方法是紅外探測法,即利用紅外線在不同顏色的物體表面具有不同的反射性質(zhì)的特點(diǎn),在小車行駛過程中不斷地向地面發(fā)射紅外光。單片機(jī)就是否收到反射回來的紅外光為依據(jù)來確定黑線的位置和小車的行走路線。
在我們對小車進(jìn)行調(diào)試的過程中,遇到了幾個(gè)問題,現(xiàn)進(jìn)行總結(jié),希望對大家有所幫助。
1、傳感器檢測距離原理上為0.5~40mm,但小車前方五個(gè)循跡傳感器靈敏度很低,需緊貼地面才能識別到黑線,導(dǎo)致傳感器與地面摩擦影響小車行駛。
2、小車左右兩個(gè)電機(jī)電壓分配不平均。雖然不影響小車循跡但是對轉(zhuǎn)向大小的修改產(chǎn)生一定影響,導(dǎo)致左右輪轉(zhuǎn)不一致,要注意調(diào)節(jié)左右轉(zhuǎn)輪速度。
3、一開始程序設(shè)定處兩側(cè)燈檢測到黑線以外,所有情況均直行。但這種方法不適合直角等角度拐角過大的彎道,總會超出跑道,于是我們修改了代碼,只有中間檢測到黑線才會執(zhí)行,兩側(cè)檢測到黑線則拐彎。
但是隨之產(chǎn)生的問題是小車搖擺劇烈,經(jīng)過修改代碼參數(shù),我們把搖擺幅度降到了最低。當(dāng)遇到直角轉(zhuǎn)彎,或者急轉(zhuǎn)彎的時(shí),可將一次車輪轉(zhuǎn)速設(shè)為0,加大轉(zhuǎn)向幅度。
4、開始時(shí)if-else語句過于復(fù)雜給小車運(yùn)行帶來了一定的延遲。此時(shí)選擇代碼優(yōu)先級,當(dāng)碰到3個(gè)燈同時(shí)亮?xí)r,if else語句優(yōu)先執(zhí)行第一個(gè)滿足條件的語句,同時(shí)要注意處理好轉(zhuǎn)向問題。
代碼如下:
#include "config.h"int right1;int right2;int middle;int left2;int left1;void setup(){ setPin();}void loop(){ readDigitalValue(); judge(); //delay(50);}/*定義接口模式*/void setPin(){ pinMode(SensorRight1, INPUT); pinMode(SensorRight2, INPUT); pinMode(SensorMiddle, INPUT); pinMode(SensorLeft2, INPUT); pinMode(SensorLeft1, INPUT); pinMode(right, OUTPUT); pinMode(left, OUTPUT);}/*讀出信號接口的值*/void readDigitalValue(){ right1 = digitalRead(SensorRight1); right2 = digitalRead(SensorRight2); middle = digitalRead(SensorMiddle); left2 = digitalRead(SensorLeft2); left1 = digitalRead(SensorLeft1);}/*對運(yùn)行狀態(tài)進(jìn)行判斷并作出響應(yīng)*/void judge(){ if(right1==low&&right2==low&&left2==low){ analogWrite(right,0); analogWrite(left,180); } else if (right1 ==low) turnRightRapidly(); else if (right2== low) turnRight(); else if (middle== low) goStraight(); else if (left2 == low) turnLeft(); else if(left1 == low) turnLeftRapidly(); //else goStraight();}/*直行 返回值為空*/void goStraight(){ analogWrite(right,speedLow); analogWrite(left,speedSpecial);}/*快速左轉(zhuǎn) 當(dāng)檢測到左側(cè)第一個(gè)信號燈信號時(shí) 返回值為空*/void turnLeftRapidly(){ analogWrite(right,0); analogWrite(left,speedHigh);}/*快速右轉(zhuǎn) 當(dāng)檢測到右側(cè)第一個(gè)信號燈信號時(shí) 返回值為空*/void turnRightRapidly(){ analogWrite(right,speedHigh); analogWrite(left,0);}/*左轉(zhuǎn) 當(dāng)檢測到左側(cè)第二個(gè)燈信號時(shí) 返回值為空*/void turnLeft(){ analogWrite(right,20); analogWrite(left,speedMiddle);}/*右轉(zhuǎn) 當(dāng)檢測到右側(cè)第二個(gè)燈信號時(shí) 返回值為空*/void turnRight(){ analogWrite(right,speedMiddle); analogWrite(left,20);}配置文件 /* * right 右電機(jī)pwm輸出引腳 * left 左電機(jī)pwm輸出引腳 * low 檢測到黑線,指示燈亮 * high 檢測到白線,指示燈滅 * speedHigh 高速pwm值 * speedMiddle 中速pwm值 * speedLow 低速pwm值 * speedSpecial 直行左輪速度pwm值,調(diào)節(jié)兩個(gè)電機(jī)轉(zhuǎn)速誤差 * SensorRight1 右側(cè)第一個(gè)信號燈的引腳 * SensorRight2 右側(cè)第二個(gè)信號燈的引腳 * SensorMiddle 中間信號燈的引腳 * SensorLeft2 左側(cè)第二個(gè)信號燈的引腳 * SensorLeft1 左側(cè)第一個(gè)信號燈的引腳 * right1 讀取的右側(cè)第一個(gè)信號燈的信號 * right2 讀取的右側(cè)第二個(gè)信號燈的信號 * middle 讀取的中間信號燈的信號 * left2 讀取的左側(cè)第二個(gè)信號燈的信號 * left1 讀取的左側(cè)第一個(gè)信號燈的信號 */ #define right 3 #define left 6 #define low 0 #define high 1 #define speedHigh 222 #define speedMiddle 150 #define speedLow 70 #define speedSpecial 80 #define SensorRight1 4 #define SensorRight2 5 #define SensorMiddle 9 #define SensorLeft2 10 #define SensorLeft1 12關(guān)注我們的微信公眾號:xunmingiot,后臺回復(fù)“智能小車”,即可免費(fèi)獲得智能小車超級詳細(xì)的制作視頻,更可以獲取Arduino教程以及其他學(xué)習(xí)資源。有任何問題歡迎評論或在后臺留言!
總結(jié)
以上是生活随笔為你收集整理的arduino黑线循迹小车程序_循迹小车:给我一条线,我能自己走完全程的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: hystrix熔断和降级的区别_Ribb
- 下一篇: java 队列_用Java实现队列