智能寻迹小车以及程序

合集下载

智能循迹避障小车完整程序(亲测好使)

智能循迹避障小车完整程序(亲测好使)

智能循迹避障小车完整程序(亲测好使)/*******************************************//利用51定时器产生PWM波来调节电机速度//速度变化范围从0-100可调//使用三路做寻迹使用,哪一路检测在黑线哪一路为//高电平//没检测到黑线表示有反射对应输出低电平信号*********************************************/#include<>#define uint unsigned int#define uchar unsigned char/*电机四个接口定义*/sbit in1=P0^0;sbit in2=P0^1;sbit in3=P0^2;sbit in4=P0^3;/*计时器*/uchar j,k,i,a,A1,A2,second,minge,minshi;sbit dula=P2^6;sbit wela=P2^7;uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};uchar code table2[]={0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef,0xf7,0xfc,0xb9,0xde,0xf9,0xf1};void delay(uchar i){for(j=i;j>0;j--)for(k=110;k>0;k--);}void display(uchar sh_c,uchar g_c,uchar min_ge,uchar min_shi) {dula=1;P0=table[sh_c];dula=0;P0=0xff;wela=1;P0=0xfb;wela=0;delay(5);dula=1;P0=table[g_c];dula=0;P0=0xff;wela=1;P0=0xf7;wela=0;delay(5);dula=1;P0=table[min_shi];dula=0;P0=0xff;wela=1;P0=0xfe;wela=0;delay(5);dula=1;P0=table2[min_ge];dula=0;P0=0xff;wela=1;P0=0xfd;wela=0;delay(5);}/*左、中、右三路循迹传感器接口定义*/ sbit zuo=P1^0; sbit zhong=P1^1;sbit you=P1^2;/*避障接口定义*/sbit bz_zuo=P1^3;sbit bz_zhong=P1^4;sbit bz_you=P1^5;uchar count = 0;/*利用定时器0定时中断,产生PWM波*/ void Init_timer() {TH0 = (65535-10)/256;TL0 = (65535-10)%256;TMOD = 0x01;TR0 = 1;ET0 = 1;EA = 1;}/*左轮速度调节程序*/void zuolun(uchar speed){if(count <= speed) //count计数变量{in1 = 1;in2 = 0;}else{in1 = 0;in2 = 1;}}void youlun(uchar speed) //同上{if(count<= speed){in3 = 1;in4 = 0;}else{in3 = 0;in4 = 1;}}void Inline() //检测黑线信号{uchar temp;temp =P1;switch(temp){case 0x01:zuolun(0); youlun(90);break; //左侧循迹传感器压线,小车向左前修正case 0x02:zuolun(100);youlun(100);break; //中间循迹传感器压线,保持直走此处两值使电机速度保持相同case 0x04:zuolun(90); youlun(0);break; //右侧循迹传感器压线,小车向右前修正case 0x08:zuolun(90); youlun(0);break; //左侧避障传感器有信号小车右转case 0x10:zuolun(90); youlun(0);break; //中间避障传感器有信号小车左转case 0x20:zuolun(90); youlun(0);break; //右侧避障传感器有信号小车左转}/*if(zuo==1){zuolun(10);youlun(50);}else if(zhong==1){zuolun(99);youlun(99);}else if(you==1){zuolun(50);youlun(10);} */}void main() //主函数{Init_timer(); //调用函数while(1){Inline();minge=0;minshi=0;second++;if(second==60)second=0,minge++;A1=second/10;A2=second%10;if(minge==10)minge=0,minshi++;for(a=200;a>0;a--){display(A1,A2,minge,minshi);};}}void Timer0_int()interrupt 1 //定时器中断计数{TH0 = (65535-10)/256;TL0 = (65535-10)%256;count ++;if(count >= 100){count = 0;}}。

智能寻迹小车及程序

智能寻迹小车及程序

寻迹小车在历届全国大学生电子设计竞赛中多次出现了集光、机、电于一体的简易智能小车题目。

笔者通过论证、比较、实验之后,制作出了简易小车的寻迹电路系统。

整个系统基于普通玩具小车的机械结构,并利用了小车的底盘、前后轮电机及其自动复原装置,能够平稳跟踪路面黑色轨迹运行。

总体方案整个电路系统分为检测、控制、驱动三个模块。

首先利用光电对管对路面信号进行检测,经过比较器处理之后,送给软件控制模块进行实时控制,输出相应的信号给驱动芯片驱动电机转动,从而控制整个小车的运动。

系统方案方框图如图1所示。

图1 智能小车寻迹系统框图传感检测单元小车循迹原理该智能小车在画有黑线的白纸“路面”上行驶,由于黑线和白纸对光线的反射系数不同,可根据接收到的反射光的强弱来判断“道路”—黑线。

笔者在该模块中利用了简单、应用也比较普遍的检测方法——红外探测法。

红外探测法,即利用红外线在不同颜色的物理表面具有不同的反射性质的特点。

在小车行驶过程中不断地向地面发射红外光,当红外光遇到白色地面时发生漫发射,反射光被装在小车上的接收管接收;如果遇到黑线则红外光被吸收,则小车上的接收管接收不到信号。

传感器的选择市场上用于红外探测法的器件较多,可以利用反射式传感器外接简单电路自制探头,也可以使用结构简单、工作性能可靠的集成式红外探头。

ST系列集成红外探头价格便宜、体积小、使用方便、性能可靠、用途广泛,所以该系统中最终选择了ST168反射传感器作为红外光的发射和接收器件,其内部结构和外接电路均较为简单,如图2所示:图2 ST168检测电路ST168采用高发射功率红外光、电二极管和高灵敏光电晶体管组成,采用非接触式检测方式。

ST168的检测距离很小,一般为8~15毫米,因为8毫米以下是它的检测盲区,而大于15毫米则很容易受干扰。

笔者经过多次测试、比较,发现把传感器安装在距离检测物表面10毫米时,检测效果最好。

R1限制发射二极管的电流,发射管的电流和发射功率成正比,但受其极限输入正向电流50mA的影响,用R1=150的电阻作为限流电阻,Vcc=5V作为电源电压,测试发现发射功率完全能满足检测需要;可变电阻R2可限制接收电路的电流,一方面保护接收红外管;另一方面可调节检测电路的灵敏度。

智能寻迹小车实验报告

智能寻迹小车实验报告

智能寻迹小车实验报告
实验目的:
设计一个智能寻迹小车,能够依据环境中的黑线自主行驶,并避开障碍物。

实验材料:
1. Arduino开发板
2. 电机驱动模块
3. 智能车底盘
4. 红外传感器
5. 电源线
6. 杜邦线
7. 电池
实验步骤:
1. 按照智能车底盘的说明书将车底盘组装起来。

2. 将Arduino开发板安装在车底盘上,并与电机驱动模块连接。

3. 连接红外传感器到Arduino开发板上,以便检测黑线。

4. 配置代码,使小车能够依据红外传感器检测到的黑线自主行驶。

可以使用PID控制算法来控制小车的速度和方向。

5. 测试小车的寻迹功能,可以在地面上绘制黑线,观察小车是否能够准确地跟随黑线行驶。

6. 根据需要,可以添加避障功能。

可以使用超声波传感器或红外避障传感器来检测障碍物,并调整小车的行驶路线。

实验结果:
经过实验,可以发现小车能够依据红外传感器检测到的黑线自主行驶,并能够避开障碍物。

小车的寻迹功能和避障功能能够实现预期的效果。

实验总结:
本次实验成功设计并实现了智能寻迹小车。

通过使用Arduino 开发板、电机驱动模块和红外传感器等材料,配合合适的代码配置,小车能够准确地跟随黑线行驶,并能够避开障碍物。

该实验展示了智能小车的基本原理和应用,为进一步研究和开发智能车提供了基础。

智能循迹小车程序

智能循迹小车程序

智能小车程序(共三个)第一个:#include "reg52.h"#define det_Dist 2.55 //单个脉冲对应的小车行走距离,其值为车轮周长/4#define RD 9 //小车对角轴长度#define PI 3.1415926#define ANG_90 90#define ANG_90_T 102#define ANG_180 189/*============================全局变量定义区============================*/sbit P10=P1^0; //控制继电器的开闭sbit P11=P1^1; //控制金属接近开关sbit P12=P1^2; //控制颜色传感器的开闭sbit P07=P0^7; //控制声光信号的开启sbit P26=P2^6; //接收颜色传感器的信号,白为0,黑为1sbit P24=P2^4; //左sbit P25=P2^5; //右接收左右光传感器的信号,有光为0unsigned char mType=0; //设置运动的方式,0 向前1 向左2 向后3 向右unsigned char Direction=0; //小车的即时朝向0 朝上1 朝左2 朝下3 朝右unsigned sX=50; unsigned char sY=0; //小车的相对右下角的坐标CM(sX,sY)unsigned char StartTask=0; //获得铁片后开始执行返回卸货任务,StartTask置一unsigned char Inter_EX0=0; // 完成一个完整的任务期间只能有一次外部中断// Inter_EX0记录外部中断0的中断状态// 0 动作最近的前一次未中断过,// 1 动作最近的前一次中断过unsigned char cntIorn=0; //铁片数unsigned char bkAim=2; //回程目的地,0为A仓库,1为B仓库,2为停车场,//(在MAIN中接受铁片颜色判断传感器的信号来赋值)unsigned char Light_Flag=0;//进入光引导区的标志(1)unsigned int cntTime_5Min=0;//时间周期数,用于T0 精确定时unsigned int cntTime_Plues=0; //霍尔开关产生的脉冲数/*============================全局变量定义区============================*//*------------------------------------------------*//*-----------------通用延迟程序-------------------*//*------------------------------------------------*/void delay(unsigned int time) // time*0.5ms延时{unsigned int i,j;for(j=0;j<time;j++){for(i=0;i<60;i++){;}}}/*-----------------------------------------------*//*-------------------显示控制模块----------------*//*-----------------------------------------------*//*数码管显示,显示铁片的数目(设接在P0,共阴)*/void Display(unsigned char n){char Numb[12]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x37,0x77}; P0=Numb[n];}/*-----------------------------------------------*//*-------------------传感器模块------------------*//*-----------------------------------------------*//*光源检测程序: *//*用于纠正小车运行路线的正确性*/unsigned char LightSeek(){ void Display(unsigned char);bit l,r;l=P24;r=P25;if(l==0&&r==1){//Display(1);return (3); //偏左,向右开}if(r==0&&l==1){//Display(3);return(1); //偏右,向左开}if((l==1&&r==1)||(l==0&&r==0)){//Display(9);return(0); //没有偏离,前进}}/*铁片检测程序: *//*判断铁片的颜色,设定bkAim,0为A仓库,1为B仓库,2为停车场*/ void IornColor(){delay(4000);bkAim=(int)(P26);Display((int)(P26)+2);}/*-----------------------------------------------*//*------------------运动控制模块-----------------*//*-----------------------------------------------*//*====基本动作层:完成基本运动动作的程序集====*//*运动调整程序: *//*对小车的运动进行微调*/void ctrMotor_Adjust(unsigned char t){if(t==0){P2=P2&240|11; //用来解决两电机不对称的问题delay(6);}if(t==3){P2=P2&250; //向左走delay(1);}if(t==1){P2=(P2&245);delay(1); //向右走}P2=((P2&240)|15);delay(10);}/*直走程序: *//*控制小车运动距离,dist为运动距离(cm),type为运动方式(0 2)*/ /*只改变小车sX 和sY的值而不改变Direction的值. */ void ctrMotor_Dist(float dist,unsigned char type){unsigned char t=0;mType=type;P2=((P2&240)|15);cntTime_Plues=(int)(dist/det_Dist);while(cntTime_Plues){if(Inter_EX0==1&&StartTask==0){cntTime_Plues=0;break;}if(Light_Flag==1) t=LightSeek();if(type==0) //向前走{P2=P2&249;delay(40);ctrMotor_Adjust(t);}if(type==2) //向后退{P2=P2&246;delay(50);ctrMotor_Adjust(t);}P2=((P2&240)|15);if(mType==2) delay(60);//刹车制动0.5mselse delay(75);}}/*拐弯程序: *//*控制小车运动角度,type为运动方式(1 3)*//*只改变小车Direction的值而不改变sX 和sY的值*/void ctrMotor_Ang(unsigned char ang,unsigned char type,unsigned char dir) {unsigned char i=0;mType=type;P2=((P2&240)|15);cntTime_Plues=(int)((PI*RD*90/(180*det_Dist)*1.2)*ang/90);while(cntTime_Plues){if(Inter_EX0==1&&StartTask==0){cntTime_Plues=0;break;}if(type==1) //向左走{P2=P2&250;delay(100);ctrMotor_Adjust(0);}if(type==3) //向右走{P2=P2&245;delay(100);ctrMotor_Adjust(0);}P2=((P2&240)|15);delay(50);//刹车制动0.5ms}if(!(Inter_EX0==1&&StartTask==0)){Direction=dir;}}/*====基本路线层:描述小车基本运动路线的程序集====*//*当小车到达仓库或停车场时,放下铁片或停车(0,1为仓库,2为停车场)*/void rchPlace(){unsigned int time,b,s,g;time=(int)(cntTime_5Min*0.065535);//只有一个数码管时,轮流显示全过程秒数个十百b=time%100;s=(time-b*100)%100;g=(time-b*100-s*10)%10;if(bkAim==2){//到达停车场了,停车EA=0;P2=((P2&240)|15);while(1){Display(10); //Ndelay(2000);Display(cntIorn);delay(2000);Display(11);//Adelay(2000);Display(b);delay(2000);Display(s);delay(2000);Display(g);delay(2000);}}else{if(Inter_EX0==1&&StartTask==1)P10=0; //到达仓库,卸下铁片}}/*无任务模式: *//*设置小车的固定运动路线,未发现铁片时的运动路线*/void BasicRoute(){ //Light_Flag=1;ctrMotor_Dist(153,0);//Light_Flag=0;ctrMotor_Ang(ANG_90,1,1);ctrMotor_Dist(100-sX,0);ctrMotor_Dist(125,2);ctrMotor_Dist(73,0);ctrMotor_Ang(ANG_90,1,2);//Light_Flag=1;ctrMotor_Dist(153,0);//Light_Flag=0;ctrMotor_Ang(ANG_180,1,0);rchPlace();}/*任务模式: *//*设置小车的发现铁片后的运动路线*/void TaskRoute(){//基本运行路线表,记载拐弯0 向前1 左拐2 向后3 右拐,正读去A区;反读去B区StartTask=1;ctrMotor_Ang(ANG_90_T,1,2);if(bkAim==1) //仓库A{ctrMotor_Dist(10,0);P2=((P2&240)|15);delay(60);ctrMotor_Ang(ANG_90_T,1,3);ctrMotor_Dist(100-sX,2);ctrMotor_Ang(ANG_90_T,1,2);Light_Flag=1;ctrMotor_Dist(153,2);Light_Flag=0;// ctrMotor_Ang(208,1,0);}else if(bkAim==0) //仓库B{ctrMotor_Dist(10,0);P2=((P2&240)|15);delay(60);ctrMotor_Ang(ANG_90_T,1,3);ctrMotor_Dist(100-sX,0);ctrMotor_Ang(ANG_90_T,1,0);Light_Flag=1;ctrMotor_Dist(153,2);Light_Flag=0;//ctrMotor_Ang(208,1,0);}delay(5000);rchPlace();}/*---------------------------------------------*//*-------------------主程序段------------------*/ /*---------------------------------------------*/void main(){delay(4000);P2=0xff; //初始化端口P07=0;P1=0;TMOD=0x01; //初始化定时器0/1 及其中断TL0=0;TH0=0;TR0=1;ET0=1;ET1=1;IT0=1; //初始化外部中断EX0=1;IT1=1;EX1=1;EA=1;P11=1;while(1){Display(cntIorn);bkAim=2;BasicRoute();if(Inter_EX0==1){TaskRoute();//按获得铁片后的路线运动IE0=0;EX0=1;}Inter_EX0=0;}}/*----------------------------------------------------*//*----------------------中断程序段--------------------*//*----------------------------------------------------*//*定时器0中断程序: *//*当时间过了5分钟,则就地停车并进入休眠状态*/ void tmOver(void) interrupt 1{cntTime_5Min++;TL0=0;TH0=0;if(cntTime_5Min>=4520){Display(5);P2=((P2&240)|15);EA=0; //停车程序P07=1;delay(4000);PCON=0X00;while(1);}}/*外部中断0中断程序: *//*发现铁片,发出声光信号并将铁片吸起,发光二极管和蜂鸣器*//*并联在一起(设接在P07). 0为A仓库,1为B仓库,2为停车场*/ void fndIorn(void) interrupt 0{unsigned char i;P10=1;P2=((P2&240)|15); //停车P07=1;delay(1000);//刹车制动0.5msP07=0;Inter_EX0=1;cntIorn++;Display(cntIorn);for(i=0;i<40;i++){P2=P2&249;delay(2);P2=((P2&240)|15);delay(2);}P2=P2&249;delay(100);P2=((P2&240)|15); //停车IornColor(); //判断铁片黑白,设置bkAimfor(i=0;i<95;i++)P2=P2&249;delay(3);P2=((P2&240)|15);delay(2);}P2=((P2&240)|15); //停车delay(4000); //把铁片吸起来EX0=0;}/*外部中断1中断程序: *//*对霍尔开关的脉冲记数,对小车的位置进行记录,以便对小车进行定位*/ void stpMove(void) interrupt 2{cntTime_Plues--;if(Direction==0) //向上{if(mType==0) sY+=det_Dist;else if(mType==2)sY-=det_Dist;}else if(Direction==1) //向左{if(mType==0) sX+=det_Dist;else if(mType==2)sX-=det_Dist;}else if(Direction==2) //向下{if(mType==0) sY-=det_Dist;else if(mType==2)sY+=det_Dist;}else if(Direction==3) //向右{if(mType==0) sX-=det_Dist;else if(mType==2)sX+=det_Dist;}第二个:#include<reg52.h>#define uchar unsigned char#define uint unsigned intsbit moto1=P1^5;sbit moto2=P1^6;sbit moto3=P2^0;sbit moto4=P2^1;sbit en1=P1^7;sbit en2=P2^2;//*循迹口七个红外传感器*///////////////sbit left1=P1^0;//*左边传感器*//sbit left2=P1^1;sbit left3=P1^2;sbit mid=P1^3;//*黑线位置*//sbit right1=P1^4;sbit right2=P2^3;sbit right3=P2^4;//*右边传感器*//////////////// sbit hled=P0^0;sbit bled=P0^1;sbit lled=P0^2;sbit rled=P0^3;sbit bizhang=P2^5;uchar pro_head;uchar pro_back;uchar i;uchar j; //前后占空比标志void delay(uint z){uchar i;while(z--){for(i=0;i<121;i++);}}/********初始化定时器,中断************/ void init(){TMOD=0x01;TH0=(65536-100)/256;TL0=(65536-100)%256;EA=1;TR0=1;en1=1;en2=1;}void time0(void) interrupt 1{i++;j++;if(i<=pro_back){en1=1;}else{en1=0;}if(i==40){en1=~en1;i=0;}if(j<=pro_head){en2=1;}else{en2=0;}if(j==40){en2=~en2;j=0;}TH0=(65536-100)/256;TL0=(65536-100)%256;}void qianjin()//*直行*///////////////////// {pro_back=15;pro_head=5;moto1=0;moto2=0;moto4=0;lled=1;rled=1;bled=1;}void turn_right1()//*右转1函数*//{pro_back=10;pro_head=15;moto1=0;moto2=1;moto3=1;moto4=0;}。

自动循迹小车(附有程序)

自动循迹小车(附有程序)

大学生电子设计竞赛自动循迹小车目录摘要 (1)1.方案论证 (2)1.1方案描述 (2)1.2单片机方案的比较与论证 (2)1.3编码器选择与论证 (2)1.4 LDC1000与LDC1314选择与论证 (3)1.5 OLED显示方案 (3)1.6蜂鸣器发声方案 (3)2.理论分析与计算 (3)2.1速度增量式PID计算 (3)2.2舵机位置式PID算法 (3)3.电路与程序设计 (4)3.1系统组成 (4)3.2系统流程图 (5)4.测试方案与测试结果 (5)4.1测试方案 (5)4.1.1舵机测试方案 (6)4.1.2电机测试方案 (6)4.2系统测试结果分析 (6)5.结论 (6)6.参考文献 (7)摘要本循迹小车以单片机XS128为控制核心,主要由LDC1314感应模块、稳压模块、液晶显示模块、驱动控制模块、蜂鸣器模块、编码器、舵机以及小车组成。

跑道的标识为一根直径0.6~0.9mm的细铁丝,小车在规定的平面跑道自动按顺时针方向循迹前进。

在任意直线段铁丝上放置4个直径约19mm的镀镍钢芯硬币(第五套人民币的1角硬币),硬币边缘紧贴铁丝。

实验结果表明,在直线区任意指定一起点(终点),小车都能够依据跑道上设置的铁丝标识,能够自动绕跑道跑完一圈,而且时间不超过10分钟,小车运行时始终保持轨迹铁丝位于小车垂直投影之下,小车路过硬币时能够发现并发出声音提示,显示屏上能够实时显示小车行驶的距离和运行时间。

关键词:自动循迹 LDC1314 实时显示自动循迹小车1.方案论证1.1方案描述自动循迹小车依据电磁感应原理,由单片机XS128控制,控制系统是由XS128控制模块、LDC1314感应模块、稳压模块、液晶显示模块、驱动控制模块、蜂鸣器模块、编码器、舵机以及电动小车组成的闭环控制系统。

LDC1314感应模块采集小车在跑道上位置与角度信息,利用XS128单片机处理位置与角度数据后调节舵机打角并通过PID精确算法调整后轮速度。

智能小车的循迹避障行驶说明书

智能小车的循迹避障行驶说明书

智能小车的循迹避障行驶目录摘要 (III)Abstract (IV)第一章绪论 (1)1.1 课题背景 (1)1.2 研究目的及意义 (1)1.3 本设计完成的工作 (2)第二章总体设计方案 (3)2.1 方案选择及论证 (4)4446662.2 最终方案 (7)第三章硬件设计 (8)3.1 主控器STC89C52 (8)3.2 单片机复位电路设计 (10)3.3 单片机时钟电路设计 (10)3.4 避障模块 (10)3.5 电源设计 (11)3.6 电机驱动模块 (12)3.7 红外循迹模块 (13)3.8 小车车体总体设计 (15)第四章软件设计 (16)4.1 主程序流程图 (16)第五章系统的安装与调试 (18)5.1 系统的安装 (18)5.2 电路的调试 (19) (20)205.3 测试结果与分析 (20)结论 (21)参考文献 (22)致谢........................................................ 错误!未定义书签。

附录1 整机电路原理图.. (22)附录2 部分源程序 (23)智能小车的循迹避障行驶摘要在现代化的生产生活中,智能机器人已经渐渐普及到国防、工业、交通、生活等各个领域。

为了使生产更加有效率更加安全,使生活更加方便、轻松,智能机器人起到了越来越重要的作用。

智能小车属于智能机器人的一种,同样能给生产生活带来极大的便利。

它能够自己判断路面情况,并将各种信息反馈给单片机。

所用到的学科有自动控制原理、传感器技术、计算机和信息技术等多门学科。

智能车能够在一定程度上解放人的双手、减小工作强度从而改善人们的生活,提高生产的质量和效率。

能够自动循迹和避绕障碍物行驶则是智能小车需要的最基本的功能。

小车之所以能够自动避开障碍物并进行循迹是因为它可以感测引导线和行进路上的障碍物,因此这里采用超声波测距模块和红外传感器来实现这些功能。

本文先介绍了选题的背景及发展前景,描述了智能车在生产和生活中发展和应用的情况;接着对硬件部分所用器件的原理和特点进行了介绍;然后对软件设计和机械部分进行说明;在文章的最后就整个过程的体会及智能机器人的发展进行了总结和展望。

单片机的智能循迹小车

单片机的智能循迹小车
多次测试:在实际环境中进行多次测试,以验证程序的稳定性和可靠性
调试方法
A
总之,基于 51单片机的 智能循迹小 车是一种简 单实用的智 能控制系统
B
通过合理的 硬件设计和 软件编程, 可以实现小 车的自动循
迹功能
C
在调试过程中, 需要逐步排查 问题,不断优 化程序,以提 高系统的性能
和稳定性
感/谢/聆/听
以及调试方法
1
原理
原理
1Байду номын сангаас
基于51单片机的智能循迹小车通过传感器检测小车与路径之间的距 离,将检测到的信号转换为电平信号,然后通过单片机进行处理
单片机根据接收到的信号控制电机驱动模块,从而控制小车的运动 方向和速度
2
3
通过不断调整小车的运动方向和速度,使得小车能够沿着指定的路 径进行运动
2
硬件组成
51单片机的智能 循迹小车
-
01
原理
02 硬件组成
03 软件设计 04 调试方法
51单片机的智能循迹小车
1
智能循迹小车是一种自动 控制系统,能够沿着指定
的路径进行运动
2
基于51单片机的智能循迹 小车是一种使用51单片机 作为主控制器的智能循迹
小车
3
下面将详细介绍基于51单 片机的智能循迹小车的原 理、硬件组成、软件设计
4
调试方法
调试方法
基于51单片机的智能循迹小车的调试方法主要包括以下几个步骤
硬件调试:检查硬件连接是否正确,确保电源、传感器、电机驱动模块等设备 能够正常工作
软件调试:通过调试器或仿真器对程序进行调试,检查程序是否存在语法错误 或逻辑错误
实际环境测试:将调试好的程序下载到单片机中,然后在实际环境中进行测试 。观察小车的运动情况,如果存在偏差或问题,需要对程序进行调整和优化

智能小车红外循迹原理

智能小车红外循迹原理

智能小车红外循迹原理一、概述智能小车红外循迹是一种基于红外线传感器的自动导航技术。

该技术通过对小车周围环境的监测和分析,实现小车在特定路径上自动行驶。

本文将详细介绍智能小车红外循迹的原理、构成以及工作流程。

二、原理智能小车红外循迹原理基于红外线传感器。

当物体发生温度变化时,会产生不同的红外辐射,而红外线传感器可以检测到这些辐射并转化为电信号输出。

通过对不同位置的红外辐射信号进行分析,我们可以得到一个环境温度分布图。

在智能小车中,我们通常使用两个或多个红外线传感器。

当小车行驶时,这些传感器会不断地检测周围环境的温度变化,并将其转换为电信号输出。

通过对这些信号进行处理和比较,我们可以确定小车当前所处位置以及应该向哪个方向前进。

三、构成智能小车红外循迹系统通常由以下几部分组成:1. 硬件部分:包括主控板、电机驱动模块、红外线传感器、电源等。

2. 软件部分:主要由程序控制,包括数据采集、处理和控制小车运动的算法等。

3. 机械部分:包括车身、轮子、齿轮等。

四、工作流程智能小车红外循迹的工作流程如下:1. 初始化:启动小车系统,进行硬件和软件的初始化操作。

2. 数据采集:通过红外线传感器对周围环境进行温度检测,并将检测到的信号转换为电信号输出。

3. 数据处理:将采集到的信号进行处理和比较,确定小车当前所处位置以及应该向哪个方向前进。

4. 控制运动:根据数据处理结果,控制电机驱动模块使小车向目标方向前进或停止。

5. 循环执行:重复执行上述步骤,使小车能够在特定路径上自动行驶。

五、总结智能小车红外循迹是一种基于红外线传感器的自动导航技术。

它通过对周围环境温度变化的检测和分析,实现了小车在特定路径上自动行驶。

该技术不仅具有较高的准确性和稳定性,而且具有较低的成本和易于实现的优点。

在未来,智能小车红外循迹技术有望被广泛应用于无人驾驶、智能家居等领域。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

寻迹小车
在历届全国大学生电子设计竞赛中多次出现了集光、机、电于一体的简易智能小车题目。

笔者通过论证、比较、实验之后,制作出了简易小车的寻迹电路系统。

整个系统基于普通玩具小车的机械结构,并利用了小车的底盘、前后轮电机及其自动复原装置,能够平稳跟踪路面黑色轨迹运行。

总体方案
整个电路系统分为检测、控制、驱动三个模块。

首先利用光电对管对路面信号进行检测,经过比较器处理之后,送给软件控制模块进行实时控制,输出相应的信号给驱动芯片驱动电机转动,从而控制整个小车的运动。

系统方案方框图如图1所示。

图1 智能小车寻迹系统框图
传感检测单元
小车循迹原理
该智能小车在画有黑线的白纸“路面”上行驶,由于黑线和白纸对光线的反射系数不同,可根据接收到的反射光的强弱来判断“道路”—黑线。

笔者在该模块中利用了简单、应用也比较普遍的检测方法——红外探测法。

红外探测法,即利用红外线在不同颜色的物理表面具有不同的反射性质的特点。

在小车行驶过程中不断地向地面发射红外光,当红外光遇到白色地面时发生漫发射,反射光被装在小车上的接收管接收;如果遇到黑线则红外光被吸收,则小车上的接收管接收不到信号。

传感器的选择
市场上用于红外探测法的器件较多,可以利用反射式传感器外接简单电路自制探头,也可以使用结构简单、工作性能可靠的集成式红外探头。

ST系列集成红外探头价格便宜、体积小、使用方便、性能可靠、用途广泛,所以该系统中最终选择了ST168反射传感器作为红外光的发射和接收器件,其内部结构和外接电路均较为简单,如图2所示:
图2 ST168检测电路
ST168采用高发射功率红外光、电二极管和高灵敏光电晶体管组成,采用非接触式检测方式。

ST168的检测距离很小,一般为8~15毫米,因为8毫米以下是它的检测盲区,而大于15毫米则很容易受干扰。

笔者经过多次测试、比较,发现把传感器安装在距离检测物表面10毫米时,检测效果最好。

R1限制发射二极管的电流,发射管的电流和发射功率成正比,但受其极限输入正向电流50mA的影响,用R1=150的电阻作为限流电阻,Vcc=5V作为电源电压,测试发现发射功率完全能满足检测需要;可变电阻R2可限制接收电路的电流,一方面保护接收红外管;另一方面可调节检测电路的灵敏度。

因为传感器输出端得到的是模拟电压信号,所以在输出端增加了比较器,先将ST168输出电压与2.5V进行比较,再送给单片机处理和控制。

传感器的安装
正确选择检测方法和传感器件是决定循迹效果的重要因素,而且正确的器件安装方法也是循迹电路好坏的一个重要因素。

从简单、方便、可靠等角度出发,同时在底盘装设4个红外探测头,进行两级方向纠正控制,将大大提高其循迹的可靠性,具体位置分布如图3所示。

图3 红外探头的分布图
图中循迹传感器全部在一条直线上。

其中X1与Y1为第一级方向控制传感器,X2与Y2为第二级方向控制传感器,并且黑线同一边的两个传感器之间的宽度不得大于黑线的宽度。

小车前进时,始终保持(如图3中所示的行走轨迹黑线)在X1和Y1这两个第一级传感器之间,当小车偏离黑线时,第一级传感器就能检测到黑线,把检测的信号送给小车的处理、控制系统,控制系统发出信号对小车轨迹予以纠正。

第二级方向探测器实际是第一级的后备保护,它的存在是考虑到小车由于惯性过大会依旧偏离轨道,再次对小车的运动进行纠正,从而提高了小车循迹的可靠性。

软件控制单元
单片机选型及程序流程
此部分是整个小车运行的核心部件,起着控制小车所有运行状态的作用。

控制方法有很多,大部分都采用单片机控制。

由于51单片机具有价格低廉是使用简单的特点,这里选择了ATMEL公司的AT89S51作为控制核心部件,其程序控制方框图如图4所示。

图4 系统的程序流程图
小车进入循迹模式后,即开始不停地扫描与探测器连接的单片机I/O口,一旦检测到某个I/O口有信号变化,程序就进入判断程序,把相应的信号发送给电动机从而纠正小车的状态。

车速的控制
车速调节的方法有两种:一是用步进电机代替小车上原有的直流电机;二是在原有直流电机的基础上,采用pwm调速法进行调速。

考虑到机械装置不便于修改等因素,这里选择后者,利用单片机输出端输出高电平的脉宽及其占空比的大小来控制电机的转速,从而控制小车的速度。

经过多次试验,最终确定合适的脉宽和占空比,基本能保证小车在所需要的速度范围内平稳前行。

电机驱动单元
从单片机输出的信号功率很弱,即使在没有其它外在负载时也无法带动电机,所以在实际电路中我们加入了电机驱动芯片提高输入电机信号的功率,从而能够根据需要控制电机转动。

根据驱动功率大小以及连接电路的简化要求选择L298N,其外形、管脚分布如图5所示。

图5 L298N管脚分布图
从图中可以知道,一块L298N芯片能够驱动两个电机转动,它的使能端可以外接高低电平,也可以利用单片机进行软件控制,极大地满足各种复杂电路需要。

另外,L298N的驱动功率较大,能够根据输入电压的大小输出不同的电压和功率,解决了负载能力不够这个问题。

结语
此方案选择的器件比较简单,实际中也很容易实现。

经过多次测试,结果表明在一定的弧度范围内,小车能够沿着黑线轨迹行进,达到了预期目标。

不足之处,由于小车采用直流电机,其速度控制不够精确和稳定,不能实现急转和大弧度的拐弯。

程序
#include<reg51.h>
#define uchar unsigned char
#define uint unsigned int
uchar pro_left,pro_right,i,j; //左右占空比标志
sbit left1=P2^0;
sbit left2=P2^1;
sbit right1=P2^2;
sbit right2=P2^3;
sbit en1=P1^0;
sbit en2=P1^1;
//循迹口三个红外传感器
sbit left_red=P1^2; //白线位置
sbit mid_red=P1^3; //黑线位置
sbit right_red=P1^4; //白线位置
void delay(uint z)
{
uchar i;
while(z--)
{for(i=0;i<121;i++);}
}
void init()
{
left_red=0; //白线位置
mid_red=1; //黑线位置
right_red=0;
TMOD=0X01;
TH0=(65536-100)/256;
TL0=(65536-100)%256;
EA=1;
ET0=1;
TR0=1;
en1=1;
en2=1;
}
void time0(void)interrupt 1
{
i++;
j++;
if(i<=pro_right) {en1=1;}
else en1=0;
if(i==40) {en1=~en1;i=0;}
if(j<=pro_left) {en2=1;}
else en2=0;
if(j==40) {en2=~en2;j=0;}
TH0=(65536-100)/256;
TL0=(65536-100)%256;
}
void straight() //走直线函数
{
pro_right=39;
pro_left=39;
left1=0;
left2=1;
right1=1;
right2=0;
}
void turn_left() //左转弯函数{
pro_right=5;
pro_left=39;
left1=0;
left2=1;
right1=1;
right2=0;
}
void turn_right() //右转弯函数{
pro_right=39;
pro_left=5;
left1=0;
left2=1;
right1=1;
right2=0;
}
void turn_back() //后退(反转)函数{
left1=1;
left2=0;
right1=0;
right2=1;
pro_right=39;
pro_left=39;
}
void infrared() //循迹
{
uchar flag;
if(left_red==1)
{flag=1;}
else
if(right_red==1)
{flag=2;}
else
if((left_red==0)&(mid_red==0)&(right_red==0)) {flag=3;}
else flag=0;
switch (flag)
{
case 0: straight();
break;
case 1: turn_left();
break;
case 2: turn_right();
break;
case 3: turn_back();
break;
default:
break;
}
}
void main(void)
{
init();
delay(1);
while(1)
{
infrared();
// straight();
}
}
void int0(void)interrupt 0 {
}。

相关文档
最新文档