课程实验报告
课题名称:循迹小车的制作
班级:111072B 实验者: 12011072039姚城
12011072065王企兵
实验时间:2014.2.28~5.16
摘要
本设计主要有三个模块包括信号检测模块、主控模块、电机驱动模块。信号检测模块采用红外光对管,用以对黑线进行检测。主控电路采用宏晶公司的8051核心的STC89C52单片机为控制芯片。电机驱动模块采用意法半导体的L298N专用电机驱动芯片,单片控制与传统分立元件电路相比,使整个系统有很好的稳定性。信号检测模块将采集到的路况信号传入STC89C52单片机,经单片机处理过后对L298N发出指令尽心相应的调整。小车速度由单片机输出的PWM波控制。控制电动小车的速度及转向,从而实现自动循迹的功能。
关键词:智能小车 STC89C52单片机 L298N 红外光对管
一.绪论
(一)智能小车的作用和意义
自第一台工业机器人诞生以来,机器人的发展已经遍及机械、电子、冶金、交通、宇航、国防等领域。近年来机器人的智能水平不断提高,并且迅速地改变着人们的生活方式。人们在不断探讨、改造、认识自然的过程中,制造能替代人劳动的机器一直是人类的梦想。 随着科学技术的发展,机器人的感系统,对于视觉的各种技术而言图像处理技术已相当发达,而基于图像的理解技术还很落后,机器视觉需要通过大量的运算也只能识别一些结构化环境简单的目标。视觉传感器的核心器件是摄像管或CCD,目前的CCD已能做到自动聚焦。但CCD传感器的价格、体积和使用方式上并不占优势,因此在不要求清晰图像只需
要粗略感觉的系统中考虑使用接近觉传感器是觉传感器种类越来越多,其中视觉传感器成为自动行走和驾驶的重要部件。视觉的典型应用领域为自主式智能导航一种实用有效的方法。 机器人要实现自动导引功能和避障功能就必须要感知导引线和障碍物,感知导引线相当给机器人一个视觉功能。避障控制系统是基于自动导引小车(AVG—auto-guide vehicle)系统,基于它的智能小车实现自动识别路线,判断并自动避开障碍,选择正确的行进路线。使用传感器感知路线和障碍并作出判断和相应的执行动作。 该智能小车可以作为机器人的典型代表。它可以分为三大组成部分:传感器检测部分、CPU、执行部分。机器人要实现自动避障功能,还可以扩展循迹等功能,感知导引线和障碍物。可以实现小车自动识别路线,选择正确的行进路线,并检测到障碍物自动躲避。基于上述要求,传感检测部分考虑到小车一般不需要感知清晰的图像,只要求粗略感知即可,所以可以舍弃昂贵的CCD传感器而考虑使用价廉物美的红外反射式传感器来充当。智能小车的执行部分,是由直流电机来充当的,主要控制小车的行进方向和速度。单片机驱动直流电机一般有两种方案:第一,勿需占用单片机资源,直接选择有PWM功能的单片机,这样可以实现精确调速;第二,可以由软件模拟PWM输出调制,需要占用单片机资源,难以精确调速,但单片机型号的选择余地较大。考虑到实际情况,本文选择第二种方案。CPU使用STC89C52单片机,配合软件编程实现
(二)智能小车的现状
现智能小车发展很快,从智能玩具到其它各行业都有实质成果。其基本可实现循迹、避障、检测贴片、寻光入库、避崖等基本功能,这几节的电子设计大赛智能小车又在向声控系统发展。比较出名的飞思卡尔智能小车更是走在前列。我此次的设计主要实现循迹避障这两个功能。
二、方案设计与论证
根据要求,确定如下方案:在现有玩具电动车的基础上,加装光电检测器,实现对电动车的速度、位置、运行状况的实时测量,并将测量数据传送至单片机进行处理,然后由单片机根据所检测的各种数据实现对电动车的智能控制。这种方案能实现对电动车的运动状态进行实时控制,控制灵活、可靠,精度高,可满足对系统的各项要求。
(一)循迹模块
小车循迹原理是小车在贴有黑胶带的地板上行驶,由于黑色和白色对光线的反射系数不同,可根据接收到的反射光的强弱来判断“道路”—黑线。在该模块中利用了简单、应用也比较普遍的检测方法——红外探测法。
红外探测法,即利用红外线在不同颜色的物理表面具有不同的反射性质的特点。在小车行驶过程中不断地向地面发射红外光,当红外光遇到白色地面时发生漫发射,反射光被装在小车上的接收管接收;如果遇到黑线则红外光被吸收,则小车上的接收管接收不到信号。
循迹模块原理图
(二)主控系统
根据设计要求,我认为此设计属于多输入量的复杂程序控制问题。据此,拟定了以下两种方案并进行了综合的比较论证,具体有如下两种方案:
1.采用PLC作为主控系统,PLC虽然性能稳定但是价格昂贵,为此,我们不采用该种方案,进而提出了第二种设想。 2.采用单片机作为整个系统的核心,用其控制行进中的小车,以实现其既定的性能指标。充分分析我们的系统,其关键在于实现小车的自动控制,而在这一点上,单片机就显现出来它的优势——控制简单、方便、快捷。这样一来,单片机就可以充分发挥其资源丰富、有较为强大的控制功能及可位寻址操作功能、价格低廉等优点。因此,这种方案是一种较为理想的方案。 针对本设计特点——多开关量输入的复杂程序控制系统,需要擅长处理多开关量的标准单片机,而不能用精简I/O口和程序存储器的小体积单片机,D/A、A/D功能也不必选用。根据这些分析,我选定了AT89S51单片机作为本设计的主控装置,51系列单片机具有功能强大的位操作指令,I/O口均可按位寻址,程序空间多达8K,对于本设计也绰绰有余。 在综合考虑了传感器、两部电机的驱动等诸多因素后,我们决定采用一片单片机,充分利用AT89S51单片机的资源。
AT89S51单片机的主控部分原理图
(三)电机驱动模块
电机驱动模块拟用两种解决方案,分别如下: 1.采用继电器对电动机的开或关进行控制,通过开关的切换对小车的速度进行调整.此方案的优点是电路较为简单,缺点是继电器的响应时间慢,易损坏,寿命较短,可靠性不高。 2.采用功率三极管作为功率放大器的输出控制直流电机。线性型驱动的电路结构和原理简单,加速能力强,采用由达林顿管组成的H型桥式电路。用单片机控制达林顿管使之工作在占空比可调的开关状态下,精确调整电动机转速。这种电路由于工作在管子的饱和截止模式下,效率非常高,H型桥式电路保证了简单的实现转速和方向的控制,电子管的开关速度很快,稳定性也极强,是一种广泛采用的 PWM调速技术,这里我们采用L298N驱动模块的步进电机驱动模块。
L298N驱动模块
(四)机械系统
本题目要求小车的机械系统稳定、灵活、简单,因此采用前驱,后轮采用两个万向轮。小车上装有电池、电机、电子器件等,使得电机负担较重。为使小车能够顺利启动,且运动平稳,在直流电机和轮车轴之间加装了三级减速齿轮。
(五)电源系统
采用2节普通1.5V干电池单电源供电,但6V的电压太小不能同时给单片机与与电机供电。电机在运行过程中产生的反向电动势可能会影响单片机的正常工作。所以决定独立供电,即单片机控制系统和光对管与电机分开供电。由于单片机为低功耗元件而可采用普通1.5v电池(共2节)供电,电机为大功耗器件因而单独采用锂电(900mAh)供电(如
图2-6)。
三.硬件设计
(一)信号检测模块
为了防止因传感器太少引起的误动作,因而在车体前段安装了4个红外光对管(如图3-1),有效的减小了误动作的发生,减小了小车冲出跑道的几率。
黑白线检测模块实物图
(二)主控电路
本模块主要是对采集信号进行分析,同时控制电机起停、正反转。,该模块包括电源模块,串口电平转换模块,以及I/O口扩展模块。电源模块为系统提供稳定的电源,串口电平转换模块可以将电脑与单片机串口相连从而实现程序的下载以及串口打印debug调试功能。I/O扩展排针将单片机的管脚引出,可以实现灵活的扩展功能。
主控电路的实物图
(三)驱动电路
本模块主要是对单片机传送过来的高低电平信号进行处理,控制电机起停、正反转。
驱动模块的实物图
(四)总体设计
智能小车采用前轮驱动,前轮左右两边各用一个电机驱动,调制前面两个轮子的转速起停从而达到控制转向的目的,后轮是万向轮,起支撑的作用。将循迹光对管分别装在车体下的左右。当车身下左边的传感器检测到黑线时,主控芯片控制左轮电机停止,车向左修正,当车身下右边传感器检测到黑线时,主控芯片控制右轮电机停止,车向右修正。由于系统采用模块化结构,各个模块之间采用杜邦线连接。
四.软件设计
(一)总体程序流程图
(二)系统的总体程序
*********************************************/
#include #define uint unsigned int #define uchar unsigned char /*电机四个接口定义*/ sbit left_f = P2^4; sbit left_b = P2^5; sbit right_f = P2^6; sbit right_b = P2^7; 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 Wheel_l(uchar speed) { if(count <= speed) //count计数变量 { left_f = 1; left_b = 0; } else { left_f = 1; left_b = 1; } } void Wheel_r(uchar speed) { if(count<= speed) { //同上 right_f = 1; right_b = 0; } else { right_f = 1; right_b = 1; } } void Inline() { uchar temp; temp = P1; //检测黑线信号 switch(temp) { case 0xe7:Wheel_l(50); Wheel_r(10);break; //右侧传感器压线,小车向左前修正 case 0xd7:Wheel_l(99);Wheel_r(95);break; //中间传感器压线,保持直走 此处两值使电机速度保持相同 case 0xcf:Wheel_l(10); Wheel_r(50);break; //左侧传感器压线,小车向右前修正 } } void main() //主函数 { Init_timer(); //调用函数 while(1) 因篇幅问题不能全部显示,请点此查看更多更全内容