基于Arduino的循迹小车
基于Arduino的循跡小車
前言
該小車采用Arduino UNO主控制核心,通過傳感器傳來的信號,對當(dāng)前環(huán)境作出判斷,最后對電機(jī)做出相應(yīng)的動作。單片機(jī)通過紅外傳感器檢測場地黑線,從而控制電機(jī)驅(qū)動模塊,改變電機(jī)轉(zhuǎn)速來控制小車方向,從而達(dá)到循跡的目的。
一、系統(tǒng)概述1
整個系統(tǒng)包括Arduino UNO控制模塊、電機(jī)驅(qū)動模塊、循跡模塊、電源和小車車體
1.工作原理
通過高發(fā)射功率紅外光電二極管和高靈敏光電晶體管組成的傳感器循跡模塊判斷黑線路徑。
然后由Arduino UNO通過IO口控制L298N驅(qū)動模板改變兩個直流電機(jī)的工作狀態(tài)。 最后實現(xiàn)小車循跡。
二、循跡小車硬件
1.Arduino UNO
[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來直接上傳(img-YWBrmP3y-1624623473333)(C:\Users\86182\Desktop\IMG_20210622_231300_edit_482206866577982.jpg)]
2.電機(jī)模塊
選用雙軸直流減速馬達(dá)電機(jī)
[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來直接上傳(img-b0NP2AiC-1624623473335)(file:///C:\Users\86182\Documents\Tencent Files\185746080\Image\C2C\7AE20E026DA4751A18C0817431F58F19.jpg)]
電機(jī)驅(qū)動電路控制小車運(yùn)行方法
a1 a2 b1 b2
1 0 1 0 前進(jìn)
0 1 0 1 后退
1 0 0 1 左轉(zhuǎn)彎
0 1 1 0 右轉(zhuǎn)彎
0 0 0 0 停止
3.電機(jī)驅(qū)動模塊
L298N實物接線圖及驅(qū)動原理圖:
L298N是一個內(nèi)部有兩個H橋的驅(qū)動芯片,這樣電機(jī)的運(yùn)轉(zhuǎn)只需要用三個信號控制:兩個方向信號和一個使能信號。(輸入的電壓不可超過它的額定電壓)
L298N芯片的工作電壓需要兩路:
第一路:輸出供給電機(jī)回路的工作電源
第二路:輸入邏輯控制回路電源5V(電源出/入)
**+12V:**該引腳接的電壓是驅(qū)動模塊所能輸出給電機(jī)的最大電壓,一般 直接接電池。12V是由L298N芯片所能接受最大電壓而定,一般介入5~12V電壓。在此我們接入的電壓為兩節(jié)18650串聯(lián)的電壓,即3.7+3.7=7.4V;
GND: 在該項目中GND即為電源的負(fù)極,同時要保證Arduino開發(fā)板,驅(qū)動模塊等所有模塊的GND連在一起才可以正常工作。在某些復(fù)雜的項目中還需要區(qū)分?jǐn)?shù)字地和模擬地,在此不做詳細(xì)介紹。
+5V: L298N模塊內(nèi)含穩(wěn)壓電路,在模塊內(nèi)部將"+12V"引腳輸入的電壓轉(zhuǎn)化為可供開發(fā)板使用的+5V電壓,一般將次輸出接入到開發(fā)板為開發(fā)板供電。
L298N有兩路輸出,所以可以控制小車前進(jìn)、后退、轉(zhuǎn)彎,其中:
ENA: 代表第一路輸出的電壓大小。驅(qū)動模塊輸出電壓越高,電機(jī)轉(zhuǎn)速越快。
1.當(dāng)其輸入為0V的時候,驅(qū)動模塊輸出對第一路電機(jī)輸出電壓為0V;
2.當(dāng)其輸入為3.3V的時候,驅(qū)動模塊對第一路電機(jī)輸出電壓為"+12V"引腳的輸入電壓。
3.由于ENA輸入電壓的高低控制驅(qū)動對電機(jī)的輸出電壓,因此當(dāng)我們需要對小車運(yùn)動速度進(jìn)行控制的時候,一般通過PWM對"ENA"引腳進(jìn)行控制。
**IN1/IN2:**這兩個引腳控制電機(jī)正反轉(zhuǎn)方向。
**OUT1/OUT2:**這兩個引腳分別接電機(jī)的兩極。
ENB,IN3/IN4,OUT3/OUT4引腳控制第二路輸出,與上述ENB,IN3/IN4,OUT3/OUT4功能相似。
L298N接入直流電機(jī)的端口接法:
| 正轉(zhuǎn) | 0 | 1 | / | / | 1 | / | |
| M1 | 反轉(zhuǎn) | 1 | 0 | / | / | 1 | / |
| 停止 | 0 | 0 | / | / | 1 | / | |
| 正轉(zhuǎn) | / | / | 0 | 1 | / | 1 | |
| M2 | 反轉(zhuǎn) | / | / | 1 | 0 | / | 1 |
| 停止 | / | / | 0 | 0 | / | 1 |
4.循跡模塊
循跡原理: 利用紅外線對于不同顏色具有不同的反射性質(zhì)的特點。在小車行駛過程中傳感器的紅外發(fā)射二極管不斷發(fā)射紅外光,當(dāng)紅外光遇到白色地面時發(fā)生漫反射,紅外對管接收管接收反射光;如果遇到黑線則紅外光被吸收,則紅外管接收不到信號。
紅外對管采集回來的信號通過2路循跡傳感器模塊里面的LM339比較器后輸出高或低電平,從而實現(xiàn)信號的檢測。
所謂的差速,是指左右兩車輪的速度差,假如左邊車輪比右邊快,則小車會偏向右。同時,左邊的車輪轉(zhuǎn)速比右的滿,那么小車會向左邊轉(zhuǎn)動。
目前主要有以下兩種方式:
小車向左轉(zhuǎn),可以左輪停止,左輪繼續(xù)轉(zhuǎn)動,這樣可實現(xiàn)左轉(zhuǎn),這種方式實現(xiàn)小角度的轉(zhuǎn)彎,在角度不大時可采用此種方式。
小車向左轉(zhuǎn),可以是左輪反轉(zhuǎn),右輪正轉(zhuǎn),這樣可以實現(xiàn)大角度的左轉(zhuǎn),甚至可以進(jìn)行原地打轉(zhuǎn)。
同理可推出小車如何向右轉(zhuǎn)向。
采用TCRT5000
5.PWM調(diào)速
脈寬調(diào)制(PWM)基本原理:控制方式就是對逆變電路開關(guān)器件的通斷進(jìn)行控制,使輸出端得到一系列幅值相等的脈沖,用這些脈沖來代替正弦波或所需要的波形。也就是在輸出波形的半個周期中產(chǎn)生多個脈沖,使各脈沖的等值電壓為正弦波形,所獲得的輸出平滑且低次諧波少。按一定的規(guī)則對各脈沖的寬度進(jìn)行調(diào)制,即可改變逆變電路輸出電壓的大小,也可改變輸出頻率。
[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來直接上傳(img-BZ1MZfqG-1624623473340)(C:\Users\86182\Desktop\20170831114514554.gif)]
三、程序模塊
#define STOP 0 //停止 #define RUN 1 //前進(jìn) #define BACK 2 //后退 #define LEFT 3 //左轉(zhuǎn) #define RIGHT 4 //右轉(zhuǎn) int a1 = 6;//左電機(jī)1 int a2 = 7;//左電機(jī)2 int b1 = 8;//右電機(jī)1 int b2 = 9;//右電機(jī)2 int sensor1 = 5; //從車頭方向的最右邊開始排序 探測器 int sensor2 = 4; int sensor3 = 3; int sensor4 = 2; int leftPWM = 10;//L298N使能端左 int rightPWM = 11;//L298N使能端右 void setup() {Serial.begin(9600);//電機(jī)控制引腳初始化pinMode(a1, OUTPUT);pinMode(a2, OUTPUT);pinMode(b1, OUTPUT);pinMode(b2, OUTPUT);pinMode(leftPWM, OUTPUT);pinMode(rightPWM, OUTPUT);pinMode(sensor1, INPUT//尋跡模塊引腳初始化pinMode(sensor2, INPUT);pinMode(sensor3, INPUT);pinMode(sensor4, INPUT); } void loop() {tracing(); } void Work(int c,int value) {analogWrite(leftPWM, value); //設(shè)置PWM輸出,設(shè)置速度analogWrite(rightPWM, value);switch(c){case RUN:Serial.println("RUN"); //前進(jìn)輸出狀態(tài)digitalWrite(a1, HIGH);digitalWrite(a2, LOW);digitalWrite(b1, HIGH);digitalWrite(b2, LOW);break;case BACK:Serial.println("BACK"); //后退輸出狀態(tài)digitalWrite(a1, LOW);digitalWrite(a2, HIGH);digitalWrite(b1, LOW);digitalWrite(b2, HIGH);break;case LEFT:Serial.println("LEFT"); //左轉(zhuǎn)輸出狀態(tài)digitalWrite(a1, HIGH);digitalWrite(a2, LOW);digitalWrite(b1, LOW);digitalWrite(b2, HIGH);break;case RIGHT:Serial.println("RIGHT"); //右轉(zhuǎn)彎輸出狀態(tài)digitalWrite(a1, LOW);digitalWrite(a2, HIGH);digitalWrite(b1, HIGH);digitalWrite(b2, LOW);break;default:Serial.println("STOP"); //停止輸出狀態(tài)digitalWrite(a1, LOW);digitalWrite(a2, LOW);digitalWrite(b1, LOW);digitalWrite(b2, LOW);} } void tracing() {int d[4];d[0] = digitalRead(5);d[1] = digitalRead(4);d[2] = digitalRead(3);d[3] = digitalRead(2);if(!d[0] && !d[1] && !d[2] && !d[3]) //左右都沒有檢測到黑線{Work(RUN, 200);}if(d[0] || d[1]) //右邊檢測到黑線{Work(RIGHT, 150);}if(d[2] || d[3]) //左邊檢測到黑線{Work(LEFT, 150);}if(d[0] && d[3]) //左右都檢測到黑線是停止{Work(STOP, 0);while(1);}Serial.print(d[0]);Serial.print("---");Serial.print(d[1]);Serial.print("---");Serial.print(d[2]);Serial.print("---");Serial.println(d[3]); }總結(jié)
以上是生活随笔為你收集整理的基于Arduino的循迹小车的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: FGSM攻击机器学习模型
- 下一篇: eclipse安装与概述