【Arduino】基于Arduino的循迹小车电路连接与程序编写
文章目錄
- L298P工作原理:
- L298P與其他元件的連接方法:laughing:
- 與Arduino的連接
- 與紅外傳感器的連接:smile_cat:
- 電機的連接
- 程序編寫:smiley:
- Aruino函數說明
- 初始宏定義
- 功能函數定義
- 初始化函數
- 主任務循環
- 完整代碼如下:haircut:
- 無法循跡、出現錯誤怎么調:apple:
Author:1071094493@qq.com
L298P工作原理:
? 上圖是本文中使用的L298P驅動,他的作用是將輸入的3.3V或5V低壓信號轉換為高壓信號。
? 上圖是L298P的原理圖,從上圖可以看出對于L298P芯片而言當In1(單片機輸入)為高電平時輸出Out1將會和Vs(電源)連通也為高電平,當為低電平時Out1將會和地相連。對于(In2-Out2)(In3-Out3)(In4-Out4)這三種組合也是同樣的道理,通過電路結構我們發現,只有圖中的EnA與EnB同時為高電平時,四個輸出接口(Out1、Out2、Out3、Out4)才會出現有效值。利用這個特點我們可以通過拉低EnA和EnB的值來關閉輸出實現剎車的目的。
L298P與其他元件的連接方法😆
與Arduino的連接
首先將L298P電機驅動板查到Arduno板上如下圖所示:
安裝效果如下圖
與紅外傳感器的連接😸
? 本次實驗采用的紅外傳感器如下圖所示,有三個引腳VCC、GND和Out引腳。其中VCC為電源正極引腳,GND為電源負極引腳,Out為輸出腳。白色小燈泡發射紅外線,黑色小燈泡負責接收紅外信號。調節模塊上面藍色可調變阻器的阻值可以調節紅外傳感器的探測范圍。
? 當模塊可以收到紅外信號時模塊信號燈亮起,此時可以看到模塊上有兩個紅燈會亮(一個為電源燈,另一個為信號燈)。同時Out端電壓由高電平變為低電平。同樣的道理由于黑色吸收紅外光線能力強、白色反射能力強,當紅外對準白色區域時紅外線會被反射回來,Out由高到低,當對準黑線時白燈發射的紅外信號會被黑線吸收,模塊收不到紅外信號Out端就會被拉高,輸出高電平。
電機的連接
將電機驅動板與Arduino開發板按照第一步插在一起后按照上圖連好電機與紅外傳感器即可。
程序編寫😃
Aruino函數說明
| PWM輸出函數 | analogWrite(number,value); | number是十進制數字,對應Arduino引腳號。value為0-255之間的值。 |
| 開關數字量函數 | digitalWrite(number,HIGH/LOW) | number同上,第二個參數為HIGH時引腳輸出高電平,為LOW時輸出低。 |
初始宏定義
下方代碼是對接口的宏定義,采用宏定義而非變量原因在于,宏定義在程序運行時不可改變。
//對接口進行重命名(此處需要根據自己的驅動引腳分布進行改變-本文以L298P為例) #define ENA 10 #define ENB 11//IN1與IN2在電路中通過反相芯片進行反相因此不必再定義In2和In4 //IN3與IN4反相 #define IN1 12 #define IN3 13//將電機接口朝上 //L298P 從左至右分別為OUT 1 2 3 4//定義紅外傳感器輸入接口 //左側紅外使用8腳輸入,右側使用9腳 //壓到白線為低電平,壓到黑線輸出高電平 #define L_SENSE 8 #define R_SENSE 9紅外傳感器信號采集變量定義
//定義全局變量用于讀取紅外傳感器的值 int L=0; int R=0;功能函數定義
void start_run() {//開始運行analogWrite(ENA,100);analogWrite(ENB,100);digitalWrite(IN1,HIGH);digitalWrite(IN3,HIGH); }void stop_run() {//剎車analogWrite(ENA,0);analogWrite(ENB,0);digitalWrite(IN1,HIGH);digitalWrite(IN3,HIGH); }void direct_run() {//直行analogWrite(ENA,100);analogWrite(ENB,100);digitalWrite(IN1,HIGH);digitalWrite(IN3,HIGH); }void left_run() {//向左轉analogWrite(ENA,100);analogWrite(ENB,50);digitalWrite(IN1,HIGH);digitalWrite(IN3,HIGH); }void right_run() {//向右轉analogWrite(ENA,50);analogWrite(ENB,100);digitalWrite(IN1,HIGH);digitalWrite(IN3,HIGH); }初始化函數
void setup() {//初始化接口模式輸出pinMode(ENA,OUTPUT);pinMode(ENB,OUTPUT);pinMode(IN1,OUTPUT);pinMode(IN3,OUTPUT);//定義接口模式紅外輸入pinMode(L_SENSE, INPUT);pinMode(L_SENSE, INPUT);//設置串口波特率為9600Serial.begin(9600);//上電即開始運行start_run(); }主任務循環
void loop() {//分別讀取左右兩個紅外傳感器的狀態L=digitalRead(L_SENSE);R=digitalRead(R_SENSE);//當兩側同時為低電平時左右都不壓線if(L==LOW&&R==LOW){direct_run();}else if(L==LOW&&R==HIGH)//當右側壓線時向左轉{right_run();}else if(L==HIGH&&R==LOW)//當左側壓線時向右轉{left_run();}else{direct_run();//默認情況下直行 } }完整代碼如下💇
//對接口進行重命名 #define ENA 10 #define ENB 11//IN1與IN2在電路中通過反相芯片進行反相 //IN3與IN4反相 #define IN1 12 #define IN3 13//將電機接口朝上 //L298P 從左至右分別為OUT 1 2 3 4//定義紅外傳感器輸入接口 //左側紅外使用8腳輸入,右側使用9腳 //壓到白線為低電平,壓到黑線輸出高電平 #define L_SENSE 8 #define R_SENSE 9//定義全局變量用于讀取紅外傳感器的值 int L=0; int R=0;void setup() {//初始化接口模式輸出pinMode(ENA,OUTPUT);pinMode(ENB,OUTPUT);pinMode(IN1,OUTPUT);pinMode(IN3,OUTPUT);//定義接口模式紅外輸入pinMode(L_SENSE, INPUT);pinMode(L_SENSE, INPUT);//設置串口波特率為9600Serial.begin(9600);start_run(); }無法循跡、出現錯誤怎么調🍎
1:檢查電池電量是否充足
2:代碼沒有問題,經過檢驗可以進行循跡,不要隨便修改。
3:采用兩個紅外傳感器就行,傳感器之間距離不要太遠,也不要太靠近。兩傳感器分置黑線兩側、距離黑線2-3CM為佳。
4:紅外傳感器不要和驅動輪在同一天直線上,否則小車來不及反應,容易跑偏。
5:上電之后默認為直行,檢查兩個電機是否均為向前轉動,如果不是調換下電機兩個接口使其正向轉動。
6:此處定義紅外信號采集腳為8、9腳,如果無法循跡調換左右兩個紅外傳感器輸入腳試試,比如左側傳感器插入到9腳中。
總結
以上是生活随笔為你收集整理的【Arduino】基于Arduino的循迹小车电路连接与程序编写的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Python 贪吃蛇 代码
- 下一篇: 超宽带 DWM1000模块 应用