基于GPS的公交车站点播报
任务书
本设计的主控芯片单片机为基础,利用GPS获取比较精确的公交位置信息;并由AT89C51进行智能整合处理信息,发送控制指令;利用ISD1700系统语音芯片实现语音播报,并通过LCD液晶模块加以显示信息。具体的功能有以下三点:
-
GPS定位站点:在GPS自动播报模式下,系统自动实时检测当前所处GPS坐标,并与设置的站点坐标比对,当当前坐标与某个站点的坐标误差在指定范围,则认为到了指定的站点
-
手动切换模式:人工通过上一站、下一站按键到了指定站点,则播放对应站点的语音提示。
GPS自动播报/人工播报模式切换:人工播报模式时,根据往返设置以及按上一站、下一站按键来确定需要播放语音的站点;GPS自动播报则是通过GPS坐标来检测到了哪个站点,此时往返键不起作用。 -
显示屏显示对应的站点名称及相关信息
-
详细的站点信息包括以下几个:
寝室站
食堂站
足球场站
琴湖站
综合楼站
信息楼站
南门站
方案设计
通过阅读这个任务书,已经知晓了,需要构建一个包括GPS模块,51核心板模块,OLED显示模块,语音播报模块和按键模块。
因为时间过于仓促,所以打算使用模块化的设计思路,优先逐个调通各个模块,然后再进行程序的联合调试,最后是硬件部分的调试。
硬件搭建
现在针对不同的模块,进行数据类型分类汇总,从而符合任务书的要求:
-
OLED屏幕
显示屏用来显示站点信息,系统的位置信息(经纬度),模式信息(手动orGPS),语音提示的文字,所以可以忽略掉时钟信息。
显示的像素点的范围是128*64
-
GPS模块
用来获取当前的位置信息、时钟信息
-
矩阵键盘
用来完成模式切换,手动模式的上下站切换,可以拓展为站点位置的坐标输入。
目前总共有16个按键,根据任务书的要求,对不同的键值的功能分配如下:
-
键值0
主要是实现站点信息的上行播报功能,已经完成了调试,符合任务书要求。
从图中可以分析得出,所谓上行,就是从第一站到第七站,进行循环执行。
-
键值1
主要是实现站点信息的下行播报功能,完成了调试工作,符合任务书要求。
从上图中可以发现,所谓下行,就是站点信息从第七站到第一站进行循环执行。
- 键值2
站点语音信息进行重复播报,如图所示,当前站点是G站,并且通过按键,对G站进行了4次播报,并且在完成了重复播报后,程序依旧正常进行下一个站点的信息播报。
-
键值3
主要是实现对站点信息的复位,暂定从初始位置开始播报语音
如图所示,当按下初始化站点信息的时候,无论当前执行到何种站点,程序会把站点信息复位到A站。从上图我们也可发现,共进行了两次复位操作。
-
键值4
用于进行站点播报的模式切换,即手动模式和GPS自动播报模式
-
键值5
进行手动模式下的上一站切换
-
键值6
进行手动模式下的下一站切换
-
键值7
-
键值8
-
键值9
-
键值10
-
键值11
-
键值12
-
键值13
-
键值14
-
键值15
-
语音播报模块
这个模块需要提前进行音频文件的存储,并且需要配备一个SD卡,用来存储音频,另外可以借助5个IO来实现对31段音频文件的选择性播放。结合上一次的项目,可以发现,这里将使用P0端口进行语音播报的控制端口。
note:对于站点信息的语音播报,可以利用网上的文字转语音软件进行转换。需要注意转换后的文件格式为MP3格式
用来完成上下站站点语音提示和开车下车的一些语音提示,主要的语音提示如下:
语音信息的数据类型:
-
起步阶段
- 车辆起步请扶好站好注意安全
- 请主动给老弱病残等乘客让座
-
到站阶段
-
站点信息+到了
-
请依次从后门下车请注意安全
note:站点信息包括7个站点,分别是如下几个站:
第一站:寝室站第二站:食堂站
第三站:足球场站
第四站:琴湖站
第五站:综合楼站
第六站:信息楼站
第七站:南门站
-
器件选型
- 51单片机核心板
- OLED屏幕 IIC接口 两根线 SCL SDA
- GPS模块 UART通信 两根线 TX RX ATGM336H
- 矩阵按键 需要8个IO口
- 语音播报模块 需要5个IO口 MP3语音播放提示模块
软件搭建
软件的调试步骤和硬件搭建过程类似,也是分模块调试,先完成各个模块的独立调试,验证其功能性,然后再接着进行所有模块的程序联合调试,最后是转移到核心板上进行硬件平台的测试。
任务达成汇总:
-
今天先完成用手动模式的加减换站功能,也就是完成手动模式的站点播报。
- 如果单片机采用的是12Mhz,则系统在进行串口通信时,对于波特率的调整是非常的不自由,只能选择2400的波特率。而9600有些时候也是可以的。
-
完成了对于GPS例程的研究,知道了如何对经度和纬度数据进行解析和获取方式。也学到了一些c语言的基础知识,比如:
-
extern char *strstr(char *str1, const char *str2); // 若str2是str1的子串,则返回str2在str1的首次出现的地址;如果str2不是str1的子串,则返回NULL。 // extern这个关键字,是在一个x.c文件中定义,然后在x.h文件中进行声明;假设在 //另一个y.c文件中需要使用,则可以将该x.h头文件包含在y.c文件中即可使用
-
-
-
还知道了一些如何在单片机的串口调试中,进行换行操作:
sendstring("\r\n");// 在需要换行操作的字符串后边,跟上这样一个字符串,即可 //完成换行
-
对于矩阵按键的功能设定如下:
系统在上电后,默认是GPS模式,如果需要,可以通过按键4切换到手动模式。
fig_mode=~fig_mode //利用这个取反符号,可以实现用一个按键,实现两种不同模式的功能切换
从上面的设定中,也是可以看出来的,如果目前是手动触发模式,则需要对于车辆的起步信号,也要作为手动才可。截止目前为止,已经将程序的大体框架构建了起来,只需要等到GPS模块出现即可!
在对于触发模式的开发过程中,些微遇到点麻烦,一开始是无法进入到按键4的状态,开始怀疑是三个问题,其一是自己编写软件的问题,其二是开发板的矩阵按键有故障,其三是芯片问题。其实一开始是不知道是芯片的问题,直到将矩阵按键的例程下载到开发板上后,通过呢使用,才发觉是芯片的问题,后更换芯片后,同样的例程,功能正常,所以开发板的硬件是正常的。随后将自己编写的模式触发程序下载到板子上进行测试,功能正常。故总结一句,软硬都得啃的动,才是合格的电子工程师。
另外一个问题是设定系统使用手动触发后,亦需要借助手动按键区分车辆起步和到站这两个状态。在一开始区分这个状态时,也是遇到了一点困难,好在最后得到了解决,具体是怎么解决的呢?请看下面的代码:
else //手动触发模式
{
led1=1;
// led=1;
if(KeyValue==5 )
{
led=1;
stationx=station+1;
station++;
if(station==7)
{
station=0;
}
if(stationx==7)
{
stationx=0;
}
KeyValue=0XFF;
}
if(KeyValue==6 )
{
led=1;
stationx=station-1;
station--;
if(station==0XFF )
{
station=6;
}
if(stationx==0xff)
{
stationx=6;
}
KeyValue=0XFF;
}
sendchar(staname[station]);
sendstring(longstring2);
sendstring(longstring3);
sendstring("\r\n");
stationow= station;
while(KeyValue==0XFF)
KeyDown();
上述的代码不做解释,懂的自然懂。