




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
word文档可自由复制编辑目录1前言 12总体方案设计 33安卓操作系统简介 53.1安卓操作系统发展 53.2安卓开发与建立 53.3安卓的应用程序分析 63.4安卓的蓝牙开发技术 73.5安卓平台的蓝牙编程 74系统软件程序设计 124.1C语言编程环境介绍: 124.2各模块的编程 135系统调试 205.1C语言的调试 205.2JAVA语言的调试 236总结与体会 257谢辞 268参考文献 27附录:程序: 27word文档可自由复制编辑第1章前言(绪论)1.1智能小车的意义和作用随着科学技术的发展,机器人开始出现在人们的视野中,机器人的研究一直是科学家们热衷的事,并努力把机器人运用到生活的方方面面。目前机器人的发展已经遍及机械、电子、冶金、交通、宇航、国防等领域。近年来机器人的智能水平不断提高,并且迅速地改变着人们的生活方式。人们在不断探讨、改造、认识自然的过程中,制造能替代人劳动的机器一直是人类的梦想。随着科学技术的发展,机器人的感觉传感器种类越来越多,其中视觉传感器成为自动行走和驾驶的重要部件。视觉的典型应用领域为自主式智能导航系统,对于视觉的各种技术而言图像处理技术已相当发达,而基于图像的理解技术还很落后,机器视觉需要通过大量的运算也只能识别一些结构化环境简单的目标。视觉传感器的核心器件是摄像管或CCD,目前的CCD已能做到自动聚焦。但CCD传感器的价格、体积和使用方式上并不占优势,因此在不要求清晰图像只需要粗略感觉的系统中考虑使用接近觉传感器是一种实用有效的方法。机器人要实现自动导引功能和避障功能就必须要感知导引线和障碍物,感知导引线相当给机器人一个视觉功能。避障控制系统是基于自动导引小车(AVG—auto-guidevehicle)系统,基于它的智能小车实现自动识别路线,判断并自动避开障碍,选择正确的行进路线。使用传感器感知路线和障碍并作出判断和相应的执行动作。该智能小车可以作为机器人的典型代表。它可以分为三大组成部分:传感器检测部分、执行部分、CPU。机器人要实现自动避障功能,还可以扩展循迹等功能,感知导引线和障碍物。可以实现小车自动识别路线,选择正确的行进路线,并检测到障碍物自动躲避。基于上述要求,传感检测部分考虑到小车一般不需要感知清晰的图像,只要求粗略感知即可,所以可以舍弃昂贵的CCD传感器而考虑使用价廉物美的红外反射式传感器来充当。智能小车的执行部分,是由直流电机来充当的,主要控制小车的行进方向和速度。单片机驱动直流电机一般不占用单片机资源,直接选择有PWM功能的单片机,这可以由软件模拟PWM输出调制,需要占用单片机资源,难以精确调速,但单片机型号的选择余地较大。考虑到实际情况,CPU使用STC89C52单片机,配合软件编程实现。1.2智能小车的现状随着计算机和控制技术的发展,智能移动小车在很多行业都有实质成果。工作的环境也从很单纯的室内环境发展成了各种复杂环境,如地面,水下,太空等等。在小车的功能发面,越来越多的新功能被小车所运用,如实现循迹、避障、检测贴片、寻光入库、避崖,拍摄,远程传输信号等等。国内智能车辆研究现状相比于国外,我国开展智能车辆技术方面的研究起步较晚,开始于20世纪80年代。而且大多数研究处在于针对某个单项技术研究的阶段。虽然我国在智能车辆技术方面的研究总体上落后于发达国家,并且存在一定得技术差距,但是我们也取得了一系列的成果,主要有:(1)中国第一汽车集团公司和国防科技大学机电工程与自动化学院与2003年研制成功我国第一辆自主驾驶轿车。该自主驾驶轿车在正常交通情况下的高速公路上,行驶的最高稳定速度为13km/h,最高峰值速度达170km/h,并且具有超车功能,其总体技术性能和指标已经达到世界先进水平。(2)南京理工大学、北京理工大学、浙江大学、国防科技大学、清华大学等多所院校联合研制了7B.8军用室外自主车,该车装有彩色摄像机、激光雷达、陀螺惯导定位等传感器。计算机系统采用两台Sun10完成信息融合、路径规划,两台PC486完成路边抽取识别和激光信息处理,8098单片机完成定位计算和车辆自动驾驶。其体系结构以水平式结构为主,采用传统的“感知-建模-规划-执行”算法,其直线跟踪速度达到20km/h,避障速度达到5-10km/h。智能车辆研究也是智能交通系统ITS的关键技术。目前,国内的许多高校和科研院所都在进行ITS关键技术、设备的研究。随着ITS研究的兴起,我国已形成一支ITS技术研究开发的技术专业队伍。并且各交通、汽车企业越来越加大了对ITS及智能车辆技术研发的投入,整个社会的关注程度在不断提高。交通部已将ITS研究列入“十五”科技发展计划和2010年长期规划。相信经过相关领域的共同努力,我国ITS及智能车辆的技术水平一定会得到很大提高。可以预计,我国飞速发展的经济实力将为智能车辆的研究提供一个更加广阔的前景。我们要结合我国国情,在某一方面或某些方面,对智能车进行深入细致的研究,为它今后的发展及实际应用打下坚实的基础。第2章总体方案设计根据要求,确定如下方案:在现有玩具电动车的基础上,加装红外对光管,超声波收发传感器,实现对电动车的速度、位置、运行状况的实时测量,并将测量数据传送至单片机进行处理,然后由单片机根据所检测的各种数据实现对电动车的智能控制。同时。加装的蓝牙模块,可以辅助控制小车,当小车的循迹出现故障,或者需要手动控制小车实现某种功能时,可以使用手机上的安卓软件,发出控制信号给蓝牙,蓝牙接收后传给小车,实现对小车的控制。这种方案能实现对电动车的运动状态进行实时控制,控制灵活、可靠,精度高,可满足对系统的各项要求总体方案框图SStc89c52循迹红外对管时钟电路复位电路蓝牙模块电机驱动超声波红外避障循迹模块;用两只红外对管,分别置于小车车身前轨道的两侧,根据两只光电开关接受到白线与黑线的情况来控制小车转向来调整车向,测试表明,只要合理安装好两只光电开关的位置就可以很好的实现循迹的功能避障模块;用超声波避障,声波测距是通过不断检测超声波发射后遇到障碍物所反射的回波,从而测出发射和接收回波的时间差T,然后求出距离L=CT。超声波发射器向某一方向发射超声波,在发射时刻的同时开始计时,超声波在空气中传播,途中碰到障碍物就立即返回来,超声波接收器收到反射波就立即停止计时。然后通过一定的电路把数据传给单片机,单片机通过和障碍物间的距离来决定小车是否需要调整前进方向。电源模块;采用2支18650锂电池电源供电,电源电压足够小车和单片机的运行,可以很好的实现功能,锂电池还可以充电,可以多次使用。无线模块;用的无线模块是当今社会上便携式设备中普遍具有的蓝牙无线模块,该模块性能稳定,传输速率快,稳定可靠,传输距离可观。该芯片使用简单,具有通用的串行通信端口,在市场中具有较高的知名度,且蓝牙技术发展前景良好,广受客户的好评。该设备最大的优点是无需制作专门的遥控器,可直接通过手机上的蓝牙设备发送相关的指令,操作方便快捷,界面人性化设计,具有良好的人机对话界面第3章安卓操作系统的简介3.1安卓操作系统的发展在20007年11月12日,开放手机联盟发布googleandroidsdk,android作为一个系统,是一个运行在LINUX2.6核心上的Java基础的操作系统。系统是非常轻量。Android应用程序用Java开发而且很容易被放置到新的平台上。在此同时,谷歌也宣布建立一个全球性质的联盟,这个组织由许多家手机的制造,软件的开发商,芯片制造商,运营这些产品的销售商组成。这一联盟将致力于谷歌发布手机操作系统的开发以及它所涉及的应用软件的开发,3.2安卓开发建立一、Android平台所具有的特点1开放性,Android从底层被构建,使开发者可以创造隐忍注意的手机应用程序并且能够充分利用所有的付费的手机,它是真正的被构建成开放的。例如,一个应用程序可以调用任一手机的核心功能,打短信,打电话等等。它允许开发者为使用者创造平台使其有身临其境的体验。2所有的平台都是平等建立的,打破了应用程序局限,Android打破创建新的,创新的应用程序的局限,例如,开发者可以让个人手机上的数据和网站上的数据连接在一起,如用户的联系人,日历,位置提供了一个很有意义的用户体验,开发者可以创建一个应用程序,这个程序可以使用户看到他们朋友的位置和改变后的位置,如果发现他们就在附近,就可以马上和他们联系了。3,快速并且简单的应用程序的开发。Android提供了宽范围的有用类库和工具,用这些可以创建丰富的应用程序,例如Android使开发者可以获得设备的地理位置,并允许设备通过同类对同类的方式和其他设备通信,另外Android包括一套完整的工具,这些工具提供开发者高度的生产力和深度探究他们的应用程序4。Google应用;互联网上的谷歌已经有多年的历史了,从开始的只是搜索岛现在各个方面的渗透,如谷歌地图,邮件等等,谷歌的这些服务已经成为联系用户和互联网的重要关系纽带,安卓平台的手机都可以完美的结合这些优秀的服务。3.3Android应用程序的分析对于一个Android应用程序有四种部分构成;1activity2intentreceiver3service4contentprovider不是每一个的应用程序都需要这四个部分,但是应用程序将会用这些来组合编写。一但决定了应用程序所需要的组件,就需要在一个叫Androidmanifest.xml文件中列出他们,这是一个XML文件,在里面需要声明应用程序的组件和他们的功能需求。Activity是Android最普通的构建模块,它通常在应用程序中是一个单独的屏幕。每一个activity是被实现作为一个继承于activity基类的单独的类。例如;一个文本消息发送程序可能有一个显示要发送信息的屏幕,有一个显示给选中要发送的联系人的屏幕。每一个这些屏幕都会被一个activity实现。Android使用一个叫做intent的特殊类来让应用程序从一个屏动到另外一个屏幕。Intent描述了一个应用程序想要干什么。Intent数据结构的两个最重要的部分是;要响应的action和data。典型的action值是MAIN,VIEW,PICK,EDIT,等等,data表示成一个统一资源定界符。Intentreceiver当你想要在你的应用程序中编码来执行对外部事件的响应,你可以使用一个intentreceiver.例如当电话响铃,或当数据网络可用时,或当午夜时,虽然intentreceiver不·显示一个UI,但它们也许会显示一个来通知和提醒用户是否有令人感兴趣的事件发生。intentreceiver也是在Androidmanifest.XML中被注册,但你也可以在代码中使用context.registerreceiver()来注册它们,它的intentreceiver被调用时,你的程序不是非得运行;假如必要时,当一个intentreceiver被触发时,系统将会调用你的应用程序。Service;一个service是长期存活并且运行时不带UI的编码,例如,当在音乐播放器中播放歌曲时,可能在这个播放器中能有一个或者更多的activity,这些activity允许用户选择歌曲和开始播放歌曲。然而,音乐回放本身不应该被一个activity处理,因为用户将期望在导航到一个新的屏幕后音乐保持播放。Contentprovider应用程序可以把他们的数据存储到文件中,一个SQLite数据库中,设置中,或者是任何其他的有意义结构中。如果你想要你的应用程序的数据和其他应用程序共享,一个contentprovider是有用的。一个contentprovider是一个类,它实现了方法的一个标准设置来让其他应用程序存储和恢复被contentprovider处理的数据类型。3.4Android接连接请求的时候,并且已经连接到了的时候,Blueboothserversocket类将会返回一个
第4章系统软件程序设计4.1c语言编程环境介绍由于本次设计中程序系统用C语言编写程序。此次设计所选用的单片机是AT89C52单片机,其C语言语法和结构和标准C语言基本相同,只是有了相应的扩充,用到的编译软件是KeilC。下面结合我的程序编译简要介绍以下KeilC的编译环境的特点。KeilC51软件提供丰富的库函数和功能强大的集成开发调试工具,全Windows界面。另外重要的一点,只要看一下编译后生成的汇编代码,就能体会到KeilC51生成的目标代码效率非常之高,多数语句生成的汇编代码很紧凑,容易理解。KeilC51是美国KeilSoftware公司出品的51系列兼容单片机C语言软件开发系统,与汇编相比,C语言在功能上、结构性、可读性、可维护性上有明显的优势,因而易学易用。Keil提供了包括C编译器、宏汇编、连接器、库管理和一个功能强大的仿真调试器等在内的完整开发方案,通过一个集成开发环境(uVision)将这些部分组合在一起。KeilC51软件提供丰富的库函数和功能强大的集成开发调试工具,全Windows界面。另外重要的一点,只要看一下编译后生成的汇编代码,就能体会到KeilC51生成的目标代码效率非常之高,多数语句生成的汇编代码很紧凑,容易理解。在开发大型软件时更能体现高级语言的优势。C51工具包的整体结构,uVision与Ishell分别是C51forWindows和forDos的集成开发环境(IDE),可以完成编辑、编译、连接、调试、仿真等整个开发流程。开发人员可用IDE本身或其它编辑器编辑C或汇编源文件。然后分别由C51及C51编译器编译生成目标文件(.OBJ)。目标文件可由LIB51创建生成库文件,也可以与库文件一起经L51连接定位生成绝对目标文件(.ABS)。ABS文件由OH51转换成标准的Hex文件,以供调试器dScope51或tScope51使用进行源代码级调试,也可由仿真器使用直接对目标板进行调试,也可以直接写入程序存贮器如EPROM中。4.2各部分模块编程1循迹部分循迹部分使用红外线检测黑线,将信号传给单片机,通过单片机来控制小车实现循迹功能,流程图如下。开始开始前进扫描I/O口,是否检测到黑线Y左边右边左转右转N2避障部分主程序完成初始化工作、各路超声波发射和接收顺序的控制。定时中断服务子程序完成三个方向超声波的轮流发射,外部中断服务子程序主要完成时间值的读取、距离计算、结果的输出等工作。3蓝牙部分蓝牙模块输入的信息进行存储分析,来控制电机驱动,以达到控制小车的前进、后退、左转、右转。在这个过程中,单片机首先进行初始化,包括设置单片机各个端口的方向,各个变量的初始化,以及单片机振荡频率的校准等。单片机定时对蓝牙模块串口读数据,如果串口的数据读出,则对读出的数据进行分析,读出的数据如果为A、B、C、D则分别对应小车的前进、后退、左转、右转。小车硬件系统软件设计的流程图开始开始初始化初始化30秒内连接串口是否连接30秒内连接串口是否连接串口数据是否发送 是串口数据是否发送等待30秒内发送等待30秒内发送判断数据判断数据驱动电机控制小车前进,后退,左转,右转。驱动电机控制小车前进,后退,左转,右转。手机端程序的设计本程序是基于Android2.1系统,所用开发工具为Eclipse集成开发环境,Eclipse是著名的跨平台的自由集成开发环境(IDE)。最初主要用来Java语言开发,但是目前亦有人通过插件使其作为其他计算机语言比如C++、Python和Android的开发工具,在此开发环境下开发软件非常的方便。首先设计本系统手机端软件的程序界面,为了尽快实现程序的功能,本程序没有对软件界面设计做特别美化的设计,仅包含我们所用到的几个按钮和图形显示,以实现我们的功能为最大目标。下面介绍Android相关资源文件的作用[16、17]:1、assets文件夹:此文件夹也可以存放资源文件,而且/assets目录下的资源文件不会在R.java自动生成ID,所以读取/assets目录下的文件必须指定文件的路径(url的路径为:)。除此之外,我们还可以通过AssetManager类来访问这些文件。打开文件时,会把apk文件当做zip文件进行解压读取。但是有文件大小有限制:不能超过1M(android2.2好像放宽(或者取消)了这个限制(至少可以存放>10M,具体没有测试。))。2、res文件夹:主要用来存放资源。此文件夹下可以创建子文件,常见的有:动画anim,图片drawable,颜色color,菜单menu,布局layout,常量值values,详细如下:(1)anim文件夹:后缀名为.xml。动画文件都放在这里。(2)drawable文件夹:用于存放图片资源,图片或者xml。图片格式,有png,9.png,jpg,gif都行。xml文件通常为自定义的形状shape或图片选择器类selector似的东西,就是不同状态下不同的图片,用于设置background的。对分辨率笼统的分,可以分为高中低三种分辨率。(3)color文件夹:用于存放color列表,和drawable的xml一样,表示不同状态下的不同颜色(4)menu文件夹:菜单资源文件夹layout文件夹:布局文件夹。此文件夹的名字也是可以起到屏幕适配的功能的。①横竖屏:layout-land|port;②分辨率:layout-1280x720(6)values文件夹:存放常量值的文件夹。里面常见的xml文件为arrays.xml:资源数组;colors.xml:颜色值;dimens.xml:像素值;strings.xml:字符串值;tyles.xml:样式值。此文件夹,也有屏幕适配作用。比如:dimens在不同分辨率下的值。同样的是加-1280x720这样的后缀。对于strings,有各种语言的版本对应。默认为英文。中文的文件夹名字应该是:values-zh-rCN,values-zh-rTW。(7)raw文件夹:存放不需要系统编译成二进制的文件,例如字体文件等同assets文件夹类似。(8)xml文件夹存放xml文件。开始开始初始化初始化蓝牙是否打开蓝牙是否打开30秒等待30秒等待 否 是蓝牙是否配对蓝牙是否配对搜索蓝牙地址搜索蓝牙地址 否 是等待蓝牙连接蓝牙是否连接 否等待蓝牙连接蓝牙是否连接 是等待监听器按下监听器是否按下等待监听器按下监听器是否按下 是发送蓝牙API发送蓝牙API蓝牙通信流程图以下是手机端实现功能的程序流程图如图5.2所示手机界面程序设计在设置手机界面的时候,在Eclipse集成开发环境下,首先新建一个android项目工程,兴建路径是File—New—androidproject—projectname选择android1.6版本,工程名命名为Bluetooth-car,选择CreateActivity,则自动创建了一个Activity.在创建Activity时,需要注意一下四个要点:1、一个Activity就是一个类,并且这个类要继承Activity。2、需要复写Oncreate方法(当一个Activity第一次运行显示在手机上或者虚拟机上的时就会调用Oncreate方法)。3、每一个Activity都需要在Androidmanifast.xml文件当中配置。4、为Activity添加必要的控件。如图5.3所示,在制作蓝牙小车手机界面的时候,我用到了Textview文本控件和Butten按钮控件,并且在添加控件时采用相对布局形式[18、19]。两个Textview文本控件分别命名为:后备军官学院和蓝牙控制系统,在layout布局文件下可以任意改变控件的位置、字体的大小、背景图片。改变背景图片的方法为:首先将需要用到的背景图片,分别拖入到drawable下,高中低分辨率都拖入一张,以便不同分辨率的手机识别,然后在layout布局文两个Textview文本控件分别命名为:后备军官学院学院和蓝牙控制系统,在layout布局文件下可以任意改变控件的位置、字体的大小、背景图片。改变背景图片的方法为:首先将需要用到的背景图片,分别拖入到drawable下,高中低分辨率都拖入一张,以便不同分辨率的手机识别,然后在layout布局。二、手机监听程序设计在Eclipes开发平台上,首先在Layout文件中采用相对布局的形式设计完成手机界面以后,就要考虑为我们的每个Butten按键绑定监听程序,以实现在每个按键按下时,就能通过手机蓝牙发送相应的数据到小车蓝牙接收模块。首先在Layout文件中,每添加一个控件,都会为这个控件设置一个ID,(如android:id="@+id/button1"),然后在R.JAVA文件就会自动生成一个ID地址。然后在主程序里面编写监听程序,当按键按下的时候,通过监听按键的ID地址的不同,采用switch结构,跳转到不同的case里,向小车蓝牙模块发送不同的数据。在程序里直接写进小车蓝牙模块的蓝牙地址(00:12:10:31:01:70),当程序开始运行时,将会自动搜索该地址的蓝牙芯片,当进行过一次配对连接以后,将会记忆该地址,以后每次只要打开手机界面,开始运行时就会自动进行搜索配对连接好[20、21]。*按钮点击事件.*@paramv*/publicvoidonClick(Viewv){switch(v.getId()){//转写按钮caseR.id.button1:message[0]=(byte)0x41;vibrator();Toast.makeText(this,"前进",Toast.LENGTH_LONG).show();bluesend(message);break;//设置按钮caseR.id.button2:message[0]=(byte)0x44vibrator();Toast.makeText(this,"后退",Toast.LENGTH_LONG).show();bluesend(message);break;caseR.id.button3:message[0]=(byte)0x43;vibrator();Toast.makeText(this,"左转",Toast.LENGTH_LONG).show();bluesend(message);break;caseR.id.button4:message[0]=(byte)0x42;vibrator();Toast.makeText(this,"右转",Toast.LENGTH_LONG).show();bluesend(message);break;caseR.id.button5:message[0]=(byte)0x61;vibrator();Toast.makeText(this,"停止",Toast.LENGTH_LONG).show();bluesend(message);break;default:break;第5章系统调试5.1·C语言的调试软件的调试包括程序本身语法的调试和在电路板上功能的调试两种。在编程过程中,为了得到满足要求的用户程序,一般都需要有一个对程序的调试过程,甚至需要经过多次反复的调试才能完成。在调试程序前为了调试方便,避免程序出错时将单片机拆来拆去的麻烦,在电路板上做了一个下载口,可以将下载线直接插到电路板上进行调试,这样就可以一边进行调试,一边修改程序。程序用KeilC软件写好后,先用该软件的编译功能编译一下所写的程序,检查程序是有语法错误或其他的错误。如果有错误则根据提示进行分析将错误改过来直至编译成功为止。当完成了语法调试后,再根据定时开关插座设计的功能要求修改程序完成系统的各个功能。在编写程序的时候一定要根据系统实现的功能和连接方式,认真分析,画出系统主程序、时钟程序、设置程序的流程图,并根据画出的流程图一步一步的去写出程序。根据系统的特点,软件系统应该按模块进行调试,当各个模块调试通过后再将各个模块整合起来,进行综合调试,直到得到预期结果。与纯粹的C语言编程不同的是,单片机编程要考虑到硬件的设计,所有程序的编写都是根据硬件资源进行。本次设计的智能小车,有三个主要的模块,由于三个程序一起调试有苦难,所以我分别调试每一个模块的,然后在将它们综合。1;循迹部分的调试进入程序后,根据红外传感器检测的值,让程序做出判断,然后判断转向,完成沿着黑线行走,直到走完整个赛道,根据检测情况调用相应的函数,控制小车的行进、停止、左转及右转。它的调试成功图如下。2;避障部分这个部分的主程序完成初始化工作和超声波发射和接收顺序的控制以及根据数据控制小车运动,其中定时中断服务子程序完成超声波的轮流发射,外部中断服务子程序主要完成时间值的读取、距离计算、结果的输出等工作。它的调试成功图如下。3,蓝牙部分;蓝牙部分分为两部分的调试,一部分手机上的安卓程序和小车连接收发信号的调试,另一部分为蓝牙接收到信号和单片机之间的传输的调试,蓝牙主要根据手机上发送的命令传给单片机,单片机在根据这些命令控制小车的运动。蓝牙和单片机调试成功图如下。5.2.JAVA语言的调试将做好的工程添加进入Eclipes开发环境中,检查各个文件夹下面的程序有没有出现打红色X的问题以及警告,点开下方的problem的文件,检查该工程有没有出现问题,当排除了所有的问题以后。配置一个2.2版本的模拟器,然后启动模拟器,在模拟器上运行该工程,在模拟器上将会出现已经做好的手机界面,运行完成,调试成功。然后将手机连接到电脑上,打开安卓手机的USB接口。接下来点击运行整个工程项目,在手机上出现前面那个做好的蓝牙小车控制界面。点击各个按钮,都无问题,证明该JAVA程序没有问题。系统整体的调试,蓝牙控制小车的硬件模块和软件模块分别调试通过后,接下来就可以进行系统的整体测试。首先检查各个模块之间,以及电机驱动与电机的连接都没有出错的情况下,打开给各个模块提供的5V电源以及打开给电机提供的另一个6V电源。此时最小系统模块指示灯点亮,表示单片机供电正常,蓝牙模块指示灯开始闪烁,表示蓝牙模块也供电正常。此时打开安卓手机的蓝牙,搜索该蓝牙芯片,进行配对。然后打开我们做好的手机界面,当界面打开之后,开始自动搜索蓝牙芯片的地址进行连接,当蓝牙芯片的指示灯有闪烁转变为常亮以后,表示蓝牙配对连接成功。在刚开始的时候调试的时候遇到了一些问题,在电机驱动方面,当在手机端的界面上点击前进、后退、左转、右转按钮的时候,蓝牙模块能接受手机端发送的字符A、B、C、D的ASCII码值,并且能够通过串口相应的传递给单片机,单片机通过分析串口传过来的数据,改变P2口的值分别为65、66、67、68,来控制电机驱动的输入端IN1、IN2、IN3、IN4。相应的电机驱动端的四个指示LED灯都能根据数据的变化采取不同的量灭组合情况,来相应控制小车的前进、后退、左转、右转。以下是在手机上设置的安卓程序启动和小车的蓝牙成功配对图。在调试的过程中也遇到一些问题,就是最开始电机驱动输出端控制的电机却不会转动。通过分析,可能有两个原因导致电机不会转动,其一,电机驱动的输出端的接线出现了错误,导致电机转动出现问题;其二,电机驱动端接的给电机供电的电压达不到驱动电机的最低电压,最后通过查询资料和用万用表测驱动模块的输出端的各个引脚的高低电平,发现输出端的电平也能随输入端的改变而变化,当最后测试VCC和GND两端,发现无明显的压降,再用万用表的测电阻值测两端的阻值,发现问题是电机驱动模块输出端的供电端VCC与GND端短路,导致外接电源不能给电机供电。最后我通过直接从芯片的引脚接线到电源端,则电机能够正常转动。第6章总结与体会本次毕业设计是一个基于单片机AT89C52的智能小车控制,包括方案选择、软硬件设计、单片机最小系统、电机驱动电路和蓝牙电路、硬件测试结果及解决在电路调试时遇到的问题。在此期间主要完成的工作包括以下几个方面:(1)设计初期收集电机驱动、单片机等相关资料,对智能小车的实现原理有比较清晰的了解。(2)确定系统框图,对电源模块、单片机最小系统模块、蓝牙电路模块和电机及其驱动电路模块等的实施方案进行比较,确定最终的智能小车控制的设计方案。(3)根据智能小车控制的原理图制作出电路连接图。(4)根据系统要实现前进、后退、左转、右转等功能编写出小车端的软件程序。(5)在eclipes开发环境下,应用JAVA程序编写手机界面程序,并且通过模拟器来检测手机界面程序。(6)软硬件调试通过后进行整体调试,并查找该系统存在的缺陷,进行完善。(7)最终小车能够实现前进、后退、左转、右转等功能,达到老师给出的基本要求。本次设计完成了基于安卓手机的智能小车控制系统。该系统采用51单片机AT89C52编程控制电机的正反转来实现小车前进、后退、左转、右转,而电机的正反转则由电机驱动L298N输出端的逻辑电平来控制。从整个设计的过程来看前期的充分的准备显得非常的重要,经过前期充分的准备,和对嵌入式系统开发的学习,避免了很多在后续的设计中可能出现的问题。MCU端的软硬件设计因为与所学知识相关性较大,所以出现的问题较少,MCU底板设计时鉴于电路简单,且易于焊接,故未采用PCB制版也相应的节约了成本。特别值得一提的是为了提高系统在硬件上的安全性和稳定性,我特别添加了硬件保护装置,以提高系统的硬件防碰撞的能力。主要的问题出现在android端的软件设计上,由于对android开发环境的不熟悉,缺乏一些在编写JAVA程序时的一些技巧性问题,所以刚刚开始时总是出现很多问题,并且出现的问题都需要查找相关资料才能解决。通过学习一些android相关的学习视频,最后对android环境有了一个系统的了解在开发的过程中也得心应手些。Android端图形界面的设计也是一大难点,基于Java的图形界面设计不论是从设计平台还是Java语言的掌握都是一想挑战,但幸于Java软件的开发技术已经成熟,且可查阅的资料多且详尽,所以图形界面的设计达到设计时的五项按键要求,功能实现良好,除界面的友好程度可以更加优化外,其余完成任务。总体来看,我进行了比较充分的准备,在实践过程中通过查阅相关资料和咨询有关人员,克服了系统设计过程中的绝大多数困难,基本都以达到设计要求,并通过了软件测试。第7章谢辞(致谢)毕业设计完成了,在这个过程中我学到了很多东西。首先我要感谢我的导师张岷涛老师,他在我完成论文的过程中,给予了我很大的帮助。在论文开始的初期,我对于论文的结构以及文献选取等方面都有很多问题,是在老师的帮助下进行修改和完善的。本毕业设计是在张岷涛老师悉心的关怀与指导下完成,在此对老师献上最衷心地感谢。张岷涛老师从毕业设计一开始就对我们严格要求,每周的周一都会和我们开见面会,询问我们的毕设进度并了解我们遇到的困难,积极协助我们解决设计过程中的各种难题,并要求我们每天记录在毕业设计中所作的工作进度及遇到的问题,让我们去发现问题,解决问题。在我遇到难已解决的问题心中急躁时,张岷涛老师总是及时的给予鼓励,使我能够有勇敢的克服困难,把毕设继续进行下去。张岷涛老师对学生的高度关注和对工作高度负责的精神值得我们尊敬,也是我今后走向工作岗位的榜样。通过本次毕业设计,我不仅是对我们所学知识的一个汇总,同时也是考验我们学习能力和动手能力的一个平台;让我们能学到更多的相关知识,更重要的是学到了面对困难的不放弃、不气馁的态度,不骄不躁的办事风格,奋发向上的精神,这些在我今后的生活和学习中都是一笔宝贵的财富。第8章参考文献[1]郭惠,吴迅.单片机C语言程序设计完全自学手册[M].电子工业出版社,2008.10:1-200.[2]王东锋,王会良,董冠强.单片机C语言应用100例[M].电子工业出版社,2009.3:145-300.[3]韩毅,杨天.基于HCS12单片机的智能寻迹模型车的设计与实现[J].学术期刊,2008,29(18):1535-1955.[4]王晓明.电动机的单片机控制[J].学术期刊,2002,13(15):1322-1755.[5]胡萍.超声波测距仪的研制.计算机与现代化,2003.10[6]华兵.MCS-51单片机原理应用.武汉:武汉华中科技大学出版社,2002.5[7]李华.MCU-51系列单片机实用接口技术.北京:北京航空航天大学出版社,1993.6[8]《STC12C5A系列单片机中文资料》STC宏晶单片机官方网站附录:(换页。之前空一行,空行为小四)安卓手机上蓝牙程序设计主界面布局在res\layout下新建fragment_main.xml。其中添加4个Button,分别控制小车的前后左右;1个ToggleButton来控制重力感应的开启。两个TextView做装饰。源码如下:[html]viewplaincopy<RelativeLayoutxmlns:android="/apk/res/android"xmlns:tools="/tools"android:layout_width="match_parent"android:layout_height="match_parent"android:paddingBottom="@dimen/activity_vertical_margin"android:paddingLeft="@dimen/activity_horizontal_margin"android:paddingRight="@dimen/activity_horizontal_margin"android:paddingTop="@dimen/activity_vertical_margin"tools:context="com.android.bluetoothcar.MainActivity$PlaceholderFragment"><ToggleButtonandroid:id="@+id/toggleButton1"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_centerHorizontal="true"android:layout_centerVertical="true"android:layout_marginBottom="94dp"android:textOff="@string/gravity_off"android:textOn="@string/gravity_on"/><Buttonandroid:id="@+id/btnf"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_above="@+id/toggleButton1"android:layout_centerHorizontal="true"android:layout_marginBottom="24dp"android:text="@string/forward"/><TextViewandroid:id="@+id/textView1"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="@string/title"/><Buttonandroid:id="@+id/btnl"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_alignParentLeft="true"android:layout_centerVertical="true"android:layout_marginRight="28dp"android:layout_toLeftOf="@+id/toggleButton1"android:text="@string/left"/><Buttonandroid:id="@+id/btnr"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_alignParentRight="true"android:layout_centerVertical="true"android:layout_marginLeft="25dp"android:layout_toRightOf="@+id/toggleButton1"android:text="@string/right"/><Buttonandroid:id="@+id/btnb"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_alignLeft="@+id/btnf"android:layout_below="@+id/btnr"android:layout_marginTop="25dp"android:text="@string/backward"/><TextViewandroid:id="@+id/textView2"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_below="@+id/toggleButton1"android:layout_centerHorizontal="true"android:layout_marginTop="34dp"android:text="@string/beta"android:textAppearance="?android:attr/textAppearanceLarge"android:textColor="#FF0000"/></RelativeLayout>2.在res\layout下新建search_bt.xml。用来设置搜索蓝牙的界面。[html]viewplaincopy<?xmlversion="1.0"encoding="utf-8"?><LinearLayoutxmlns:android="/apk/res/android"android:layout_width="fill_parent"android:layout_height="fill_parent"android:orientation="vertical"><TextViewandroid:id="@+id/title_paired_devices"android:layout_width="fill_parent"android:layout_height="wrap_content"android:background="#666"android:paddingLeft="5dp"android:text="@string/paired_devices"android:textColor="#fff"android:visibility="gone"/><ListViewandroid:id="@+id/paired_devices"android:layout_width="fill_parent"android:layout_height="wrap_content"android:layout_weight="1"android:stackFromBottom="true"/><TextViewandroid:id="@+id/title_new_devices"android:layout_width="fill_parent"android:layout_height="wrap_content"android:background="#666"android:paddingLeft="5dp"android:text="@string/other_devices"android:textColor="#fff"android:visibility="gone"/><ListViewandroid:id="@+id/new_devices"android:layout_width="fill_parent"android:layout_height="wrap_content"android:layout_weight="2"android:stackFromBottom="true"/><Buttonandroid:id="@+id/button_scan"android:layout_width="fill_parent"android:layout_height="wrap_content"android:text="@string/scan_button"/></LinearLayout>3.在res\layout下新建device_name.xml。用来设置搜索到的蓝牙设备的字体大小。[html]viewplaincopy<?xmlversion="1.0"encoding="utf-8"?><TextViewxmlns:android="/apk/res/android"android:layout_width="match_parent"android:layout_height="wrap_content"android:padding="5dp"android:textSize="18sp"/>4.res\value下string.xml。[html]viewplaincopy<?xmlversion="1.0"encoding="utf-8"?><resources><stringname="app_name">蓝牙小车</string><stringname="title">2014届理工毕业设计</string><stringname="gravity_on">重力感应开启</string><stringname="gravity_off">重力感应关闭</string><stringname="left">向左</string><stringname="right">向右</string><stringname="forward">向前</string><stringname="backward">向后</string><stringname="beta">蓝牙小车测试版</string><stringname="action_searchbt">连接蓝牙设备</string><stringname="action_exit">退出</string><stringname="none_paired">无配对设备</string><stringname="select_device">选择以连接</string><stringname="none_found">无其他可用设备</string><stringname="scan_button">搜索其他设备</string><stringname="paired_devices">已配对的设备</string><stringname="other_devices">可用设备</string><stringname="title_connecting">正在连接...</string>界面设计完了,下面开始着重于蓝牙搜索与连接功能。本文主要参考了SDK中的sample。源码可在查看,附上链接:/code/explore/android-2.2-froyo/com/example/android/BluetoothChat下面介绍一下有关蓝牙的使用。1.获取蓝牙权限要使用蓝牙先得获取蓝牙权限,在AndroidManifest.xml中添加BLUETOOTH和BLUETOOTH_ADMIN[java]viewplaincopy<uses-permissionandroid:name="android.permission.BLUETOOTH"/><uses-permissionandroid:name="android.permission.BLUETOOTH_ADMIN"/>2.获取BluetoothAdapter类可以通过getBluetoothAdapter()的方法来获取BluetoothAdapter[java]viewplaincopyprivateBluetoothAdaptermBluetoothAdapter=null;mBluetoothAdapter=BluetoothAdapter.getDefaultAdapter();if(mBluetoothAdapter==null){Toast.makeText(this,"蓝牙不可用",Toast.LENGTH_LONG).show();finish();return;}3.打开蓝牙使用isEnabled()来检测蓝牙是否打开。调用startActivtyForResult()Intent来打开蓝牙,其中REQUEST_ENABLE_BT定义为一个大于0的整数。执行该语句会弹出一个对话框,点击“允许”会返回RESULT_OK,即打开蓝牙;而点击“拒绝”则会返回RESULT_CANCLE,也就是不同意打开蓝牙。[java]viewplaincopyprivatestaticfinalintREQUEST_ENABLE_BT=1;[java]viewplaincopyif(!mBluetoothAdapter.isEnabled()){IntentOpenBTIntent=newIntent(BluetoothAdapter.ACTION_REQUEST_ENABLE);startActivityForResult(OpenBTIntent,REQUEST_ENABLE_BT);}4.查找已配对设备[java]viewplaincopyprivateBluetoothAdaptermBtAdapter;[java]viewplaincopymBtAdapter=BluetoothAdapter.getDefaultAdapter();Set<BluetoothDevice>pairedDevices=mBtAdapter.getBondedDevices();if(pairedDevices.size()>0){findViewById(R.id.title_paired_devices).setVisibility(View.VISIBLE);for(BluetoothDevicedevice:pairedDevices){mPairedDevicesArrayAdapter.add(device.getName()+"\n"+device.getAddress());}5.查询蓝牙设备然后通过startDiscovery()方法启动蓝牙设备的搜寻。这是个异步方法,调用的时候立刻就会返回,大约会持续12秒。为了获得搜寻的结果,必须在用户自己的Activity中注册一个BroadcastReceiver[java]viewplaincopyprivatefinalBroadcastReceivermReceiver=newBroadcastReceiver(){@OverridepublicvoidonReceive(Contextcontext,Intentintent){Stringaction=intent.getAction();if(BluetoothDevice.ACTION_FOUND.equals(action)){BluetoothDevicedevice=intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);if(device.getBondState()!=BluetoothDevice.BOND_BONDED){mNewDevicesArrayAdapter.add(device.getName()+"\n"+device.getAddress());}}elseif(BluetoothAdapter.ACTION_DISCOVERY_FINISHED.equals(action)){setProgressBarIndeterminateVisibility(false);setTitle(R.string.select_device);if(mNewDevicesArrayAdapter.getCount()==0){StringnoDevices=getResources().getText(R.string.none_found).toString();mNewDevicesArrayAdapter.add(noDevices);}}}};}为ACTION_FOUND设置监听过滤,注册BroadcastReciver[java]viewplaincopyIntentFilterfilter=newIntentFilter(BluetoothDevice.ACTION_FOUND);this.registerReceiver(mReceiver,filter);Activity结束后调用cancelDiscovery()可停止搜索,并注销广播。[java]viewplaincopyprotectedvoidonDestroy(){super.onDestroy();if(mBtAdapter!=null){mBtAdapter.cancelDiscovery();}this.unregisterReceiver(mReceiver);}6.建立连接客户端(Client)作为发起连接的一方,我们可以调用createRfcommSocketToServiceRecord(UUID)来获得蓝牙套接字。蓝牙串口通信,有一个固定的UUID,为00001101-0000-1000-8000-00805F9B34FB。通过调用connect()来发起一个连接,这是一个阻塞调用,所以必须新建一个线程。[java]viewplaincopyprivatestaticfinalUUIDMY_UUID=UUID.fromString("00001101-0000-1000-8000-00805F9B34FB");[java]viewplaincopyprivateclassConnectThreadextendsThread{privatefinalBluetoothSocketmmSocket;privatefinalBluetoothDevicemmDevice;publicConnectThread(BluetoothDevicedevice){mmDevice=device;BluetoothSockettmp=null;try{tmp=device.createRfcommSocketToServiceRecord(MY_UUID);}catch(IOExceptione){}mmSocket=tmp;}publicvoidrun(){setName("ConnectThread");mAdapter.cancelDiscovery();try{mmSocket.connect();}catch(IOExceptione){connectionFailed();try{mmSocket.close();}catch(IOExceptione2){}BluetoothCarService.this.start();return;}synchronized(BluetoothCarService.this){mConnectThread=null;}connected(mmSocket,mmDevice);}publicvoidcancel(){try{mmSocket.close();}catch(IOExceptione){}}}建立点击蓝牙列表的监听。搜索蓝牙会消耗大量的资源,所以在准备建立连接之前需要取消搜索。[java]viewplaincopyprivateOnItemClickListenermDeviceClickListener=newOnItemClickListener(){publicvoidonItemClick(AdapterView<?>av,Viewv,intarg2,longarg3){mBtAdapter.cancelDiscovery();Stringinfo=((TextView)v).getText().toString();Stringaddress=info.substring(info.length()-17);Intentintent=newIntent();intent.putExtra(EXTRA_DEVICE_ADDRESS,address);setResult(Activity.RESULT_OK,intent);finish();}};7.管理连接连接建立之后,就可以在客户端和蓝牙模块之间进行通讯。通过调用getOutPutStream()来获取OutputStream,通过write(byte[])写入数据。因为write(byte[])也为阻塞调用,所以也必须建立一个新的线程。[java]viewplaincopyprivateclassConnectedThreadextendsThread{privatefinalBluetoothSocketmmSocket;privatefinalOutputStreammmOutStream;publicConnectedThread(BluetoothSocketsocket){mmSocket=socket;OutputStreamtmpOut=null;try{tmpOut=socket.getOutputStream();}catch(IOExceptione){}mmOutStream=tmpOut;}publicvoidwrite(byte[]buffer){try{mmOutStream.write(buffer);mHandler.obtainMessage(M
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025届江苏省徐州市泉山区重点中学高中三年级教学质量监测(二)物理试题含解析
- 辽宁省辽阳市弓长岭区2025年六年级下学期小升初数学考前押题卷含解析
- 上海市长宁、金山、青浦区2025年高三下学期诊断性考试历史试题含解析
- 守护花季培训课件
- 天车维修施工方案
- 医疗文书规范书写
- 工程合同质量管理
- 信息技术 第二册(五年制高职)课件 6.1 设计数字媒体作品制作方案
- 人造血管的护理2025
- 23版概论课课件
- 车间叉车安全操作规程及注意事项(2篇)
- 危险品运输汛期应急预案
- 国际木材电子交易市场商业计划书
- 智慧树知到《大学生心理健康教育》章节测试答案
- 前程无忧测评题库及答案
- 【MOOC】计算机组成与CPU设计实验-江苏大学 中国大学慕课MOOC答案
- 《西方经济学》课程教学大纲
- 瓶装液化石油气送气工应知应会手册
- 2024年广西高考真题化学试题(解析版)
- 2024年中国工商银行系统招聘笔试考试题库(浓缩500题)
- 医疗器械临床试验伦理要点
评论
0/150
提交评论