凌阳语音控制小车在单片机教学中的应用及改进

2017-10-18 01:28郭俊俊赵志源
陇东学院学报 2017年5期
关键词:命令小车语音

郭俊俊,赵志源,王 鹏

(陇东学院 信息工程学院,甘肃 庆阳 745000)

凌阳语音控制小车在单片机教学中的应用及改进

郭俊俊,赵志源,王 鹏

(陇东学院 信息工程学院,甘肃 庆阳 745000)

为激发学生学习兴趣,在单片机教学中采用项目教学法,以具有趣味性的凌阳语音控制小车作为开发平台,完成了小车的基本功能、调速功能和语音识别功能,并在此基础上进行二次开发,即采用nRF2401无线模块传输语音命令,减小了小车电机噪声的影响,增大了语音控制距离;采用SYN6288中文语音合成模块扩展了小车的语音输出功能。教学内容由易到难,包括单片机及其外围电路硬件和软件的设计,教学过程循序渐进,不仅提高了学生应用单片机的能力,而且培养了学生的创新意识。

单片机;语音识别;无线通信

Abstract: The method of project teaching is used to stimulate students’ interest in microcontroller teaching.Sunplus voice control car was used as the development platform.It was completed with basic function,speed control function and voice recognition function.Then,the add-on functions were developed.The wireless module nRF2401 was used to transmit voice commands.The influence of motor noise was reduced and the distance of voice control was increased.The Chinese speech synthesis module SYN6288 was used to extend the voice output function.The teaching content was designed from easy to difficult.It involved the hardware and software design of microcontroller and its peripheral circuit.The teaching process was designed step by step.These not only improved students’ ability of microcontroller application,but also trained students’ consciousness of innovation.

Keywords: microcontroller;voice recognition;wireless communication

《单片机原理及应用》是高校电子信息工程专业开设的一门专业必修课,教学内容一般包括单片机的硬件结构、指令系统、编程语言、接口技术和应用系统的设计等;该课程具有实践性强、技术更新快、入门较难等特点,传统教学多以理论介绍为主,实践内容偏少,教学内容与实际应用脱节,造成学生学习积极性不高、学生单片机应用能力培养不足等问题[1-4]。凌阳语音控制小车是凌阳大学计划推出的基于SPCE061A单片机的产品,具有很强的趣味性,它除了语音功能外,还综合了SPCE061A单片机的众多功能,可以进行二次开发,因此非常适合作为单片机教学开发平台。本文提出在单片机教学中采用项目教学法[5],实现凌阳语音控制小车的基本功能、调速功能和语音识别功能,并通过二次开发改进调试中发现的问题。

1 凌阳语音控制小车

1.1SPCE061A单片机

SPCE061A单片机作为凌阳语音控制小车的核心,它是一款16位微处理器,工作电压VDD为3.0V~3.6V;内置2K SRAM(Static Random Access Memory,静态随机存取存储器)和32K Flash闪存;具有2个16位可编程定时器/计数器;2个10位DAC(Digital to Analog Converter,数模转换器)输出通道;32位通用可编程I/O(Input/Output,输入/输出)端口,I/O端口工作电压为VDD~5.5V;两级中断,14个中断源;7通道10位电压ADC(Analog to Digital Converter,模数转换器)和单通道声音ADC;声音ADC输入通道内置麦克风放大器和自动增益控制功能;具备UART(Universal Asynchronous Receiver/Transmitter,通用异步收发器)接口;还具有看门狗等功能。由于SPCE061A单片机内置资源丰富,处理速度快,语音性能出色,使其在语音识别领域应用广泛[6]。

1.2凌阳语音控制小车的组成

凌阳语音控制小车是基于SPCE061A单片机的代表性产品,实物如图1所示,主要由61板、控制板和车体3部分组成。61板上有SPCE061A单片机最小系统、麦克风输入和DAC音频输出电路等,它负责整个小车控制信号的产生,以及语音识别和播放功能的实现。控制板负责将来自61板的控制信号转化为能够驱动电机的信号。车体主要包括结构件、前轮方向电机、后轮动力电机和电池盒。车体电池盒可以安装4节5号电池,采用电压为1.5V的电池,则小车电池电源为6V,控制板直接采用电池电源供电,61板需要5V和3.3V两种电源,其中5V电源由电池电源通过二极管IN4007降压后产生,5V电源通过三端稳压器SPY0029产生3.3V电源。61板和控制板通过结构件固定在车体上,它们之间的控制信号和电源通过杜邦线连接。

图1 凌阳语音控制小车实物图

凌阳语音控制小车贴近实际生活,具有趣味性,开发规模适中,涉及到SPCE061A单片机的I/O端口、定时器/计数器、ADC、DAC、Flash等知识点,还可以通过扩展外围电路模块进行二次开发,具有较强的实践性,适合于项目教学法。

2 凌阳语音控制小车在教学中的应用

下面以凌阳语音控制小车作为开发平台,依次实现小车的基本功能、调速功能和语音识别功能,整个过程由易到难,循序渐进。

2.1基本功能的实现

该小车的基本功能包括前进、后退、左转和右转等,其中前进和后退通过控制后轮动力电机正转和反转实现,左转和右转通过控制前轮方向电机正转和反转实现。在SPCE061A单片机的32位I/O端口中,IOA0~IOA2为61板的3个按键输入,IOB7为UART接口的接收信号RX,IOB10为UART接口的发送信号TX,考虑后面要实现调速功能和使用UART接口,所以选择IOB8和IOB9控制后轮动力电机,IOB11和IOB12控制前轮方向电机,控制原理框图如图2所示:

图2 I/O端口控制电机原理框图

后轮动力电机和前轮方向电机均为直流电机,二者的驱动电路相同。后轮动力电机的全桥驱动电路如图3所示,连接器J3连接电机的两个端子,VCC为控制板工作电源,Q1、Q2、Q3、Q4四个三极管组成四个桥臂,Q1和Q4组成一组,Q2和Q3组成一组,Q5控制Q2、Q3的导通与关断,Q6控制Q1和Q4的导通与关断,而Q5、Q6由IOB9和IOB8两个信号控制,给IOB8和IOB9输入相应的高低电平就可控制四个桥臂的导通与关断,从而实现电机的正转、反转或者停转。所以配置SPCE061A单片机的IOB8、IOB9、IOB11和IOB12输出就能实现小车的基本功能,表1是小车运行状态与I/O端口输出对照表。

图3 后轮动力电机的全桥驱动电路图

表1 小车运行状态与I/O端口输出对照表

I/O端口配置代码如下:

*P_IOB_Dir=0xff00;

*P_IOB_Attrib=0xff80;

*P_IOB_Data=0x0400;

其中寄存器P_IOB_Dir配置I/O端口为输入或输出,寄存器P_IOB_Attrib配置输入为悬浮或上下拉、输出电平反转或不反转,寄存器P_IOB_Data配置输入为上拉或下拉、输出为高电平或低电平。配置后,IOB15~IOB8中除IOB10为高电平输出外,其余为低电平输出;IOB7~IOB0中除IOB7为带唤醒功能的悬浮输入外,其余为下拉输入。小车停止、前进、后退、左前转和右前转的代码如下:

*P_IOB_Data=*P_IOB_Data&0xe4ff;//停止

*P_IOB_Data=(*P_IOB_Data&0xe4ff)|0x0200;//前进

*P_IOB_Data=(*P_IOB_Data&0xe4ff)|0x0100;//后退

*P_IOB_Data=(*P_IOB_Data&0xe4ff)|0x1200;//左前转

*P_IOB_Data=(*P_IOB_Data&0xe4ff)|0x0a00;//右前转

为方便调用,可以将上述代码封装到函数中,比如停止函数stop()、前进函数go_ahead()等。

2.2调速功能的实现

基本功能实现后小车就可以行驶了,但行驶速度是固定的,以前进为例,此时IOB9为1,IOB8为0,加在后轮动力电机上的电压始终为控制板工作电压VCC,所以电机的转速不变。而当IOB9为0,IOB8为0时,加在后轮动力电机上的电压为0V。如果交替地向IOB9和IOB8端口输出这两种组合,那么加在小车电机两端的电压就在VCC和0V之间不停地跳变,对应的波形称为PWM(Pulse Width Modulation,脉冲宽度调制)波形,如图4所示:

图4 PWM波形图

此时加在电机两端的平均电压Uo与波形的高电平时间Th和低电平时间Tl的关系为:

Uo=Th/(Th+Tl)*VCC

通过改变Th和Tl的比值,即调整PWM波形的占空比,可以改变电机两端电压Uo的大小,从而改变电机的转速。

PWM波形可用定时器配合软件的方法产生,但SPCE061A单片机本身具有PWM输出功能,IOB8是定时器/计数器A的PWM输出,IOB9是定时器/计数器B的PWM输出。若要调速前进,则配置定时器/计数器B的寄存器P_TimerB_Ctrl;若要调速后退,则配置定时器/计数器A的寄存器P_TimerA_Ctrl,如果需要IOB9输出占空比为50%的PWM波形,配置代码为:

*P_TimerB_Ctrl=0x0200;

配置完成后下载程序,用数字示波器实测的IOB9输出波形如图5所示,频率为23.58Hz,占空比为50.9%,与配置的结果基本一致。

图5 实测IOB9输出的PWM波形图

2.3语音识别功能的实现

图6 语音识别流程图

SPCE061A单片机只支持特定人语音识别[7],所以在“识别”前需要进行“训练”。在训练阶段,61板上的麦克风将语音命令转变成模拟电压信号,SPCE061A单片机通过其内部的声音ADC将模拟电压信号转变为数字信号,然后对其进行分析处理,从中提取特征信息,建立一个特征模型并存储到Flash中,不同的语音命令对应不同的特征模型,然后向训练标志单元写入固定数据;在识别阶段,单片机对采集到的语音命令进行类似的处理,提取出语音的特征信息,然后将这个特征信息与Flash中的特征模型进行对比,如果二者达到了一定的匹配度,则输入的语音被识别。在实际使用中,小车可以被重新训练,把61板的KEY3键定义为重新训练按钮,如果KEY3键按下,那么程序会把训练标志单元的数据擦除,当程序检测到训练标志单元内容已被擦除时,就会对它进行重新训练,图6为语音识别流程图。

为了减小开发难度,程序设计时直接调用SPCE061A单片机函数库中的语音函数,语音训练和识别的具体代码如下:

BSR_DeleteSDGroup(0);//初始化RAM存储器

BS_Flag=*(unsigned int *)0xfa00;//读Flash存储单元0xfa00的数据

if(BS_Flag!=0xaaaa)//判断是否完成训练,如果Flash存储单元0xfa00的数据不是0xaaaa,则重新训练

{

F_FlashErase(0xf000);//擦除将要存储5条语音命令的Flash空间

F_FlashErase(0xf000+100);

F_FlashErase(0xf000+200);

F_FlashErase(0xf000+300);

F_FlashErase(0xf000+400);

TrainFiveCommand0();//训练五条语音命令

SaveFiveCommand(0xf000);//存储五条语音命令的特征模型

F_FlashWrite1Word(0xfa00,0xaaaa);//给训练标志单元即Flash的0xfa00单元写入数据0xaaaa,表示完成训练

}

ImportFiveCommand(0xf000);//语音特征模型载入识别器

BSR_InitRecognizer(BSR_MIC);//初始化识别器

while(1)

{

*P_Watchdog_Clear=0x01;//清看门狗

uiRes=BSR_GetResult();//取得识别结果

if(uiRes > 0)//判断识别结果是否有效

{

switch(uiRes)

{

case0x100://识别出为第一条命令

……;//执行相应的操作

break;

……

case0x104: //识别出为第五条命令

……;//执行相应的操作

break;

}

}

}

3 对凌阳语音控制小车的改进

至此,小车已能通过语音命令对其行驶状态进行控制,但在调试中发现两个问题:第一,小车在行驶过程中语音识别能力下降,在发音者距麦克风的有效距离过长时,识别效果明显变差,甚至完全不能识别;第二,虽然SPCE061A单片机具有DAC音频输出电路,能够将语音数据转换为模拟电压信号,最后通过喇叭播放出声音,但语音数据一般需要较大的存储空间,比如采用凌阳音频编码SACM_S240方式,每秒语音需占2.4Kb存储空间,而SPCE061A单片机的Flash容量只有32KB,能容纳的语音数据有限,使用不够方便。为解决这两个问题,对语音控制小车进行了二次开发,实现了无线语音传输功能,同时还扩展了语音输出功能。

3.1无线语音传输功能的实现

由于在语音命令训练阶段小车通常是停止的,发音者距麦克风的距离也是固定的,所以存入Flash的是固定距离下没有电机声音的语音命令特征模型,但在语音识别阶段,小车可能正在行驶,电机转动会发出声音,同时麦克风在61板上随小车行驶,与发音者的距离也在变化,导致单片机提取出的特征信息中语音强弱不同,同时夹杂着电机声音,与特征模型的匹配度下降,从而影响语音的正确识别。为解决这些问题,将语音输入电路和语音识别电路从小车中独立出来,采用无线通信技术传输语音命令,既可以减小电机噪声的干扰,同时也扩大了语音控制范围。

图7 改进后的语音控制小车系统框图

图7为改进后的语音控制小车系统框图,主要由语音识别终端和小车两部分组成。语音识别终端包括61板(I)和nRF2401无线模块(I),61板(I)负责语音命令的输入和识别,并根据表2将语音命令转换为预先约定的固定码,nRF2401无线模块(I)将固定码发送给小车;小车包括61板(II)、nRF2401无线模块(II)、控制板和车体,nRF2401无线模块(II)接收到固定码值后,将其输入到61板(II),61板(II)根据表2执行相应的小车功能。比如语音识别终端识别结果是“左转”,则nRF2401无线模块(I)应该发送0x13,nRF2401无线模块(II)接收到0x13后,小车执行左前转动作。

表2 语音命令与固定码的对应关系表

nRF2401是单片射频收发芯片,工作在2.4~2.5GHz ISM(Industrial Scientific Medical,工业、科学和医用)频段;输出功率和通信频道可通过软件进行配置,共有125个频道可使用,而且最高速率可达1Mb/s。芯片具有1.9~3.6V宽工作电压,I/O端口电压最大可为5V,工作能耗非常低,灵敏度为-90dBm,无线传输距离长。语音识别终端和小车上的nRF2401无线模块与61板的硬件连接完全相同,连接关系如表3所示:

表3 nRF2401模块与61板的信号连接关系表

语音识别终端程序和小车程序分别设计,语音识别终端程序是在语音识别功能上新增nRF2401无线模块(I)的代码。小车程序是在基本功能和调速功能上新增nRF2401无线模块(II)的代码。语音识别功能、基本功能和调速功能之前已经完成,下面的关键任务是nRF2401无线模块的编程。

编程时先初始化nRF2401无线模块,配置工作方式和接收端地址,将语音识别终端的nRF2401无线模块(I)配置为发送方,小车的nRF2401无线模块(II)配置为接收方,再调用nRF2401.C的相关函数。部分关键代码如下:

发送方:

nRF2401_SendByte(0x13);//发送左前转命令的固定码

Delay_Us(100);//延时

接收方:

if((nRF2401_RxStatus())==1)//判断是否有接收数据请求

{

nRF2401_ReceiveByte(RxBuf);//接收数据

switch(RxBuf[0])//根据接收到的固定码执行相应功能

{

……

case 0x13: //左转命令的固定码

*P_IOB_Data=(*P_IOB_Data&0xe4ff)|0x1200;//左前转

break;

……

}

}

3.2语音输出功能的扩展

采用北京宇音天下科技有限公司的SYN6288中文语音合成模块实现语音输出功能扩展,SYN6288通过UART接口接收61板发送的待合成文本,并能够实现文本到声音的转换,而文本需要的存储空间远远小于语音数据,相同容量的Flash可以支持更多语音的输出。SYN6288模块与61板的连接关系如表4所示:

表4 SYN6288模块与61板的信号连接关系表

SYN6288模块只负责接收,所以BY和TXD信号不需要连接。软件设计中采用汇编语言和C语言混合编程的方法,集两种语言的优点于一体,极大地简化了编程过程。编写了汇编语言源程序UART.asm,其中定义了UART初始化函数UART_Init()、延时函数UART_Delay()、UART发送一个字节函数F_UARTsendByte();编写了C语言源程序SYN6288.c,其中调用UART.asm定义了发送文本到SYN6288模块的函数SYN_FrameInfo(),代码如下:

void SYN_FrameInfo(unsigned char Music,unsigned char *HZdata)

{

/***需要发送的文本***/

unsigned char Frame_Info[50];

unsigned char HZ_Length;

unsigned char ecc =0;//定义校验字节

unsigned int i=0;

HZ_Length=strlen(HZdata);//需要发送文本的长度

/***帧固定配置信息***/

Frame_Info[0]=0xFD;//构造帧头FD

Frame_Info[1]=0x00;//构造数据区长度的高字节

Frame_Info[2]=HZ_Length+3;//构造数据区长度的低字节

Frame_Info[3]=0x01;//构造命令字:合成播放命令

Frame_Info[4]=0x01 | Music<<4;//构造命令参数:背景音乐设定

/***校验码计算***/

for(i=0;i<5;i++)//依次发送构造好的5个帧头字节

{

ecc=ecc^(Frame_Info[i]);//对发送的字节进行异或校验

}

for(i=0;i

{

ecc=ecc^(HZdata[i]);//对发送的字节进行异或校验

}

/***发送帧信息***/

memcpy(&Frame_Info[5],HZdata,HZ_Length);

Frame_Info[5+HZ_Length]=ecc;

PrintCom(Frame_Info,5+HZ_Length+1);

}

实际应用中,调用SYN_FrameInfo()函数即可输出语音,非常方便和灵活,比如要播放“准备就绪”四个字的语音,调用形式如下:

SYN_FrameInfo(0,“准备就绪”);

图8 语音识别终端实物图

经过二次开发后,语音识别终端实物图如图8所示,小车实物图如图9所示。语音识别终端与小车之间通过nRF2401无线模块进行通信,小车上扩展的SYN6288中文语音合成模块可以输出任意语音。经过测试,所有功能运行正常。

图9 改进后的小车实物图

4 结语

通过凌阳语音控制小车开发项目驱动单片机教学,实现了小车前进、后退、左转、右转等基本功能、调速功能和语音识别功能,同时启发学生进行二次开发,采用语音识别终端与小车分离的方法,通过无线通信技术传输语音命令,降低了语音识别中电机噪声的影响,扩大了语音的有效控制距离,增加了语音识别的准确度,最后对语音输出功能进行了扩展,可以输出任意语音。经过测试所有功能均可正常运行。整个教学过程循序渐进,不仅提高了学生的单片机应用能力,还培养了学生的创新意识,更重要的是提高了学生发现问题和解决问题的能力。

[1]赵月静,陈继荣,张永弟.单片机原理及应用课程创新实践教学改革[J].实验技术与管理,2013,30(1):176-179.

[2]朱敏杰,罗珩,余亚东.改革单片机教学培养应用型人才[J].实验室研究与探索,2012,31(2):144-147.

[3]黄伟军,肖金球,张兄武,等.“单片机原理与应用”课程教学改革的研究[J].电气电子教学学报,2010,32(6):29-30.

[4]崔勇,袁海文,王秋生,等.卓越工程师培养目标下的单片机教学改革探讨[J].中国电力教育,2013(5):80-85.

[5]徐肇杰.任务驱动教学法与项目教学法之比较[J].教育与职业,2008(11):36-37.

[6]罗亚非.凌阳16位单片机应用基础[M].北京:北京航空航天大学出版社,2005:9-10.

[7]董晓宁,张萌.基于凌阳单片机的语音识别系统设计[J].电子工程师,2008,34(2):18-21.

【责任编辑朱世广】

TheApplicationandImprovementofSunplusVoiceControlCarinMicrocontrollerTeaching

GUO Jun-jun,ZHAO Zhi-yuan,WANG Peng

(CollegeofInformationEngineering,LongdongUniversity,Qingyang745000,Gansu)

TP368.1

A

1674-1730(2017)05-0019-06

2016-11-25

2015年国家级大学生创新创业训练计划项目《语音遥控智能小车的设计与实现》(201510738009)

郭俊俊(1984—),男,甘肃庆阳人,助教,硕士,主要从事嵌入式系统和光电子技术的应用研究。

猜你喜欢
命令小车语音
只听主人的命令
大车拉小车
自制小车来比赛
魔力语音
基于MATLAB的语音信号处理
基于MQ3与MP3的价廉物美的酒驾语音提醒器
对方正在输入……
刘老师想开小车
两轮自平衡小车的设计与实现
移防命令下达后