电工优优今天要和大家分享的单片机相关信息,接下来我将从基于单片机的语音小车设计这个方面来介绍。
引言
随着计算机技术、模式识别和信号处理技术及声学技术等的发展,使得能满足各种需要的语音识别系统的实现成为可能[1]。近二三十年来,语音识别在计算机、信息处理、通信与电子系统、自动控制等领域中有着越来越广泛的应用[2]。语音命令控制可广泛用于家电语音遥控、玩具、智能仪器及移动电话等便携设备中[3]。使用语音作为人机交互的途径对于使用者来说是最自然的一种方式,同时设备的小型化也要求省略键盘以节省体积。当今,语音识别产品在人机交互应用中已经占到越来越大的比例。语音识别按说话人的讲话方式可分为孤立词识别、连接词识别和连续语音识别。孤立词识别是指说话人每次只说一个词或短语,每个词或短语在词汇表中都算作一个词条,一般用在语音电话拨号系统中。连接词语音识别支持一个小的语法网络,其内部形成一个状态机,可以实现电话语音查询、航空定票等系统。连续语音识别是指对说话人以日常自然的方式发音,通常特指用于语音录入的听写机。从识别对象的类型来看,语音识别可以分为特定人语音识别和非特定人语音识别。特定人是指只针对一个用户的语音识别,非特定人则可用于不同的用户。实际上,非特定人语音识别的初始识别率往往都比较低,一般都要求用户花一定的时间对系统进行训练,将系统的参数进行一定的自适应调整,才能使识别率达到满意的程度。本设计采用的识别类型是特定人孤立词语音识别。本设计是语音识别在控制领域的一个很好实现,它将原本需要手工操作的工作用语音来方便地完成。本系统分主机和从机两个方面,主机和从机都是采用单片机为主控核心,通过蓝牙模块来进行数据互传,从机采用的是电机驱动芯片来控制小车,进行点击的正反转调速等控制。以此来达到了预期目标,实现了所期望的功能效果[4]。
系统概述
声控产品前景和发展趋势
随着科技技术的发展,电子产品日新月异的发展,声控产品使用率的提高,为人类的生活带来了巨大的变化,随着近几年来信号处理技术的不断发展与提升,语音辨识的应用已真正走入人们的日常生活,声控系统的应用也不再遥不可及,家用电器的操作,不再需以遥控器的繁多按键为控制接口,取而代之是我们用平常说话的模式来驱使家电动作,诸如多种智能电器,人们在也不必为种类繁多操作复杂的遥控器而烦恼,人们可以很清松的操作各种各样的电器产品,达到更符合人性化的操作接口设计。随着语音技术的不断发展进,人们不光可以用语音来控制家电,声控产品也越来越受人们的欢迎,成为了21世纪发展的一大前景。
研究目的和意义
近几年,人民生活水平稳步提高,嵌入式电子产品的消费者已经不再满足“能用够使”的消费目的,他们需要电子产品具有更多人性化和个性化的功能,技术上的特点客观上给嵌入式语音识别应用带来了更大的市场需求[5]。本设计主要应用语音识别技术,来完成语音控制小车的目的,将语音识别技术应用在实际设计当中,为以后进一步学习应用语音技术打下基础,也可以为他人设计语音产品提供参考[6]。
本次设计内容
如今随着智能化的发展,智能化的控制技术变得尤为重要,本次设计是以单片机为核心设计一款语音控制的智能小车,研究内容主要包含以下几个方面:
语音识别技术,下可以通过语音控制小车的左转、右转、前进、后退、停止;
语音输入终点信息,小车可以寻迹到达指定的地点;
通过RC522射频识别技术使小车定位地点更为精确;
蓝牙通讯;
实现自动避障,遇到障碍物停止。
系统设计的整体方案
声控小车的设计分为二部分,一部分是硬件设计,另一部分是软件设计,在这里我们只阐述软件的部分。首先要对设计的题目进行分析,熟知其要求才能更加深刻的理解[7]。其次进行思路的整理规划好流程。从而梳理设计的方案。首先是硬件方面,本次设计包含有自动避障功能、蓝牙通讯、循迹、语音识别以及定位的功能。软件在硬件的基础上进行功能逻辑上的编译。
主控芯片的方案论证
本次设计的语音小车采用是由单片机作为主控核心,按照本次设计的要求,从以下三个方案中选择一款。
EPSON系列单片机:
EPSON系列的单片机是由精工爱普生(SEIKO EPSON)自主开发的CMOS32位RISCCPU为核心,加上不同的外围电路制成多种型号的MCU,这些产品可以应用于不同的领域:掌上电脑(PDA),移动信息终端,网络设备,办公室OA设备,PC接口设备,智能玩具,GPS应用等,其中它的主要特点有强大的CPU内核,采用RISC结构,三级流水线,105条16位长指令,其大多数指令在一个时钟周期内执行,大大提高了指令的执行效率。地址总线28条,线性寻址256MB,编程方便。当S1C33工作在60MHz时,其性能可到60MIPS。在CPU架构中,也采用了多种设计以提高CPU的性能;哈佛架构,内部RAM为独立总线,在操作内部RAM时可起到高速缓存的作用,而且可实现同时存取内外部存储器,提高系统效率。有效的利用内部RAM和Harvard结构可大大提高指令执行效率,使其可进行复杂运算。拥有丰富的周边电路,较为良好的性价比和功能消耗较低的优点[8]。
AT89C51RC单片机:
AT89C51RC单片机是Atmel公司生产的低功耗高性能CMOS 8位单片机,其中它具有32k Bytes Flash只读程序存储器(ROM),512 Bytes内部数据存储器(RAM),该微处理器采用ATMEL公司的高密度、非易失性存储技术生产,兼容标准MCS-51指令系统,引脚兼容80C51和80C52芯片,单片机内的Flash存储器可以象常规程序存储器样进行烧写,AT89C51RC片内总共有512字节的用户数据区,而256字节的内部扩展数据区需通过清SFR(8EH)的位1并用MOVX指令访问,片内置通用8位中央处理器和Flash存储单元,另一个256BytesRAM区与ATMEL之AT89系列8052兼容的单片机是一致的,AT89C51RC 结合通用的8位微处理器和Flash存储技术构成功能强大单片微处理器,可提供许多高性能低价位的系统控制应用场合[9]。
AT89C51RC具有如下主要特点:40个引脚,32kBytes的程序存储器,32个外部双向输入/输出(I/O)端口,同时内含2个外中断口,3个16位可编程定时计数器,2个全双工串行通信口,内置时钟振荡器,其Flash存储器,可反复擦写1000 次的Flash存储器可有效地降低开发成本。软件设置电源省电模式,睡眠其间,定时/计数器,串行口和中断口均停止工作,RAM中的数据被“冻结”,直到下次被中断激活或硬件复位方可恢复工作。
STC89C52单片机:
STC89C52是宏晶公司的增强型MCS-51单片机,具有以下标准功能:8k字节Flash,512字节RAM,32位I/O口线,看门狗定时器,内置4KBEEPROM,MAX810复位电路,三个16位定时器/计数器,一个6向量2级中断结构,全双工串行口。其中的优点有,支持STC的2线制下载方式,下载程序更方便。支持6T模式(在6T模式下,6个时钟周期就是一个机器周期),片内集成了4kB容量的EPROM;带有P4口,具有更多的I/O。最主要的是其价格便宜,符合学生的预算[10]。
本次选择STC89C52单片机,因为该单片机能够完成本次设计的全部功效之外,价格对比于其他两个方案更为便宜,所以选择该单片机作为本次设计的核心。
语音识别模块的方案论证
在本次设计的语音小车中,语音识别是非常重要的一项,用户需要通过主机来对从机下达指令,是通过语音来进行的,所以选择一款合适的语音识别模块是非常重要的。
ASR M08
ASR自动语音识别技术是一种将人的语音转换为文本的技术。ASRM08-A语音识别模块坚持着这样一个原则,首先对接收到的语音信号进行一系列的运算处理,然后和关键词列表中所有的关键词进行对比,对每一个关键词的相似度打分,得分最高的那个关键词就认为是正确的,最后输出。这样,当接收到相似度比较高的语音时我们可以通过设置“无用关键词”把他过滤掉,这是一个非常有效的手段,设置“无用关键词”越多,误识别率越低,但是不可避免的要牺牲关键词列表地址[11]。
LD3320
LD3320提供的语音识别技术,是基于关键词语列表的识别技术:ASR技术。语音识别芯片的工作流程是:对经过MIC输入的声音实施频谱分析一语音特征的提取一匹配关键词语列表中的关键词语一从此关键字列表中得分最高的关键词语作为最终语音识别的结果输出[12]。
LD3320模块可以使用3.3v进行供电。模块与单片机系统可以使用并口通讯方式也可以使用SPI通讯方式,这大大真强了模块的兼容性,通过其语音采集系统经过放大处理后再进行ad数据转换给LD3320进行识别,LD3320根据之前录制的音频内容进行对比判断语音是否匹配,如果匹配会给串口发送设定好的数据。总体识别较为准确费用适中,因此本设计采用LD3320语音识别模块进行语音识别[13]。
电机驱动方案选择
L298N
L298N 是一种双H桥电机驱动芯片,其中每个H桥可以提供2A的电流,功率部分的供电电压范围是2.5-48v,逻辑部分5v供电,接受5vTTL电平。一般情况下,功率部分的电压应大于6V否则芯片可能不能正常工作[14]。
ULN2003
ULN2003是大电流驱动阵列,多用于单片机、智能仪表、PLC、数字量输出等控制电路中。可直接驱动继电器等负载。输入5VTTL电平,输出可达500mA/50V。
ULN2003是高耐压、大电流达林顿系列,由七个硅NPN管组成。
该电路的特点如下:ULN2003的每一对都串联一个2.7K的基极电阻,在5V的工作电压下它能与TTL和CMOS电路 直接相连,可以直接处理原先需要标准逻辑缓冲器来处理的数据。
ULN2003 是高压大电流达林顿晶体管阵列系列产品,具有电流增益高、工作电压高、温度范围宽、带负载能力强等特点,适应于各类要求高速大功率驱动的系统[15]。
根据对以上两种方案的分析,最终选择L298N模块作为本系统的电机驱动方案,可以有效的简化系统的硬件结构,而且其模块化的设计可以很好的巩固系统的稳定性。
本章小节
将本次设计的语音小车的关键硬件进行了选择方案的论证,通过选取不同的单片机来判断此次适合的主控核心。在语音识别和电机驱动方面也通过方案选择,选择适合本次设计的语音识别模块和电机驱动模块。
系统硬件电路设计
本次设计的语音小车由语音识别模块、蓝牙模块、光电模块、RC522射频识别模块电机驱动模块组合而成,主控核心是单片机。单片机接收到语音识别信号之后,发送指令控制电机驱动以此来控制小车行动。其中系统框图如图3-1所示。
单片机最小系统的电路设计
STC89C52芯片模块电路设计
本次设计的语音小车的主控核心包含时钟电路和复位电路,其中STC89C52单片机主电源引脚(2根)VCC(Pin40):电源输入,接+5V电源GND(Pin20):接地线;外接晶振引脚(2根);XTAL1(Pin18):片内振荡电路的输入端;XTAL2(Pin19):片内振荡电路的输出端;控制引脚(4根);RST/VPP(Pin9):复位引脚,引脚上出现2个机器周期的高电平将使单片机复位。ALE/PROG(Pin30):地址锁存允许信号;PSEN(Pin29):外部存储器读选通信号;EA/VPP(Pin31):程序存储器的内外部选通,接低电平从外部程序存储器读指令,如果接高电平则从内部程序存储器读指令。可编程输入/输出引脚(32根);STC89C52单片机有4组8位的可编程I/O口,分别位P0、P1、P2、P3口,每个口有8位(8根引脚),共32根。;PO口(Pin39~Pin32):8位双向I/O口线,名称为P0.0~P0.7 P1口(Pin1~Pin8):8位准双向I/O口线,名称为P1.0~P1.7 P2口(Pin21~Pin28):8位准双向I/O口线,名称为P2.0~P2.7 P3口(Pin10~Pin17):8位准双向I/O口线,名称为P3.0~P3.7[15]。其中STC89C52单片机如图3-2所示。
图3-2 STC89C52单片机
系统时钟电路设计
时钟电路就是产生像时钟一样准确运动的振荡电路。任何工作都按时间顺序。用于产生这个时间的电路就是时钟电路。时钟电路一般由晶体振荡器、晶振控制芯片和电容组成。以下为时钟电路如图3-3所示。
复位电路设计
复位电路是一种用来使电路恢复到起始状态的电路设备,它的操作原理与计算器有着异曲同工之妙,只是启动原理和手段有所不同。复位电路,就是利用它把电路恢复到起始状态。就像计算器的清零按钮的作用一样,以便回到原始状态,重新进行计算。本次设计的复位电路是比较简单的,是只有电阻和电容,三极管等组合就可以办到了。其中复位电路设计如图3-4所示。
从机语音模块电路设计
语音处理技术是一门新兴的技术,它不仅包括语音的录制和播放,还涉及语音的压缩编码和解码,语音的识别等各种处理技术。以往做这方面的设计,一般有两个途径:一种方案是单片机扩展设计,另一种就是借助于专门的语音处理芯片。普通的单片机往往不能实现这么复杂的过程和算法,即使勉强实现也要加很多的外围器件。专门的语音处理芯片也比较多,如ISD系列、PM50系列等,但是专门的语音处理芯片功能比较单想在语音之外的其他方面应用基本是不可能的。所以本次选择使用了LD3320模块,该模块采用了ASR技术。通过对经过输入的声音实施频谱分析,采取关键词语作为最终语音识别的结果输出。语音识别模块设计如图3-5所示。
部分程序:
#include
#include "mfrc522.h"
#include "main.h"
#include
#include
#include
#include
//三个指示灯
sbit led = P0^1;
sbit led2 = P0^4;
sbit led3 = P0^7;
//电机驱动
sbit eleA = P3 ^ 4;
sbit eleB = P3 ^ 5;
sbit eleC = P3 ^ 6;
sbit eleD = P3 ^ 7;
sbit hwql = P2 ^ 6;//红外前左
sbit hwqr = P2 ^ 2;//红外前右
sbit hwhl = P1 ^ 2;//红外后左
sbit hwhr = P1 ^ 3;//红外后右
sbit bz = P2 ^ 5;//避障
unsigned char R_flag=0;
unsigned char reg[35] = 0;
unsigned char number = 0;
unsigned char recSign = 0;//接收数据标志
unsigned char recTemp = 0;//接收数据
bit rec_flag = 0; //接收参数
int i=0; //用于for循环
bit start = 0; //开始暂停
int count =0;
unsigned char state=0;// 0-空闲 1-忙
unsigned char mode=0;// 0-停止 1-前 2-后
unsigned char dire=0;// 0-停止 1-前 2-后 3-前左 4-前右 5-后左 6-后右
unsigned char cardId=0;
unsigned char curId=0;//当前卡号
unsigned char targId=0;//目标卡号
unsigned char curPoint=0;//当前位置
unsigned char trace=0;//0-遥控模式 1-循迹模式
unsigned int timer=0;
unsigned int timeCount=0;
unsigned char data1[8] = {0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07};
unsigned char code DefaultKey[6] = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF};
unsigned char g_ucTempbuf[20];
unsigned char status;
void Delay10ms(unsigned int c) //误差 0us
{
unsigned char a, b;
//--c已经在传递过来的时候已经赋值了,所以在for语句第一句就不用赋值了--//
for (;c>0;c--)
{
for (b=38;b>0;b--)
{
for (a=130;a>0;a--);
}
}
}