智能小车-红外循迹篇
Record:2021/5/12日學院舉辦的智能小車比賽落下帷幕,特地將比賽出現(xiàn)的問題和經(jīng)歷總結(jié)一下,以表紀念。
比賽要求藍牙模板和超聲波,測距,目標跟蹤四個功能整合在一個程序上,另一項就是紅外循跡加避障(不是繞礙,不過也不難)。
我先將記憶深刻的紅外循跡避障程序記錄下來:
首先直接上代碼:
* 晶振:11.0592MHZZYWIFI0939WIFI控制智能機器人杜邦線接線方法,請一定照做,否則可能不工作,并燒毀小車。J3 接到實驗板 P4 J4 接實驗板 P7接口 IN1--接到--實驗板上的P1.2 IN5--接到--實驗板上的P2.1IN2--接到--實驗板上的P1.3 IN6--接到--實驗板上的P2.0EN1--接到--實驗板上的P1.4EN2--接到--實驗板上的P1.5IN3--接到--實驗板上的P1.6IN4--接到--實驗板上的P1.7J5 接實驗班P3接口OUT1--接到--實驗板上的P3.2 OUT3--接到--實驗板上的P3.4OUT2--接到--實驗板上的P3.3 OUT4--接到--實驗板上的P3.5VCC-- 接到--實驗班上的VCC GND--接到--實驗板上的GND******************************************************************/ #ifndef _LED_H_ #define _LED_H_//定義小車驅(qū)動模塊輸入IO口 sbit L293D_IN1=P1^2; sbit L293D_IN2=P1^3;sbit L293D_IN3=P1^4;sbit L293D_IN4=P1^5;sbit L293D_EN1=P1^6;sbit L293D_EN2=P1^7;/***蜂鳴器接線定義*****/sbit BUZZ=P2^3;#define Left_1_led P3_7 //左傳感器 #define Right_1_led P3_6 //右傳感器 #define mid_1_led P0^0 //中間循跡#define Left_2_led P3_4 //左避障傳感器 #define Right_2_led P3_5 //右避障傳感器 #define Left_moto_pwm P1_6 //PWM信號端#define Right_moto_pwm P1_7 //PWM信號端#define Left_moto_go {P1_2=1,P1_3=0;} //左電機向前走#define Left_moto_back {P1_2=0,P1_3=1;} //左邊電機向后轉(zhuǎn)#define Left_moto_Stop {P1_2=0,P1_3=0;} //左邊電機停轉(zhuǎn) #define Right_moto_go {P1_4=1,P1_5=0;} //右邊電機向前走#define Right_moto_back {P1_4=0,P1_5=1;} //右邊電機向后走#define Right_moto_Stop {P1_4=0,P1_5=0;} //右邊電機停轉(zhuǎn) unsigned char pwm_val_left =0;//變量定義unsigned char push_val_left =0;// 左電機占空比N/20unsigned char pwm_val_right =0;unsigned char push_val_right=0;// 右電機占空比N/20bit Right_moto_stop=1;bit Left_moto_stop =1;unsigned int time=0;/************************************************************************/ //延時函數(shù) void delay(unsigned int k) { unsigned int x,y;for(x=0;x<k;x++) for(y=0;y<200;y++); } /************************************************************************/ //前速前進void run(void) {push_val_left=20; //速度調(diào)節(jié)變量 0-20。。。0最小,20最大push_val_right=20;Left_moto_go ; //左電機往前走Right_moto_go ; //右電機往前走 }//后退函數(shù) void backrun(void) {push_val_left=12; //速度調(diào)節(jié)變量 0-20。。。0最小,20最大push_val_right=12;Left_moto_back; //左電機往后走Right_moto_back; //右電機往后走 }//左轉(zhuǎn)void leftrun(void) { push_val_left=14;push_val_right=20;Right_moto_go ; //右電機往前走Left_moto_go ; //左電機后走 }//急左轉(zhuǎn)void moreleft(void) { push_val_left=15;push_val_right=15;Right_moto_go ; //右電機往前走Left_moto_back ; //左電機后走 }//右轉(zhuǎn)void rightrun(void) { push_val_left=20;push_val_right=14;Left_moto_go ; //左電機往前走Right_moto_go ; //右電機往后走 } //急右轉(zhuǎn)void moreright(void) { push_val_left=16;push_val_right=16;Left_moto_go ; //左電機往前走Right_moto_back ; //右電機往后走 }//停止void stop(void) { Right_moto_Stop ; //右電機停止Left_moto_Stop ; //左電機停止 }/************************************************************************/ /* PWM調(diào)制電機轉(zhuǎn)速 */ /************************************************************************/ /* 左電機調(diào)速 */ /*調(diào)節(jié)push_val_left的值改變電機轉(zhuǎn)速,占空比 */void pwm_out_left_moto(void) { if(Left_moto_stop){if(pwm_val_left<=push_val_left){Left_moto_pwm=1; // Left_moto_pwm1=1; }else {Left_moto_pwm=0; // Left_moto_pwm1=0; }if(pwm_val_left>=20)pwm_val_left=0;}else {Left_moto_pwm=0; // Left_moto_pwm1=0; } } /******************************************************************/ /* 右電機調(diào)速 */ void pwm_out_right_moto(void) { if(Right_moto_stop){ if(pwm_val_right<=push_val_right){Right_moto_pwm=1; // Right_moto_pwm1=1; }else {Right_moto_pwm=0; // Right_moto_pwm1=0; }if(pwm_val_right>=20)pwm_val_right=0;}else {Right_moto_pwm=0; // Right_moto_pwm1=0; } }/***************************************************/ ///*TIMER0中斷服務(wù)子函數(shù)產(chǎn)生PWM信號*/void timer0()interrupt 1 using 2 {TH0=0XFc; //1Ms定時TL0=0X18;time++;pwm_val_left++;pwm_val_right++;pwm_out_left_moto();pwm_out_right_moto();} /*********************************************************************/ #endif #include<AT89X52.H> //包含51單片機頭文件,內(nèi)部有各種寄存器定義#include<ZY-4WD_PWM.H> //包含HL-1藍牙智能小車驅(qū)動IO口定義等函數(shù)//主函數(shù)void main(void) { unsigned char i;unsigned char flag; // 標記點P1=0X00; //關(guān)電機 TMOD=0X01;TH0= 0XFc; //1ms定時TL0= 0X18;TR0= 1;ET0= 1;EA = 1; //開總中斷while(1) //無限循環(huán){ if(Left_2_led==0 || Right_2_led==0) //遇到障礙物{ backrun();delay(1);stop();}//有信號為0 沒有信號為1if(Left_1_led==1&&mid_1_led==1&&Right_1_led==1)//亮的時候為0,1才檢測到黑線{ run();}if(Left_1_led==1&&mid_1_led==1&&Right_1_led==0) {leftrun();flag=0;delay(1); }if(Left_1_led==0&&mid_1_led==1&&Right_1_led==1) { rightrun();flag=1; delay(1); }if(Right_1_led==1&&Left_1_led==1) { run(); }if(Left_1_led==0&&mid_1_led==0&&Right_1_led==0)//亮的時候為0,1才檢測到黑線{ //跑出賽道if(flag==1) { //右急轉(zhuǎn)moreright();} if(flag==0) { //左急轉(zhuǎn)moreleft();} }} }我們在基礎(chǔ)的代碼上進行的修改,讓它的速度盡量發(fā)揮到極致,這個小車在淘寶上買的,大概兩百多,感興趣的話可以買一輛挺好玩的。
根據(jù)小車傳感器原理圖我們可以知道P3.6,P3.7,P0.0為三個紅外循跡傳感器,P3.4,P3.5為左右避障傳感器大家要根據(jù)原理圖進行更改,需要原理圖的可以私聊我,在調(diào)試小車時,就因為沒有認真看原理圖在代碼編寫的時候一直出問題,還有一定一定一定要將代碼放在準確的文件夾里,我好多次就是改代碼改了一下午沒找到錯誤,后來才發(fā)現(xiàn)代碼寫到另一個備份的文件夾里,白白浪費一個下午的時間。
代碼部分,我們在原代碼的基礎(chǔ)上增加了flag函數(shù),這是為了在速度極高的情況之下,小車就有跑出賽道的可能卻依然能跑回賽道(這也就意味著沒檢測到黑線小車就會跑了)。正是這個flag函數(shù)的存在使得可以將小車的硬件發(fā)揮到極致,所以我們把PWM調(diào)速調(diào)到最高小車也不會跑離賽道太多(會有一丟丟的跑出去),避障的話我加了一個后退的函數(shù),避免速度太快直接撞上。至少電機反轉(zhuǎn)減速倒退然后保持一定距離。?
下面就是測試哪個速度能將跑出最快的成績了,我們用黑色膠帶在宿舍自己搞了一個賽道然后測試時間:
最左邊是前進速度左右電機都為20,左右電機在轉(zhuǎn)向的時候都是向前走,依靠兩邊的速度差進行轉(zhuǎn)向(測試過一邊電機向后一邊向前轉(zhuǎn),不過速度不太理想);后面最好速度為一圈11.3秒,可能存在一些偶然誤差,不過這確實是比較理想的數(shù)據(jù)了。
然后靜靜等待比賽結(jié)果了,不管怎樣這五天和同學一起研究挺開心的,不論結(jié)果如何不斷沖刺吧!
我們的目標可是不斷超越!
總結(jié)
以上是生活随笔為你收集整理的智能小车-红外循迹篇的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: PS去除白色背景
- 下一篇: 大功率UWB模块 XZM3000 移植手