基于嵌入式的水上VHF自动播报系统的设计
2016-05-14董涛
董涛
摘要:水上VHF通信系统是全球通用的具有国际标准的通信方式,本文针对海事管理中航行信息发布需求来设计的一套基于嵌入式的VHF自动播发系统,本设计在类似非预制语音自动播放应用上具有一定的参考意义。
关键词:嵌入式;VHF;TTS;自动播发
中图分类号:U644 文献标识码:A 文章编号:1006-7973(2016)07-0031-03
VHF通信是保障长江航行安全必不可少的通信手段,因其具有统一的国际标准,主要应用于船与船、船与岸之间进行的船舶会让、遇险报警、海事救助等方面的通信联络,特别是由于其广播的性质,在岸台的水文气象、航行通告等信息的发布上起到了不可替代的作用。但在当前常用的需要定时播出的航行通告等信息的播发中,操作人员一般需要提前录制好语音文件或者操作TYS软件将文本转为语音文件,再将该文件上传给播发系统定时播出,该操作需要操作人员具备熟练的普通话能力和相关软件操作能力,实际应用中具有一定的难度。
本设计就是在需要通过VHF进行航行通告等信息播发的单位、站点设置一台基于嵌入式系统的播发主机与VHF船(岸台)机相连,操作人员通过内部网络使用浏览器访问该主机,在页面上提交播发任务和文本播发内容,该主机会按照任务列表进行自动播发。
1 系统设计方案
1.1 系统需求
要实现VHF自动播报系统,需要搭建一台主机系统与VHF船(岸)台机相连,实现以下功能:1.该主机能够将播报内容以音频的方式发送给VHF船(岸)台机,并控制其播发;2.该主机能存储并管理播发内容,实现定时按需播发;3.该主机能够接入内部网络中并实现远程访问,用户仅需提交文字版的播发内容并可以对其进行增、删、改等操作;4.该主机要能专用并小型化,系统工作稳定。
1.2 系统方案
根据系统需求,一台基于嵌入式系统的主机系统方案能满足需要,其系统架构如图1所示,采用安装了Linux系统的嵌入式平台作为控制主机,在该主机上搭建web服务器和数据库系统并设计播报软件。远程用户通过浏览器访问该控制主机,在管理页面上提交需要发布的航行信息(文本),播报系统会在预定的时间将该内容通过硬件TTS模块转换为语音信号输出至VHF船(岸)台机并向附近水域播发。
2 硬件选型
系统硬件架构如图2,由主机模块、电源模块和VHF模块组成。主要硬件设备选型如下:
2.1 控制主机
控制主机选用树莓派2代。树莓派是树莓派基金会发布的卡片式电脑,具有900MHz主频的4核ARM Cortex-A7 CPU、1G内存、10/100M以太网接口的主机系统,主板上载有40针的GPIO(General Purpose Input Output通用输入输出)接口,连接实现外部控制和串行通信功能。利用MicroSD卡作为存储,安装和运行基于Linux的Raspbian或Win10 IoT等操作系统。该主机完全性能可以满足本项目的主机硬件平台需求。
2.2 硬件TTS模块
硬件TTS模块选择宇音天下公司出品的最新一代SYN6658中文语音合成芯片模块。该语音芯片通过UART和上位机通信,直接接收待合成的文本数据,实现文本到语音(TYS,TextTo Speech)的转换功能。该模块支持任意中文文本(<4K字节)的合成,智能识别区分数值、时间、度量衡、姓氏、多音字等各式文本,内置多种提示音可选,并能实现男女声、语速、语调、音量调整。该模块接线简单,仅需连接供电、UART输入,提供一路单声道语音输出,该模块控制简单、功能强大,输出语音柔和自然。
2.3 VHF船台机
VHF船台机选用建伍(KENWOOD)公司的TM-271A型VHF调频对讲机,该型VHF调频对讲机可以调整为水上专用VHF频道。选用该型VHF船台机的主要原因是该机型麦克风接口使用的是标准的RJ45接头,接线标准明晰,后期改装简单。接线线序如图3所示,6针为麦克风输入、5针为麦克风地,将两针与TTS模块的语音输出直接连接实现语音的输入;4针为PTT(PushToTalk)脚、3针为地,将4/3针导通实现麦克风手柄的PIT按钮按下功能,其他接线脚悬空不用处理。
2.4 其他模块
电源模块直接利用VHF专用的13.6V直流电源给建伍VHF船台机供电;树莓派电源使用LM2596S直流可调降压模块,该模块输入3-40V、输出1.5-35V(3A)可调,使用时接入VHF电源,输出调整为5V即可。
PIT控制使用1路继电器模块,该模块驱动电压为5V,采用光耦隔离,低电平触发。常开端与VHF接口第4/3针PTY/GND相连,通过触发实现PTT按下功能。
由于树莓派没有实时时钟,断电之后时间会归零。可以使用外接基于DS3231芯片的实时时钟模块在树莓派启动时进行校时以保证运行时间准确。也可以在系统启动之后连接内网的NTP服务器实现授时及校时功能。
3 软件设计
系统软件的总体设计思路是基于任务表驱动系统运行。播报系统每分钟读取一次数据库中的任务表,任务表中任务时间以分钟为单位,将表中的任务时间与系统时间相比对,如果时间相符则播出该条播报信息,播放完成后将播放内容保存至已播放表。系统运行流程图如图4所示:
要实现系统设计目标,需要完成以下系统及软件的设计:
3.1 操作系统搭建
树莓派使用主板上的bootload来引导烧录在MicroSD卡上的操作系统镜像来启动系统。在本设计中使用的是Raspbian系统,Raspbian是基于Debian GNU/Linux的免费操作系统,它面向Raspberry Pi硬件(armhf处理器架构)做了优化,内置了多个常用的软件包和预编译软件,非常适合于常用的web服务器、物联网设备控制等系统设计和开发。
Raspbian系统安装:首先从Raspbian官方或者国内镜像下载Raspbian系统包,然后在windows系统下使用Win32DiskImag-er将.img文件写人MicroSD卡;再将卡插入树莓派MicroSD插槽,上电后Raspbian会自动启动。在完成系统安装之后,通过SSH登陆树莓派设置好静态lP地址并安装VNC Server,方便后期使用vnc客户端远程登陆至树莓派x desktop上进行操作。
本设计使用Linux+Nginx+SQLite+Python+Django架设服务器来取代常用的LAMP(Linux+Apache+Mysql+PHP)的方式来架设Web服务,因为该方式较LAMP来说资源消耗低,开发起来也比较便捷。树莓派上安装Nginx/Django/SQLite/Python的方法网上较多,此处不赘述了。
3.2 数据库设计
本设计使用SQLite作为数据库系统,SQLite是一款轻量化的数据库系统,其设计目标就是使用在嵌入式系统中,资源占用小但功能强大,它独立、开源并支持多种开发语言,是轻量级嵌入式开发较为合适的数据库系统。
SQLite数据库为单文件数据库,本设计数据库名为playlist.db,其中包含两个主要的表:tasklist(播放任务)、complist(已播放)表。其中,tasklist表主要有以下字段:
playtime TEXT//计划播报时间
freq
INTEGER//播报频率
num
INTEGER//播报次数
title TEXT//播报内容标题
text TEXT//播报内容
其中playtime为播报时间,格式为YYYYMMDDHHMM,如201601011330;freq播报频率指间隔多少分钟播出一次(根据实际播出要求,该频率一般为5-120分钟);nun指一共播出多少次;title限定20汉字以内;text限定200汉字以内。
eomplist表用于保存已播放内容,仅需playtime、title和text字段。
根据日常使用经验,系统主要是针对tasklist表中的内容进行增、删、改操作,即向播放列表中加入播放条目、播放完成后删除播放条目、对未播放内容进行修改,数据纪录条数较少,检索方便。complist表主要是增加数据纪录操作,由于该表是每次播放完成后将已播放内容加入,数据纪录天然按照播放时间(playtime)字段增序排列,不需要进行额外排序工作。
3.3 WEB服务器设计
WEB服务框架采用Django。Django是一个开放源代码的Web应用框架,由Python写成,采用了MVC(Model View Control-ler,模型、视图、控制器)的软件设计模式。选用Django的原因是使用框架封装了控制层,数据调用等操作只需调用相应的方法即可完成,另外有大量的第三方插件可以使用,大大的提高开发的效率。
WEB服务器采用Nginx。Nginx是一款轻量级的Web服务器,占用内存仅几兆,非常适合于树莓派上构建WEB服务。Django通过Nginx+uWSGI来部署,Nginx作为服务器最前端,它将接收WEB的所有请求,统一管理请求。Nginx把所有静态请求自己来处理,非静态请求通过uWSGI传递给Django,由Django来进行处理,从而完成一次WEB请求。
WEB页面设计比较简单,直接借用一个基础的论坛发布页面,简单修改后调用数据库内容显示在页面上,可以对每个条目进行增、删、改操作。
3.4 播报软件设计
播报软件使用Python软件开发,Python是一种面向对象、解释型计算机程序设计语言,该语言简洁、易用和可扩展,比较方便使用于WEB开发应用中。
播报软件主要由数据库访问和文本TYS输出组成:
3.4.1 数据库访问
系统运行中正常的数据库访问涉及tasklist表的增加、删除和更新及complist表的增加操作。系统上电运行之后,每分钟查询一次tasklist表,比对是否存在playtime与当前时间相符的记录,如果相符则将该条记录中text字段内容(播发内容)输出,播发完成之后,将该条记录复制进complist表,表明该条播发任务已经完成。然后查看nun字段是否大于1(需要多次播发),如果不大于则表明需要多次播发的任务已经完成,删除该条记录;如果没有完成则将nun字段内容减一,将playtime字段时间加上freq内容(构成下一次播发时间);最后重新更新该条记录,形成一条新的播发任务记录。
3.4.2 文本TTS输出
通过将text字段内容(文本)向串口输出至SYN6658芯片实现文字到语音的转换后从VHF船台机播出主要由以下两个过程完成:
3.4.2.1 FFF按钮的按下
根据树莓派GPIO定义,使用GPIO 0(第11脚)作为控制脚,与继电器模块IN脚相接。
GPIO.setmode(GPIO.BOARD)//使用GPIO.BOARD模式
GPIO.setup(11,GPIO.OUT)//将11脚(GPIO 0)设为输出模式
吸合继电器时使用:GPIO.output((11,GPIO.LOW),此时VHF船台机FFF与GND导通,相当于PTT按钮按下,VHF船台机处于发送模式。
释放继电器时使用:GPIO.output(11,GPIO.HIGH),此时VHF船台机PTT与GND断开,相当于PTY按钮释放,VHF船台机处于接收模式。
3.4.2.2 串口文本输出
树莓派原生有一个串口,为GPIO 14(TXD)和GPIO 15(RXD),但该串口默认为调试口,需要在树莓派配置界面中将串口调试功能关闭。将GPIO 14与SYN6658模块RXD连接,GPIO 15与SYN6658模块TXD连接,波特率默认为9600bps。
树莓派与SYN6658之间通信使用数据帧的方式,数据帧格式如下表:
树莓派向串口输出控制播发的过程为:
ser=serial.Serial("/dev/uyAMA0",9600)
ser.write('\xFD')//输出固定帧头0xFD
ser.write('\x00\x66')//数据区长度为102字节(发送50个汉字)
ser.write('\x01\x00')//以GB2312编码格式合成播放
ser.write(data)//输出待发送文本
通过输出不同的命令字可以控制芯片播发、停止、暂停、恢复等合成文本操作。
输出0xFD 0x00 0x01 0x21命令可以查询芯片工作状态,芯片收到查询指令后,返回0x4E表明仍在合成过程中,返回0x4F表明处于空闲状态。
合成工作完成后表明所有待发送的文本已经全部提交合成完毕,如果系统工作正常,那么该条航行信息应该通过VHF船台机向附近水域播发完成,此时将FTT按钮释放,整个播发过程结束,系统进入下一次播发的准备状态中。