总体介绍

概要

本次科创的目的是实现安卓系统控制智能小车。现在随着智能手机的普及,大家对于智能手机的应用已经越来越广泛。而安卓系统作为智能手机中市场份额最高的系统,是我们需要研究的重点。学会安卓系统的开发将是我们一项重要的技能,这也是我们学习这个课程需要达到的目的。

总体流程

系统的实现流程如下:

  • 安卓端软件监听按钮上的动作
  • 根据动作的类型通过蓝牙将信号发送给单片机
  • 单片机接收来自串口的信号
  • 单片机根据信号的类型将遥控器的相应端口置位
  • 遥控器控制小车

按照这个流程,我们完成了整个项目,下面是小车的运行时的照片和视频。

照片和视频

小组成员

小组组长: 李奇平

分工: 小组组长,负责单片机部分代码的编写以及调试工作,协调组员使其能够更好的合作。

组员: 金鹏

分工: 负责单片机的焊接工作,以及java的编写以及调试部分。

组员: 沈梦月

分工: 负责单片机与电脑安卓虚拟机之间信息的通信,以及串口调试的工作。

硬件部分

image

简要说明

1、J1为遥控器的电源输入,根据不同的遥控器型号,为9V或3V两种。 Vsel端上下符号标反了,对9V遥控器电池,跳线帽接中间与下面(3vin),此时,系统电源通过7805转为5V,再通过REG1117-3.3转为3.3V提供系统电源,3V遥控器电池,跳线帽接中间与上面(9in),遥控器电源直接进入系统进行供电。 请务必注意,以免烧毁单片机。以上不能选错。

2、ON_OFF跳线为单片机电源开关,连上时单片机处于上电状态,供烧写程序使用。

3、J3 PROG为单片机编程口,需与USB-TTL线相连,线的黑色为地,连接J3的1脚G,红色为线的TXD,需与J3的3脚T相连,白线为线的RXD,与J3的R相连。

4、 J4为蓝牙模块接口,与实验室配套的蓝牙板相连,提供蓝牙功能。

5、 J2为遥控器的控制线,与遥控器上U,D,L,R四个金属片连接。

系统原理

蓝牙模块与单片机串口相连,当有上位机有数据传下时,单片机在串口上会得到对应的数据,程序需形成相应的ULDR动作。

单片机的P3.2-3.5分别控制UDLR四个方向,低电平时通过光耦,使遥控器上对应的金属片与地相连,形成“按下”的效果。

image image image

以上三张图是我们已经焊了一部分的实物图,最后的成品因为没有拍照所以这里就不展示了。最后这块板子要通过四根导线连接到原来遥控器的四个控制端口,如果向其中发送信号来控制小车的前进,后退,以及左转和右转。

软件部分

单片机部分

单片机程序从蓝牙模块接收字节,并根据收到的字符分别控制单片机的UDLR四个输出端口的电位高低,从而达到控制小车前后左右运动的目的。

由于单片机的型号和往届科创2B单片机型号一样,我们这次的单片机程序主要参考了往届的单片机程序,只需要在某些地方进行相应改动,而这些地方也是单片机程序能够成功与小车和蓝牙进行通信的关键,下面我一一介绍:

波特率的设置

首先是波特率的设置,这是与单片机进行串口通信的关键。为了设置正确的波特率,我们查阅了单片机的相关手册,并总结出了单片机波特率的一般计算方法如下:

1.确定串行口的工作方式

串口的工作方式一共有四种:分别为模式0-3,对于不同的模式,波特率的计算方法不一样。而串行口的模式在SCON寄存器设置,SCON的各个位如下表:

由SM0和SM1决定串口的工作模式:

而在我们的程序中SCON=0x50也就是SM0=0,SM1=1,对应的是模式1。

2.模式1波特率的计算方法

波特率= 2SMOD ×定时器T1溢出率/32

T1溢出率=T1计数率/产生溢出所需的周期数

式中T1计数率取决于它工作在定时器状态还是计数器状态。T1计数率为外部输入频率,此输入频率应为Fosc/24。产生溢出所需周期与定时器T1的工作方式、T1的预置值有关。

3.T1的工作方式和预设值

TMOD |= 0x20,也就是将T1设置在工作方式2(TMOD的高4位控制T1定时器),此工作模式下计数器为8位计数器,并从预设值开始计数,溢出所需周期数=256-x,其中x为开始的预设值,这次我们的预设值是0xFD,也就是溢出所需的周期数位3。带入上面的公式,最终求得波特率为9600。

注:波特率计算器

计算波特率有个波特率计算器,只要你输入晶振率和波特率就能自动生成相应的C代码,强烈推荐这个波特率计算器,又方便,又准确,省去了许多计算的烦恼,网上百度STC波特率计算器即可得到。

蓝牙串口的转换

开始单片机是从串行口P3输入,现在为了从P1输入,进行切换。切换的方法在老师给的STC单片机手册的99页:将AUXR1寄存器的最高位置1,而从单片机的管教图可以看出AUXR1寄存器的地址是0XA2,因此只要得到这个地址然后用一条语句AUXR1 |= 0x80即可完成切换。另外在单片机手册的288页也有单片机串口P1的示例程序。

控制遥控器

最后是分别给UDLR四个管脚置位。这个比较简单,只要先获得四个管脚的地址,然后根据接受到的字符(‘1’‘2’‘3’‘4’)来分别置低电平即可。具体过程可以查看我们单片机代码的receive_cmd函数。

安卓程序部分

这次的安卓程序也同样是参考了助教给出的ThinBTClient工程的代码,并对它进行了小部分的修改。对于这个安卓的主要部分做一个介绍:

布局文件

首先是res/layout/manifest.xml文件,它是这个工程的布局文件,也就是程序运行时的用户界面,通过它生成了有5个button,分别为前进,后退,左转,右转和停止的一个视图。

控制程序

另外就是ThinBTClient.java。这个是这个项目的主要代码部分,虽然说有点长,但是大部分都是重复,因为前后左右都是基本重复的代码,我就选取其中的一个来进行说明:

这个java程序还有一个比较重要的地方就是蓝牙的连接部分:

可以看到,蓝牙的地址是硬写进去的,我们通过电脑上的蓝牙控制程序得到单片机的蓝牙的物理地址,然后硬写进我们的程序,当然如果稍加改进,可以有一个识别所有的蓝牙然后选择连接的过程。

所以安卓端的程序就是这样,先与单片机建立连接,然后监听每一个button的动作,每次按下button就给单片机发送相应的字符,实现对小车的控制。

心得体会

组长 李奇平

这次做科创的收获还是很大的,通过小组成员之间的配合和努力,终于还是把这次的科创圆满完成了。从最开始的焊电路板到最后的调试,我们在一起不停地交流,讨论和试验。虽说项目并不复杂,但如果仅凭一人之力,确实很难实现。有时不同的人有看问题的不同的角度,当某个人遇到瓶颈时,或许其他人的一句话就能起到柳暗花明的效果。有时调试得十分烦恼时,同学之间的相互鼓励也是我们不断坚持下去的动力。一个学期下来,学的知识先不说,同学之间友好的合作是最大的收获。

这次的主要工作花在了单片机的串口调试上面,为了实现串口的通信,我们首先在电脑上通过串口调试助手直接给小车发指令,而一开始波特率总是计算错误,最终找到了波特率计算器这个神器才将问题解决。然后是串口转到蓝牙时也发生了一点问题,我们又转到串口调试助手,通过电脑的蓝牙串口给小车发指令。最后蓝牙调试好了,虚拟机上发送又出了问题,这主要原因还是蓝牙没有正确连接。经过所有这些步骤之后终于大功告成。

感谢老师的耐心指导,调试过程中像老师请教了许多问题,虽然没有给出具体的解决方法,但是我们学到了很多思考的方法。这些思考方法对于我们以后解决问题仍有效用。

组员 金鹏

由于这次科技创新项目是一个全新的项目,而我们是该项目的第一批学生。所以很多东西需要我们自己进行探索,而不是像以前那样寻找学长的帮助。也是源于此我们的搜索能力得到了很大提升,学会了如何依据发现的问题来决定探索的方向,并且在不断的失败中找到最终的答案。觉得本次科创最大的时候是能够真正独立的完成一个项目并且其中所碰到的问题都是自己独立解决的并没有去依靠别人的经验。

组员 沈梦月

这次科创结合了当前比较流行的安卓手机平台,内容较为新颖时尚,但是也给了我们很多全新的挑战和考验。在课程前期,我们查找了很多相关资料,对项目有了整体的认识。后期的代码的编写和调试的过程中,出现了很多意想不到的问题,但通过同学之间的讨论和向老师的请教,最终项目还是比较圆满的完成了。这次科创的主要收获是学习了基于安卓手机平台的相关知识和同学之间的相互合作。