小车寻线程序
- 格式:docx
- 大小:17.12 KB
- 文档页数:7
第二届“飞思卡尔”杯全国大学生智能汽车邀请赛技术报告目录第一章引言 (1)1.1 智能车制作概述 (1)1.2 参考文献综述 (1)1.3 技术报告内容与结构 (1)第二章设计方案概述 (3)2.1 总体设计 (3)2.2 具体方案 (3)2.2.1 道路识别模块 (3)2.2.2 速度检测模块 (4)第三章模型车整体设计 (5)3.1 机械部分的调整 (5)3.2 传感器设计与安装 (5)3.2.1 光电管安装: (5)3.2.2 摄像头安装: (6)3.2.3 测速装置 (7)第四章硬件电路设计 (9)4.1 整体介绍 (9)4.2 各模块电路介绍 (10)第五章控制算法实现 (15)5.1 总体软件设计 (15)5.2 路径识别算法 (16)5.2.2 基于光电管的模糊控制算法 (16)5.2.2 基于CMOS的算法 (18)5.2.3 两者的结合 (20)5.3 速度控制算法 (20)第六章调试及主要问题解决 (23)6.1 调试工具 (23)6.2 调试过程 (24)6.3 主要技术参数说明 (25)第七章结论 (27)附录A 参考书目 (I)附录B 部分程序...................................................................................... I I第一章引言1.1 智能车制作概述本队在小车制作过程中,先对比赛内容,要求与规则进行了详细分析,然后按照要求制订了几种设计方案,并对几种方案进行比较敲定最后方案。
根据方案完成小车的总体设计和详细设计(包括底层硬件设计和总体软件设计),在完成了车模组装和改造后,完成了各个模块的硬件电路设计与安装,并进行了控制算法的设计和软件实现,最后进行了整车的调试和优化。
1.2 参考文献综述方案设计过程中参考了一些相关文献,如参考文献所列。
例如文献 1 与 2 单片机嵌入式系统在线开发方法。
目录智能寻迹灭火小车系统功能概述 (2)1系统硬件设计 (3)1.1AT89C52主控芯片介绍 (4)1.2寻迹系统方案设计 (4)1.3电源系统方案设计 (5)1.4驱动电机系统方案设计 (5)1.5显示系统设计 (6)1.6温度系统设计 (6)1.7、风扇模块设计 (6)2系统软件设计 (7)2.1寻迹模块程序流程图 (7)2.2驱动电机模块程序流程图 (8)2.3显示模块程序流程图 (9)2.4温度模块程序流程图 (10)3程序设计 (11)3.1寻迹模块主程序 (11)3.2驱动电机模块主程序 (12)3.3显示模块主程序 (13)3.4温度模块主程序 (13)3.5风扇模块主程序 (15)3.6延时子程序 (15)附录1系统硬件原理图 (16)附录2部分程序代码 (17)智能寻迹灭火小车系统功能概述系统各个功能模块简介:寻迹模块:主要用来给小车做导航前进用。
电源模块:主要用来分别区分给单片机与电机驱动模块供电。
温度模块:主要用来对温度传感器给单片机传值的功能。
显示模块:主要用来显示单片机传过来的温度值。
电机驱动模块:主要用来驱动两个减速直流电机,实现小车的前进、后退、前左转、前右转、后左转、后右转、停车等功能。
风扇模块:主要是用来控制风扇是否吹风,来实现小车灭火功能。
系统工作原理在智能寻迹灭火小车控制系统的设计中,工作原理:首先通过18B20检测传回来的温度,实时显示。
当温度达到上限时,开始启动报警,并驱动小车沿着黑线寻迹前进。
到达指定地点时,小车停止,启动风扇,开始吹风。
当温度降回原先的区间。
小车开始寻迹返回。
再一次运行。
1系统硬件设计本控制系统硬件设计框图1-1如下所示:图1-1 硬件设计框图在智能寻迹灭火小车控制系统的设计中,以A T89C52为核心,用了两片L298N,一片用于驱动两个减速电机,一片用于驱动风扇。
12V电源单独给电机供电,再用7805把12V电源降压至5V给单片机供电。
本文设计了基于图像识别的智能送药小车。
运行过程中视觉识别模块对边缘线和中心线进行探测,并在对数字字模进行捕捉识别后通过串口传输给单片机。
信号通过单片机分析与处理后,输出周期性的PWM 波,控制全桥驱动芯片L298P 驱动4个直流减速电机来控制智能小车的转速和转向,将药品运送至对应病房。
本文采用卷积神经网络(CNN)对数字字模进行识别。
CNN 在图像识别的应用十分广泛,有着较好的鲁棒性,可以应对病房牌号被污染、遮挡的情况。
前言智能送药小车是一种低速、无人操控的自动化药物运送车辆。
其智能配送系统需要实现的主要功能为:从药房领取所需药品,沿预设定路线配送给各个病房,并在运送完成后实现自主返回药房。
通过这种送药方式,医护人员可以避免与病人的直接接触,从而减小被传染性疾病感染的风险。
由于病房多以数字表示不同的房间,小车对数字识别的准确度直接决定智能配送系统能否实现。
但在实际的工作环境下,小车所采集到的病房数字图像,可能会出现旋转、形变、投影畸变等情况;此外,病房数字牌也常常存在着被污染、遮挡的情况。
这些因素都将影响图像识别结果的准确度。
而卷积神经网络作为一种在深度学习中广泛应用的网络结构,最早由Fukushima 等人提出并实现[1],之后LeCun 等人设计并训练了CNN,该模型被称为LeNet-5,后来一系列基于该模型的网络结构在模式识别领域中取得了较好的分类效果[2]。
卷积神经网络结构可以有效降低网络的复杂度,减少训练参数的数目,使基于图像识别的智能送药小车夏宇 文晨昱(南京理工大学,江苏 南京,210000)之对平移、扭曲等具有一定程度的不变性,并具有较强的强鲁棒性和容错能力[3],基于这些优越的特性,它在各种信号和图像处理任务中展现的性能优于标准的全连接神经网络,并被广泛应用于图像识别领域[4],例如,数字识别。
系统方案的设计与论证本文中智能小车的硬件组成部分主要有:以STM32作为核心的主控器部分,视觉识别部分,显示部分,电机驱动部分以及红外巡线部分。
沈阳理工大学课程名称:基于单片机智能循迹小车姓名:魏玉柱指导教师:程磊催宁海摘要本文论述了基于单片机的智能循迹小车的控制过程。
智能循迹是基于自动引导机器人系统,用以实现小车自动识别路线,以及选择正确的路线。
智能循迹小车是一个运用传感器、单片机、电机驱动及自动控制等技术来实现按照预先设定的模式下,不受人为管理时能够自动实现循迹导航的高新科技。
该技术已经应用于无人驾驶机动车,无人工厂,仓库,服务机器人等多种领域。
本设计采用STC89C52单片机作为小车的控制核心;采用TCRT5000红外反射式开关传感器作为小车的循迹模块来识别白色路面中央的黑色引导线,采集信号并将信号转换为能被单片机识别的数字信号;采用驱动芯片L298N构成双H桥控制直流电机,其中软件系统采用C程序,本设计的电路结构简单,容易实现,可靠性高。
关键词:STC89C52 智能循迹小车TCRT5000传感器电机驱动目录1引言 (4)2 需求分析 (4)2.2 循迹小车的发展历程回顾 (5)2.3智能循迹小车的应用 (5)2.4 智能循迹小车研究中的关键技术 (8)3系统设计 (9)4详细设计 (8)4.1 硬件设计 (8)4.1.1电路原理图 (9)4.1.2 器件选择 (10)4.1.2.1 智能循迹小车的主控芯片的选择 (10)4.1.2.2 智能循迹小车电源模块的选择 (10)4.1.2.3 智能循迹小车电机驱动电路的选择 (11)4.1.2.4 智能小车循迹模块的选择 (11)4.1.3 模块设计 (12)4.1.3.1电机驱动模块电路 (12)4.1.3.2光电传感器模块 (12)4.2 软件设计 (14)4.2.1程序流程图 (14)4.2.2实现主要代码 (14)5 实验结果 (16)5.1设计实现 (16)5.2出现的问题和解决的方法 (17)6 结束语 (18)7.参考文献 (19)1引言随着控制技术及计算机技术的发展,寻迹小车系统将在未来工业生产和日常生活中扮演重要的角色。
循迹小车黑线检测一、背景自动导引车(Automated Guided Vehicle,AGV)是一种以电池为动力,装有非接触导向装置和独立寻址系统,无人驾驶并能完成一系列预定工作的自动化车辆。
它能在计算机的监控下按指令自主驾驶。
自动沿着规定的导引路径行驶,到达指定地点后完成一系列作业任务。
该产品已经成为柔性生产线、柔性装配线、仓储物流自动化系统的重要设备。
对于线路既定的AGV系统来讲,与CCD传感器相比,采用红外反射式传感器循迹在价格、数据处理方面有较大优势。
本次制作采用红外反射式传感器作为循迹装置(简单化的AGV)完成小车的循迹,并在此基础上实现目标物的识别、信息获取和上传的功能。
二、循迹电路的制作1、循迹常用方案1)分离式光电二极管2)反射式光电传感器3)激光传感器4)摄像头5)电磁导轨2、小车循迹原理该智能小车在画有黑线的白纸“路面”上行驶,由于黑线和白纸对光线的反射系数不同,可根据接收到的反射光的强弱来判断“道路”—黑线。
本次制作利用了简单、应用也比较普遍的检测方法——红外探测法。
图1小车循迹跑道红外探测法,即利用红外线在不同颜色的物理表面具有不同的反射性质的特点。
在小车行驶过程中不断地向地面发射红外光,当红外光遇到白色地面时发生漫发射,反射光被装在小车上的接收管接收;如果遇到黑线则红外光被吸收,则小车上的接收管接收不到信号。
3、传感器选择市场上用于红外探测法的器件较多,可以利用反射式传感器外接简单电路自制探头,也可以使用结构简单、工作性能可靠的集成式红外探头。
ST系列集成红外探头价格便宜、体积小、使用方便、性能可靠、用途广泛,所以该系统中最终选择了ST188反射传感器作为红外光的发射和接收器件,其内部结构和外接电路均较为简单,如图2所示:图2 传感器电路ST188采用高发射功率红外光、电二极管和高灵敏光电晶体管组成,采用非接触式检测方式。
ST188的检测距离很小,一般为8~15毫米,因为8毫米以下是它的检测盲区,而大于15毫米则很容易受干扰。
应用范围:1.智能小车或机器人寻线(包括黑线和白线),沿着黑线路径走,又称寻迹。
2.智能小车避悬崖,防跌落。
3.智能小车避障碍(注意:因传感器的检测距离太短灵敏度不够高,故太接近黑色的物体将检测不了。
4.反光材料检测,如纸张、磁带卡、非接触式IC卡等等。
使用方法:1.传感器接口有3根排针,分别是VCC、OUT、GND。
VCC和GND为供电端,OUT是信号输出端。
2.检测到物体,信号端输出低电平;未检测到物体,信号端输出高电平。
3.主要判断信号输出端是0或者1,就能判断物体是否存在。
性能参数:1:检测距离,检测白纸时约为2厘米。
视颜色的不同距离有所不同,白色最远。
2.供电电压:2.5V~12V,不要超过12V。
(注意:最好用低电压供电,供电电压太高传感器的寿命会变短。
5V 供电为佳。
)3.工作电流,5V时18~20ma。
经大量测试,传感器硬件设置为18~20ma工作电流时性能最佳,主要表现在抗干扰能力上。
如果客户需要小功耗的,本店也可以修改,最小能做到5ma。
拍下留言注明即可。
4.检测到物体,信号端输出低电平;未检测到物体,信号端输出高电平。
5.传感器输出TTL电平,能直接与3.3V或者5V单片机IO口相连。
黑线或者白线检测原理1.利用黑色对光线的反射率小这个特点,当平面的颜色不是黑色时,传感器发射出去的红外光被大部分反射回来。
于是传感器输出低电平0(这个时候就判断为白色)。
2.当平面中有一黑线,传感器在黑线上方时,因黑色的反射能力很弱,反射回来的红外光很少,达不到传感器动作的水平,所以传感器还输出1(这个时候就会判断为黑色)。
3.我们只要用单片机判断传感器的输出端是0或者是1,就能检测到黑线。
4.检测白线的原理和检测黑线的原理一样,检测白线时,白线周边的颜色也要比较接近黑色,然后调节红外传感器上面的可调电阻,将灵敏度调低,一直调到刚好周边的颜色检测不到为止,那样就能检测白线了。
寻线程序内容#include<BoeBot.h>#include<uart.h>sbit A=P1^5; //左边sbit S=P2^1; //中间sbit C=P3^5; //右边sbit M1=P1^0; //左边电机sbit M2=P1^1; //右边电机unsigned char x=0;unsigned char i,j,k;void B_right_Turn(void);void Forward(void) //前进{M1=1;delay_nus(1600);M1=0;M2=1;delay_nus(1400);M2=0;delay_nms(20); }void Left_Turn(void) //以中心为轴左传{Forward();Forward();Forward();Forward();Forward();Forward();Forward();Forward();for(i=1;i<=29;i++){M1=1;delay_nus(1300);M1=0;M2=1;delay_nus(1300);M2=0;delay_nms(19);}}void Left_2 (void) //以左轮为轴左传{M1=1;delay_nus(1500);M1=0;M2=1;delay_nus(1400);M2=0;delay_nms(19);}void Right_Turn(void) //以中心为轴右转{Forward();Forward();Forward();Forward();Forward();Forward();Forward();Forward();for(j=1;j<=29;j++){M1=1;delay_nus(1700);M1=0;M2=1;delay_nus(1700);M2=0;delay_nms(20);}}void Right_Turn_2(void) //以中心为轴右转{M1=1;delay_nus(1600);M1=0;M2=1;delay_nus(1600);M2=0;delay_nms(20);}void Right_2(void) //以右轮为轴右转{M1=1;delay_nus(1600);M1=0;M2=1;delay_nus(1500);M2=0;delay_nms(20);}void B_right_Turn(void) //右转45度{for(k=1;k<=15;k++){M1=1;delay_nus(1700);M1=0;M2=1;delay_nus(1700);M2=0;delay_nms(20);}}void z_x (void){while(1){Left_2();if(S==1) break;}}void y_x (void){while(1){Right_2();if(S==1) break;}}void main(){while(1) //1 duan{Forward();if(A==1&&S==0&&C==0) //左边检测到黑先z_x();if(C==1&&S==0&&A==0)y_x();if(A==1&&S==1&&C==1) break;}Left_Turn(); //左转90度进入2段while(1) //2段{Forward();if(A==1&&S==0&&C==0) //左边检测到黑先z_x();if(C==1&&S==0&&A==0)y_x();if(S==1&&C==1) break;}Right_Turn(); //进入3段while(1) //3段{Forward();if(A==1&&S==0&&C==0) //左边检测到黑先z_x();if(C==1&&S==0&&A==0)y_x();if(S==1&&C==1&&A==1) break;}Left_Turn(); //左转90度进入4段while(1) //4段{Forward();if(A==1&&S==0&&C==0) //左边检测到黑先z_x();if(C==1&&S==0&&A==0)y_x();if(S==1&&C==1) break;}Right_Turn(); //进入5段while(1) //5段{Forward();if(A==1&&S==0&&C==0) //左边检测到黑先z_x();if(C==1&&S==0&&A==0)y_x();if(S==1&&C==1&&A==1) break;}while(C==1||A==1) //过渡到6{Forward();}while(1) //6段{Forward();if(A==1&&S==0&&C==0) //左边检测到黑先z_x();if(C==1&&S==0&&A==0)y_x();if(S==1&&C==1) break;}Right_Turn(); //进入7段while(1) //7段{Forward();if(A==1&&S==0&&C==0) //左边检测到黑先z_x();if(C==1&&S==0&&A==0)y_x();if(S==1&&C==1) break;}Right_Turn(); //进入8段while(1) //进入8段{Forward();if(A==1&&S==0&&C==0) //左边检测到黑先z_x();if(C==1&&S==0&&A==0)y_x();if(A==1&&S==1) break;}x=0;while(x<20) //过渡到0.5ms{Forward();x++;}while(1) //9段{Forward();if(A==1&&S==0&&C==0) //左边检测到黑先z_x();if(C==1&&S==0&&A==0)y_x();if(A==1&&S==1) break;}Left_Turn(); //左转90度进入10段while(1) //10段{Forward();if(A==1&&S==0&&C==0) //左边检测到黑先z_x();if(C==1&&S==0&&A==0)y_x();if(A==1&&S==1) break;}Left_Turn(); //左转90度进入11段while(1) //11段{Forward();if(A==1&&S==0&&C==0) //左边检测到黑先z_x();if(C==1&&S==0&&A==0)y_x();if(C==1&&S==1) break;}x=0;while(x<20) //过渡到12段{Forward();x++;}while(1) //12段{Forward();if(A==1&&S==0&&C==0) //左边检测到黑先z_x();if(C==1&&S==0&&A==0)y_x();if(A==1&&S==1) break;}Left_Turn(); //左转90度进入13段while(1) //13段{Forward();if(A==1&&S==0&&C==0) //左边检测到黑先z_x();if(C==1&&S==0&&A==0)y_x();if(C==1&&S==1&&A==1) Forward();}/* Forward();Forward();x=0;while(x<20) //过渡到14段135度{Right_Turn_2();x++;}x=0;while(x<35) //到14段{Forward();x++;if(A==1&&S==0&&C==0) //左边检测到黑先z_x();if(C==1&&S==0&&A==0)y_x();}Right_Turn();Right_Turn();// 180x=40;while(x){Forward();x--;}Forward();B_right_Turn(); //右转45度while(1){Forward();if(A==1&&S==0&&C==0) //左边检测到黑先z_x();if(C==1&&S==0&&A==0)y_x();if(C==1&&S==1&&A==1) break;}x=0;while(x<200) //过渡到12段{Forward();x++;} */}。