※※※※※※※※※级学生※※2015※※课程设计材料※※※※※※※※※※※课程设计报告书课题名称智能小车蓝牙操控和循迹的实现名姓学号院学专业指导教师2019年2月15日设计目的1通过设计进一步掌握51单片机的应用,特别是在嵌入式系统中的应用。
进一步学习51单片机在系统中的控制功能,能够合理设计单片机的外围电路,并使之与单片机构成整个系统。
2功能要求智能小车作为现代的新发明,是以后的发展方向,他可以按照预先设定的模式在一个环境里自动运作,不需要人为的管理,可应用于科学勘探等等用途;并且能实现显示时间、速度、里程,具有自动寻迹、寻光、避障等功能,可程控行驶速度、准确定位停车,远程传输图像、按键控制加速,减速,刹停,左转和右转、实时显示运行状态等功能。
3 总体设计方案在现有玩具电动车的基础上,加了四个按键,实现对电动车的运行轨迹的启动,并将按键的状态传送至单片机进行处理,然后由单片机根据所检测的各种按键状态实现对电动车的智能控制。
这种方案能实现对电动车的运动状态进行实时控制,控制灵活、可靠,精度高,可满足对系统的各项要求。
本设计采用AT89C51单片机。
以AT89C51为控制核心,利用按键的动作,控制电动小汽车的状态。
加装光电、红外线、超声波传感器,实现对电动车的速度、位置、运行状况的实时测量,并将测量数据传送至单片机进行处理,然后由单片机根据所检测的各种数据实现对电动小车的智能控制,如图1所示。
简易智能电动车采用AT89C51单片机进行智能控制。
开始由手动启动小车,并复位初始化,当到达规定的起始黑线,由小车底部的红外光电传感器检测到第一条黑线后,通过单片机控制小车[2]。
在白纸所做轨迹道路中,小车通过超声波传感器正前开始记数、显示、调速方检测和光电传感器左右侧检测,由单片机控制实现系统的自动避障功能。
在电动车进驶过程中,采用双极式H型PWM脉宽调制技术,以控制小车调速;并采用动态共阴显示行驶时间和里程。
小车通过光电传感装置实现驶向光源并通过循迹保持小车在白纸范围内行驶。
当小车到达终点第二次检测到黑线时,单片机控制小车停车。
总体设计框架图图14 硬件电路选取与设计(1)硬件电路选取1.控制器模块选取我们采用AT89C51单片机作为主控制器,AT89C51是一种带4K字节闪烁可编程可擦除只读存储器(FPEROM)的低电压,高性能CMOS8位微处理器,俗称单片机。
该器件采用ATMEL高密度非易失存储器制造技术制造,与工业标准的MCS-51指令集和输出管脚相兼容。
由于将多功能8位CPU和闪烁存储器组合在单个芯片中,ATMEL的AT89C51是一种高效微控制器,为很多嵌入式控制系统提供了一种灵活性高且价廉的方案。
2.电机模块选取采用普通直流电机。
直流电机运转平稳,精度有一定的保证。
直流电机控制的精度虽然没有步进电机那样高,但完全可以满足本题目的要求。
通过单片机的PWM 输出同样可以控制直流电机的旋转速度,实现电动车的速度控制。
并且直流电机相对于步进电机价格经济。
3.电机驱动器模块选取采用电机驱动芯片L298N。
L298N 为单块集成电路,高电压,高电流,四通道驱动,可直接的对电机进行控制,无须隔离电路。
通过单片机的I/O输入改变芯片控制端的电平,即可以对电机进行正反转,停止的操作,非常方便,亦能满足直流减速电机的大电流要求。
调试时在依照芯片手册,用程序输入对应的码值,能够实现对应的动作。
.4.电源模块选取在本系统中,需要用到的电源有单片机的5V, L298N芯片的电源5V和电机的电源12V。
所以需要对电源的提供必须正确和稳定可靠。
用9V的锂电池串联2节5号普通电池给前、后轮电机供电,然后使用7805稳压管来把高电压稳成5V分别给单片机和电机驱动芯片供电。
因此为了方便,这里我们采用12V电源给电机供电,再用7805转换成5V电源给单片机使用。
(2)硬件设计小车采用四轮驱动,一侧的前后两个车轮共用一个电机驱动,另外两个前后轮共用一个驱动,调节左右车轮转速从而达到控制转向的目的。
图2 硬件控制模块图1.控制模块设计根据设计的小车性能,使用控制系统来控制电机的状态,按键来操作,从而使小车可以进行加速、减速、刹停、左转和右转的运行。
设计的控制模块电路图图3 AT89C51单片机的P0通过控制总线来连接锁存器74LS373以及计数器8253,以此来控制L298N驱动芯片的工作方式,PWM1和PWM2来控制电机的工作状态。
AT89C51的P2口通过控制总线与显示器连接。
图3 控制模块设计图2.电机模块设计因为设计的小车运行比较简单,没有避障等复杂的功能,所以我们选择普通直流减速电机,通过到商店里和到网上等途径进行购买,电机模块采用2块电机同时驱动,这里将同一侧电机短接接到L298N的-个输出端。
3.电机驱动模块设计采用电机驱动芯片L298N。
L298N是SGS公司的产品,为单块集成电路,高电压,高电流,四通道驱动,可直接的对电机进行控制,无须隔离电路。
通过单片机的IO输入改变芯片控制端的电平,即可以对电机进行正反转,停止的操作,用程调试时在依照芯片手册,亦能满足直流减速电机的大电流要求。
非常方便,序输入对应的码值,能够实现对应的动作。
图4 电机驱动模块设计图如图4所示,1脚和15脚可单独引出连接电流采样电阻器,形成电流信号,,还可驱动2个电机,OUT1, OUT2, OUT3, OUT4之间分别连接2个电动机。
5、7、10、12脚接控制电平,控制电机的正反转,ENA,EN B接控制使能端,控制电机的停转。
同时输出两组PWM波,每一-组P WM用来控制一一个,电机的速度。
另外,二个I / 0口可以控制电机的正反转,P1.0, P1.1控制第-一个电机的方向,输入的:PWM1控制第-一个电机的速度;P1.2、P1.3控制第二个电机的方向,输出的PWM2控制第二个电机地说速度。
由于电机的正常的工作时对电源的干挠很大,只用一组电源时,会影响单片机的正常工作,所以选用双电源供电。
d1,Q1是一对红外发射接收对管,与LM324构成光右转电传感的检测电路。
可实现对小车的加速,减速,刹停,并可通过两个电机的不同转速实现左转和。
可以用表表示为:4.电源模块采用电脑USB,5V、2A输出或者用充电宝的5V、1A或2A输出都可以。
结构图如下:图5 电源与单片机结构图5.按键模块本系统添加四个键,用来选择控制小车。
并接于P2口。
图6 按键控制图5 软件设计流程图设计1.图7 主程序流程图2.小车运行设计若要求小车直走,这需要给4个电机正转命令。
根据L298N芯片手册,这里将P1=0xfa。
3.小车调速设计若要求车调速,只需用PWM来控制L298N的ENA和ENB就可以对小车进行调速。
这里我使用定时器T0的工作方式2自动重装。
并赋初值;TL0=0xf6; TH0=0xf66 系统测试与结果分析基于单片机技术的智能小车蓝牙控制与循迹系统的实验样机图如图8所示,用1台***型直流稳压充电宝提供+5V的电压,经过多次调试我们发现两个问题。
如下:1.转向时间需要慢慢调,时间长,旋转弧度大;时间短,旋转弧度小。
2.直行时,由于每个电机的性能不一样,导致两侧占空比一样时,小车会存在转弯,这样需要微调占空比。
图8实验样机图7 使用说明现在智能小车、机器人得到很多人的关注和追捧,因而市面上智能小车的控制板,价格都很昂贵,硬件自己动手的机率小,基本都是成品模块,所以我们在学习电子时应该先硬件后软件,这样你很快就能学会电子。
在使用智能小车的过程中,你需要了解一些C语言的知识、单片机的知识,掌握了这些你才能更快速、更有效的控制我们的智能小车。
8 设计总结经过此次的项目经验,我们学会了学以致用,能够将自己在课堂上学习到的东西能够在项目中加以利用,正所谓知行统一。
首先我们复习C语言对51单片机进行编程使我们能够准确的控制到单片机,然后再将单片机连接到小车上去组成此次项目的成品——智能小车。
由于小车上有装了蓝牙模板、红外感应模块等,我们又能摸索学习蓝牙模块的一系列知识,对于我们是一次长知识的经历同时也是一次能够接受的挑战。
参考文献[1]陆蕊. 基于单片机的智能小车系统的设计[J]. 电子世界, 2017(8):166-166.[2陈梦婷,胡白燕,黄璨.基于单片机的智能循迹避障小车的设计与实现[J].智能机器人,2016:47-51.[3]陈海宴.51单片机原理及应用[M].北京:北京航空航天大学出版社.2010:62-65.[4]高枫.基于ARM的智能寻迹小车的设计与实现[D].山西:中北大学,2012.6.[5]陈海洋,李东京.基于单片机的智能循迹避障机器人小车设计[J].科技风,2014(20):99.[6]钱栢霆,李娟.基于单片机的循迹避障智能小车系统的设计[J].电子制作,2015(6x).[7]寸巧萍.基于Mega16单片机的智能小车循迹避障设计方案258.):18(2015电子技术与软件工程,[8].[9] 顾群,蒲双雷.基于单片机的智能小车避障循迹系统设计[J].数字技术与应用,2012(5):23.[10]蔡莉莎, 曾维鹏. 基于人工智能路径规划系统的智能小车的设计与实现[J]. 电子世界,2016(18):112-113.[11]朱思敏. 自循迹智能小车控制系统的设计与实现[D]. 浙江工业大学, 2013.[12]徐少朋. 基于Android开发的智能小车路径规划[D]. 天津大学, 2014.[13]吕闪, 金巳婷, 沈巍. 基于STM32的循迹避障智能小车的设计[J]. 计算机与数字工程, 2017, 45(3):549-552.[14]朱丹峰, 葛主冉, 林晓雷. 基于Android平台的无线遥控智能小车[J]. 电子器件, 2013,36(3):408-412.[15]俞文武, 程恒文, 金天宝,等. 基于STM32的智能跟踪小车的设计[J]. 山东工业技术,2017(8):294-296.[16]李娜, 杨春鹤, 王泽昊,等. 浅谈基于STM32单片机的智能车设计过程[J]. 数码世界, 2016(11):90-91.附录#include<reg52.h>sbit key1=P3^3;sbit key2=P3^4;char a;int flag=0;sbit lefta=P0^0;sbit leftb=P0^1;sbit righta=P0^2;sbit rightb=P0^3;sbit outl=P0^6;sbit outr=P0^5;int n;void delay(int n){int i,j;for(i=0;i<n;i++)for(j=0;j<113;j++);}void get_up() //前进{lefta=1;leftb=0;righta=1;rightb=0;}void get_down() //后退{lefta=0;leftb=1;righta=0;rightb=1;}void get_left() //左转{lefta=0;leftb=1;righta=1;rightb=0;}void get_right() //右转{lefta=1;leftb=0;righta=0;rightb=1;}void get_up_left() //前进左转{//timer_intconfiguration();int x=50;lefta=1;righta=1;rightb=0;while(x--){leftb=0;delay(50);leftb=1;delay(50);}}void get_up_right() //前进右转{//timer_intconfiguration();int x=50;lefta=1;leftb=0;righta=1;while(x--){rightb=0;delay(50);rightb=1;delay(50);}}void get_down_left() //后退左转{//timer_intconfiguration();int x=50;lefta=0;leftb=1;righta=0;while(x--){rightb=1;delay(50);rightb=0;delay(50);}}void get_down_right() //后退右转{//timer_intconfiguration();int x=50;lefta=0;righta=0;rightb=1;while(x--){leftb=1;delay(50);leftb=0;delay(50);}}void stop(){lefta=0;leftb=0;righta=0;rightb=0;}void set_com(){ //串口中断置位TMOD=0x20;TH1=0xfd;TL1=0xfd;SCON=0X50;ES=1;EA=1;TR1=1;//ET1=1;}void fasong() interrupt 4 //串口中断服务函数{if(RI){flag=1;a=SBUF;RI=0;}}void bluetooth() //蓝牙控制函数{set_com(); //开启串口中断while(1){if(flag) { //如果接受完数据就开始判断接受到的数据 switch(a){case 0:stop();break;case 1:get_up();break;case 2:get_down();break;case 3:get_left();break;case 4:get_right();break;case 5:get_up_left();break;case 6:get_up_right();break;case 7:get_down_left();break;case 8:get_down_right();break;default:break;}flag=0;}} }void xunij() //红外线循迹函数{while(1){if(outl==1&&outr==1) //判断红外模块输出端口的电平 {get_up();delay(4);}else if(outl==1&&outr==0){get_left();delay(4);}else if(outl==0&&outr==1){get_right();delay(4);}else if(outl==0&&outr==0){stop();}}}void main(){while(1){if(key1== 0) //如果按下key1,执行蓝牙控制{delay(20);if(key1==0)bluetooth();}if(key2== 0) //如果按下key2,执行红外线循迹{delay(20);if(key2==0)xunij(); }}}。