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