科创3C C06小组报告

总体介绍

概要

本次科创的目的是实现安卓系统控制智能小车。现在随着智能手机的普及,大家对于智能手机的应用已经越来越广泛。安卓编程的地位也是与日具增,而通过本次科创我们将学习如何编写安卓程序同时学会安卓与蓝牙以及蓝牙与单片机之间的通信。

 

总体流程

系统的实现流程如下:

              安卓端软件监听按钮上的动作

              根据动作的类型通过蓝牙将信号发送给单片机

              单片机接收来自串口的信号

              单片机根据信号的类型将遥控器的相应端口置位

              遥控器控制小车

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

视频

  

小组成员

小组组长: 沈之默

分工: 小组组长,负责搜集资料、调试与debug工作,协调组员使其能够更好的合作。

 

 

组员: 刘星驰

分工: 负责单片机的焊接工作,以及参与串口调试。

 

 

组员: 黄鹏程

分工: 负责单片机部分代码的编写以及单片机与电脑安卓虚拟机之间信息的通信。

硬件部分

简要说明

1J1为遥控器的电源输入,根据不同的遥控器型号,为9V3V两种。

Vsel端上下符号标反了,对9V遥控器电池,跳线帽接中间与下面(3vin),此时,系统电源通过7805转为5V,再通过REG1117-3.3转为3.3V提供系统电源,
3V
遥控器电池,跳线帽接中间与上面(9in),遥控器电源直接进入系统进行供电。
2
ON_OFF跳线为单片机电源开关,连上时单片机处于上电状态,供烧写程序使用。
3
J3 PROG为单片机编程口,需与USB-TTL线相连,线的黑色为地,连接J31G,红色为线的TXD,需与J33T相连,白线为线的RXD,与J3R相连。

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

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

系统原理:

蓝牙模块与单片机串口相连,当有上位机有数据传下时,单片机在串口上会得到对应的数据,程序需形成相应的ULDR动作。
单片机的P3.2-3.5分别控制UDLR四个方向,低电平时通过光耦,使遥控器上对应的金属片与地相连,形成按下的效果。

基本上硬件部分按照原理图来连接就可以了,不过在实现硬件的过程中,我们也发现几个电阻的阻值原因曾导致低电压过高而无法工作,所以途中的几个电阻要改一下电阻值。那两个二极管可以拆下来,否则非常耗电,还有蓝牙的插口比较松,要注意接触不良,其他就没什么要注意的了。

系统原理

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

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

image  

以上是遥控器部分(蓝牙模块、单片机以及基本控制电路)的实物图。

 

软件部分

单片机部分

      单片机的作用是从蓝牙模块接受字节,然后根据收到的内容控制单片机UDLR这四个输出端口的高低电平,这四个端口分别与遥控器上的前后左右相连。比如若设置U端口为低电平,那么就相当于将遥控器上的“前”设为低电平,形成按下的效果,从而控制小车向前移动。

      在写单片机的程序时,有几个重要的步骤是难点。

 设置波特率

      这一部分是我们小组遇到的最主要问题。因为我们之前没有接触过单片机通信,所以在写这一部分的程序时,我们查阅了大量资料。其中”STC11F-10FXX.pdf”这个手册的第八章“串行口通信”这一章节对这一部分有一个详细的介绍。

1.       设置串行口工作方式

根据这次的科创需要,我们将工作模式设定为模式1,即SM0 = 0 SM1 = 1。设置的方法是通过将SCON 赋值为0x50

2.       波特率的计算

SM0 = 0 SM1 = 1时,串口选择工作方式1,其数据传输的波特率由定时计数器T1T2溢出速率决定,可通过程序设定。

    波特率 = 25MOD * 定时器T1溢出率/32

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

3.       设置T1工作方式

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

          

4.I/0口工作模式的设置

这一部分在单片机手册中也有详细的介绍。

AUXR1寄存器设置(PCA/PWM/SPI/UART2)是在P1口还是在P3

 

这次我们需要用的是从P1口输入,因此我们通过AUXR1 |= 0x80这条语句完成设置。

 

5.UDLR管脚设置

我们通过查看接受到的字符的不同内容(通过查看SBUF值),设置UDLR四个管脚的电平。这四个管脚分别是P3^2, P3^3, P3^4, p3^5.

 

调试:

这次在编写单片机程序时遇到了一个比较大的问题。

刚开始时,我们组先在电脑端用串口调试助手通过蓝牙给单片机发指令,但是令我们困惑的是,每次我们发过去同一个指令,但接收回来的数据却一直在变。这方面的问题应该就是出在波特率的设定上,但我们具体查看了波特率的设定,觉得我们确实把波特率设对了(实在不知道哪里出问题了)。最后我们用了一个比较诡异的解决方法:就是选一个稳定的数据(发送同一个数据,接收到的也是同一个数据,虽然不是发送出来的那个数据)。然后我们推算出单片机那边接收到的数据值是多少,最后,我们选了四个稳定的值,分别是:发送1216进制),接收到的数据是FA16进制);发送16,接收到的数据是FB;发送44,接收到的数据是FD;发送06,发送的数据是F9

因此,我们最后采用这种不是方法的方法,解决了这个问题。  

     

安卓程序部分

 

因为之前没接触过安卓编程,所以,这一部分我们也花费了不少精力。

首先是蓝牙权限声明:

AndroidMainfest.xml文件中添加

      <uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />

 <uses-permission android:name="android.permission.BLUETOOTH" />

这两句来进行蓝牙权限声明。若没有声明,则无法使用安卓手机的蓝牙功能。

接着是界面:

界面上主要是有五个Button,这五个按钮的布局是按AbsoluteLayout方式布局的,分别是前进、后退、左转、右转、停止。(在res/layout/main.xml文件中)

 

主程序部分

蓝牙模块编程:

先判断手机是否支持蓝牙,及蓝牙是否已经打开,若都已经打开,则可以与外界的蓝牙连接(由于方便起见,直接与单片机上的蓝牙模块连接。更一般的做法应该是先查找周围的蓝牙,显示以查找到的蓝牙列表,然后用户可以选择要连接的蓝牙模块)。

接着,就可以向连接上的外界蓝牙传输数据了。这边蓝牙数据的传输其实是通过socket编程,即套接字编程。将一个字节以二进制的方式传送。

按钮监听:

在用socket传送数据之前,要先确定需要传输的内容。这是通过监听每个按钮实现的。当一个按钮被按下时,就传送一个字节,当按钮松开时,再传送一个字节,完成一个控制动作。

调试

由于前面单片机波特率设置的问题,这边的程序传送的数据要跟单片机上预接受的数据符合。

           前进就传送6message = “\006”,表示要传送06

           后退就传送44message = “\104”,表示要传送44

           左转就传送16message = “\026”,表示要传送16

           右转就传送12,(message= “\022”,表示要传送12

停止时的message只要与上面不同即可,这边用message = “\111”

每当按钮松开时,也同样传送一个停止命令。

心得体会

组长 沈之默

    这次的科创做得还是感觉很有意思的,虽然一开始由于很长时间没有拿到器材而导致热情减退,但是后来还是觉得这个小车控制的设计与制作是一件很有意思的事情。当然我们在完成它的时候也遇到了许许多多的困难,比如当初把二极管给焊反了。再比如我们发送的消息和接收到的消息总是不一致……随然遇到了这些困难,也没有同学在一旁帮忙参考,只有靠我们自己解决,而当困扰我们许久的问题终于解决之时,我们也都感到了由衷的喜悦。

我也非常感谢张老师,不论我们是发帖还是发邮件,他总是第一时间回复我们,同时也对我们的问题没有感到丝毫的不耐烦,衷心感谢他的耐心指导。

 

组员 黄鹏程

       这次科创我负责的部分是单片机程序与安卓程序的编写,真的有很大很大的收获。由于我们这一组都是CS系的,之前虽然接触过单片机,但却没有接触过单片机的通信这一方面。因此,在做科创的过程中,遇到了一些很棘手的问题,如:刚开始写单片机程序时,却发现单片机程序怎么也烧录不进去。上网查看了很多问题,渐渐解决了一些问题,后来在老师的帮助下,终于成功将程序烧录进去,算是第一个突破吧。接着又发现,虽然通过程序设定UDLR四个端口的电平,遥控器上的指示灯确实亮了,但小车却没有反应,后来在老师的帮助下,换了电阻的大小,才解决了这个问题。这个给我最大的体会就是要将整个工作电路搞懂,这样才能发现出现问题的原因。

       最后遇到了一个问题,也是最棘手的问题——单片机串口的调试。刚开始我直接用安卓手机直接给单片机发消息,但什么反应都没有,然后就一步一步查找问题,但最后发现这个方法是很难完成的。最后还是在老师的帮助下,借给了我一个蓝牙模块,然后我们开始在电脑端通过蓝牙调试助手给单片机发指令,最后才成功解决了问题。

       最后,非常感谢老师一直给予的耐心指导。在做科创的过程中,请教了老师很多问题,到老师的办公室找了好几次老师,从老师那边学到了很多,特别是当你遇到一个不知完全从何入手的问题时,怎么去着手解决它,在这方面,这次真的有很多的体会。

 

组员 刘星驰

 这次的科创过程非常有意义,使我受益匪浅。

 首先,题目就非常吸引我。前面两个科创的内容除了与电路板打交道就是看示波器,其实我是没有什么兴趣的。但这次能够控制小车我十分期待,所以也花了很大的力气。

我主要负责在开始的时候制作基础的电路以及后期的调试工作。电路板上的许多元件很小导致我出现了一些失误,好在最后及时调整正确,将二极管的方向调整了回来。当软件部分也开始动工,并只通过单片机让小车能简单地前进后退时,我们都有了一丝成就感。

 可是最大的问题出现在蓝牙与单片机的通信上。安卓系统上的操作程序与单片机无法通信,此时的问题可能是硬件传输方面的,也可能是软件设计方面的。如果是硬件方面的缺陷,整个工程就面临着从头开始的风险。好在经过几个晚上的努力修改程序和调试,最终发现了波特率方面的不对称导致数据不统一,并修改完成了基础部分。不过最终还是有些疏忽,小车的左右方向设定是反的。

 经过这次与组员合作,我明白了分工的重要性以及耐心调试的必要。希望经过这次的进步,下次能完成更加复杂和多样的工作。