《864234532人机互动智能多功能控制小车论文.doc》由会员分享,可在线阅读,更多相关《864234532人机互动智能多功能控制小车论文.doc(30页珍藏版)》请在三一办公上搜索。
1、人机互动智能多功能控制小车摘要本设计采用凌阳的SPCE061A型十六位单片机,前面避障采用一体化红外接受头接受38KHZ脉冲,后面避障采用红外对管,车速和距离的检测采用红外对管检测轮子的行驶产生脉冲,速度的改变利用PWM的占空比改变实现,使用电机控制专用芯片LM298驱动电机,在市场上遥控小车的基础上,加上61板上的语音部分配上独特的算法,实现小车的人机互动智能多功能控制。 实验目的本小车设计有高频、低频、语音控制,是一个较具有创新性的综合设计。它在现市场遥控小车的基础上,将避障、语音功能加进小车中,实现小车的多模式控制。可当以后小车玩具发展的一个趋势,亦可很好的锻炼我们综合设计能力。方案器件
2、选择方案一 采用传统的89C51作为控制核心。51单片机具有价格低廉、使用简单等特点,但其运算速度较低、功能比较单一,如要对小车实现语音等功能就必须外扩芯片,控制过程相对比较繁琐。方案二 凌阳16位单片机SPCE061A芯片作为控制核心。SPCE061A 具有丰富的资源、指令周期短、工作速率快、低功耗、地电压、可编程音频处理、在线下载易于调试等优点,相对51来说更适于对小车的控制。尤其是语音播放功能,对我们所要做的互动式智能小车提供很大的方便,大大节省了我们的软件、硬件工作。基于上述分析,拟选择方案二。硬件器件见附件1。工作原理及电路原理图一、 硬件电路的具体实现硬件方面主要包括六方面:前后避
3、障,遥控信号输入,电机驱动电路,速度的测量、速度路程的显示以及语音的输入、播放。前后避障、遥控信号输入皆由软件进行扫描从而执行相应程序; 驱动电路由IOB9口输出的脉冲与IOB12、IOB13相与分别控制小车的前进、后退,通过改变脉冲的占空比从而调节小车的速度;速度测量则是通过计算速度检测输入的脉冲并按一定算法计算出瞬时速度与总路程;并用2 个LED输出瞬时速度,用4 个LED输出总路程,LED皆为动态扫描的共阴管;语音的输入及播放则直接使用61板上的语音识别、播放功能。总的设计框架如下图速度、路程显示遥控发射电路遥控接收电路语音的识别、播放前、后避障速度测量 电机的驱动 61板 图1 总硬件
4、框图(1)避障避障包括前面避障和后面避障。前避障具体电路见图2所示。图2 前面避障原理图本避障的发射采用555定时器构成的多谐振荡器产生38KHZ、占空比4/5的方形脉冲信号,通过三极管电平取反并放大来驱动红外发光管。接收部分采用一体化红外接收头,它只接收38KHZ左右的脉冲信号,具有较强的抗干扰性,低电压,低功耗等优点。没障碍物时对应的I/O输入口IOB0与IOB1口输入为低电平,当遇到障碍物时,若为左边接收头的相应管脚发生电平变化即输入口IOB0变为高电平或为右边接收头的相应管脚发生电平变化即输入口IOB1变为高电平,或二者皆输入高电平,单片机通过扫描发现输入为高电平时,采取相应的操作,实
5、现在车的左前进、右前进、倒车或停止等。后面避障见图3所示。电路采用发光对管,与前避障相似,遇到障碍物接收管发生电平改变输入高电平,单片机通过扫描执行相应程序。图3 后面避障原理图(2)测速 速度、路程的测量电路图与后避障类似,具体电路见下图图4 速度检测原理图亦采用发光对光,将输出端接到单片机的外部中断口IOB2。由于轮子有7个沟槽,轮子转一圈接收管可得到7个脉冲,单片机发生7次外部中断。通过单片机计算外部中断次数并按一定的算法计算出小车速度与路程。(3)速度、路程的显示 速度的显示采用两个动态扫描共阴管LED,路程的显示采用四个动态扫描共阴的LED管,具体电路如图5所示。动态扫描的LED管节
6、省了单片机的I/O口,采用74HC04提高LED管公共端的驱动能力。单片机采用1KHZ的定时器中断,利用余晖效应实现LED的逐个显示。图5 速度、路程显示原理图(4)电机驱动电机的驱动电路如图6所示。图6 驱动电路原理图电机驱动电路直接使用电机控制专用芯片L298。由IOB9口直接输出由单片机内部产生的PWM脉冲,与控制前进、后退的I/O口输出的电平相与从而控制小车的速度。当对应的前进、后退、左拐、右拐I/O口输出高电平时,可驱动相应的电机运动。其基本输出和小车运动状态对照如下表。IOB12IOB13IOB14IOB15后电机前电机小车0000停转停转停1000正转停转前进0100反转停转倒车
7、1010正转正转左前拐1001正转反转右前拐0101反转反转左后拐0110反转正转右后拐原理上IOB12与IOB13、IOB14与IOB15不可同时为高电平。(5)遥控发射、接受电路 由于本小车是基于市场上的遥控小车开发出来的多功能小车,遥控发射、接受模块就采用原小车上的发射接受模块。然后把接收模块的前进、后退、左拐、右拐四个输出接到单片机上的IOB4、IOB5、IOB6、IOB7上,经单片机处理有驱动模块控制小车的运动。(6)61板上语音播放、识别电路如下图 图7 语音播放、识别电路语音波形传到话筒MIC经AD转换后传到单片机,由单片机专门的语音识别指令识别语音。而单片机中存储的语音则通过喇
8、叭SPEAKER发出。在61板上,这些主要都有软件实现。另外还用一个按键开关一端接高电平,一端IOB10。当按键按下去时,输入高电平,1KHZ的定时中断中对它进行判别,若输入为高电平,则执行死循环,由于没喂狗从而使系统重新执行,实现语音的重新训练。二、 系统的软件组成部分单片机的控制电路由凌阳单片机实现,主要负责语音的训练于辨识指令,对避障的处理,遥控信号的处理,速度的检测的计算,速度路程的显示输出,电机的驱动输出,及对语音的反应处理。从而使小车能够实现三种控制模式的工作。即遥控控制、辅助控制、智能控制。软件的主要特色: 语音识别在程序中为最高级别,实时判别是否有指令相关的语音输入。 通过按键
9、来实现小车指令的重新训练,从而适用于不同的人更好的控制小车。 使用了5条指令:小车、遥控控制、辅助控制、智能控制、你在干什么。当识别到“小车”这个语句,小车就会回答“yeah”,识别到“你在干什么”时若不在任何模式下,它会回答“累了,休息一下”,若在智能控制控制模式下且进入stop子程序,也会回答“累了,休息一下”,其他情况下回答“巡逻”。当接收到“遥控控制”、“辅助控制”或“智能控制”指令时,则小车会重复一遍所接收到的指令并进入相应模式下工作。外部硬件与单片机I/O口的连接如下图图8 外部硬件与单片机I/O口接图小车通过中断实现速度、路程的检测显示初始化 1KHZ中断外部中断速度、路程的显示
10、速度、路程的计算图9 速度、路程处理流程图通过输入单片机的脉冲信号计算小车所走的路程,除以所使用的时间,得到瞬时速度。通过1KHZ的中断轮流选择LED,实现速度、路程的动态LED显示。在1KHZ的处理程序中还加有对重新训练按键的识别,若按键按下,死循环,由于没有喂狗,从而使程序从头开始,实现语音的从新训练。小车主要可实现三种控制模式:遥控控制、辅助控制、智能控制总流程如下初始化 训练经过训练 N 遥控控制辅助控制智能控制名字在干什么语音识别语音模型载入识别器 Y 0x101 0x102 0x103 0x104 0x100图10 模式总流程图 (1)遥控控制遥控信号的电路为小车的原硬件模块,将接
11、收到的电平信息输入到对应的I/O口,单片机通过处理输出相对应的驱动电路电平,实现完全的人为控制小车。同时实时语音识别。如识别出控制指令则跳到主程序再进入相应的控制模式。并且当你问及“你在干什么”时会回答“巡逻”。遥控控制流程图如下主程序 语音识别 干什么智能控制小车辅助控制遥控控制相应的驱动电路信号输出0x101遥控信号输入 Y N语音判别返回值 非模式指令 为模式指令图11 遥控控制流程图(2)辅助控制辅助控制即为在遥控控制的基础上加上避障功能。如果前进过程中前避障探测到前面有障碍物,且小车在继续前进中,则不管遥控有没有输入拐信号,若是左边探测到障碍物小车都将自动右拐前进;若是右边探测到障碍
12、物小车都将自动左拐前进;若是两边都探测到即障碍物在正前方,小车将自动停下。如果是后退时后避障探测到障碍物,小车若继续后退则将自动停下来且会提示“有障碍物”。直至遥控输入前进信号,它才继续运动。它亦具有实时语音识别功能。问及“你在干什么”时会回答“巡逻”。辅助控制流程图如下:主程序语音识别 干什么智能控制小车遥控控制0x102辅助控制前面测到障碍物 NY相应的驱动电路信号输出有前进信号输入 只能前进右拐Y N 后面测到障碍物 有后退信号输入YY停车 N N遥控前进信号输入 Y 相应的驱动电路信号输出 语音判别返回值 非模式指令 为模式指令图12 辅助控制流程图(3)智能控制智能控制则是利用单片机
13、,按一定算法产生随机数,通过随机数实现小车的随机前进、后退、左拐、右拐、和停车。主要流程如下,主程序语音识别 干什么辅助控制小车遥控控制0x103智能控制随机进入子程序子程序返回值 为模式指令语音判别返回值 非模式指令判别值= 子程序返回值 非模式指令 为模式指令 图13 智能控制流程图随机进入的子程序包括:停车、前进、倒车、左拐、右拐。子程序的执行时间长短由单片机通过一定算法随机产生,当碰到障碍物时会执行特定的处理。在整个过程中都实时语音指令的判别。具体软件程序见附件2。实验中遇到的问题及分析 (1)由于对凌阳板的语音处理方面不是了解得很透测,以至在小车运行时发现总不能跳入外部中断和定时中断
14、子程序。后经过察看中断控制寄存器发现单片机每播放一次语音,中断寄存器只开TimerA中断,其他中断都被关了,故每执行一次语音播放后都重开一次中断,从而导致小车在播放语音时,会导至LED的暂时不显示,由于对凌阳板还在学习中,故这个问题还没从根本上解决,但还好,对小车的影响不大。 (2)本来小车的速度通过TimerB的输出脉冲的占空比来调节小车速度,使小车在智能控制模式下可以随机改变速度,但由于小车负重过大,在速度较小时走不动,故整个过程中都采用匀速。 (3)在设计智能控制时为了想办法尽量让小车的运动状态能够实现,尝试了多种算法,都不是很如意,最后通过设计随机数才解决了这个问题。(4)在智能控制模
15、式下,小车的速度较快,噪音较大,还有一些软件设计的不足吧,小车的语音判别不如其他模式下灵敏。但由于我的语音控制部分能力较不足,故不能很好的解决它。心得体会整个小车做下来,论文写到这边最先想到的就一个字“累”。这个系统说大不大,但对于能力不是特别强的我来说,也不小了。本来我幼稚的还想小车的程序可以一个嵌着一个,无限的执行下去,现在发现,好可笑哦。凌阳学了没几天就开始写程序,中间难免会磕磕碰碰的,特别是语音部分,没人问,也没多少相关资料,有好几次都想放弃了,但在一次次的坚持下来后,发现我各方面都长进了不少。虽然本小车的软件还有许多的不足,但仍让我感受到了成功的喜悦。在和组员的讨论中也对硬件加深了兴
16、趣,充分地去了解每个硬件的工作原理,而不是照搬别人的。第一次写论文写得这么淋漓尽致。因为以前的论文都是要嘛网上摘抄,要嘛就是参考别人,只有这一次是真真实实属于自己的,每一句话都是自己的理解,它是完完全全属于我的东西。第一次对写心得不会那么还怕,因为我是真的学到了东西。这次遇到了许多的问题及它的最后解决,让我处理问题的能力也提高了不少。总的来说呢,这次的小车基本实现了原先所设想的功能,或还有一些不足,但相对来说也还算不错啦!自满了点。总归一句话,好累,但也好开心!附件1L298 1片LM339 1片74LS04 2片74HC00 1片555定时器 1片二共阴LED 1片四共阴LED 1片PNP9
17、012 2个红外发光管 5个红外接收管 3个一体化红外接收头 2个精密变阻器 100K 3个 10K 1个 2K 2个电阻 9.5 2个270 16个 680 2个1.2K 2个 5.1K 4个 5.7K 1个 22K 4个附件2/=/ 组成文件:main.c,SPCE061.A/Flash.asm, hardware.asm,ISR.asm / hardware.h,s480.h, hardware.inc/硬件连接:IOA0-IOA13 -路程、速度显示/IOA14-15 -后避障/IOB0-1 -前避障/IOB2 -速度的检测/IOB4-7-遥控信号输入/IOB9、IOB12-15 -电
18、机的驱动/IOB10-重新训练/=#include SPCE061A.h#include s480.h#include bsrSD.h#define NAME_ID 0x100#define COMMAND_YKKZ_ID 0x101#define COMMAND_FZKZ_ID 0x102#define COMMAND_ZNKZ_ID 0x103#define COMMAND_GSM_ID 0x104#define S_NAME0/给我取个名字吧#define S_ACT11/遥控控制#define S_ACT22/辅助控制#define S_ACT33/智能控制#define S_ACT4
19、4/干什么#define S_RDY5/Yeah#define S_AGAIN6/请再说一遍#define S_NOVOICE7/没有听到任何声音#define S_CMDDIFF7/说什么暗语呀#define S_NOISY7/说什么暗语呀#define S_START 8 /准备就绪,开始辨识#define S_XL 9 /巡逻#define S_LL 10/累了,休息#define S_ZAW 11/障碍物extern unsigned int BSR_SDModel100; /外部变量BSR_SDModel100,辨识器自带extern void F_FlashWrite1Word(u
20、nsigned int addr,unsigned int Value);extern void F_FlashErase(unsigned int sector);unsigned int intcount; /中断的次数,用于计算速度unsigned int disdata; /路程的全局变量unsigned int k_count; /1KHZ记数unsigned int savesp; /保存上个距离值unsigned int disadd; /LED位显示值unsigned int speed; /要显示的速度值unsigned int ret; /识别序列号unsigned int
21、 sjone; /随机数1 unsigned int sjtwo; /随机数2 unsigned int delone;unsigned int deltwo;/=/ 延时/=void delay(unsigned int a)unsigned int i,j;for(i=0;ia;i+)for(j=0;j500;j+)*P_Watchdog_Clear=1;/=/ 语音播放函数/=void PlaySnd(unsigned SndIndex,unsigned DAC_Channel)BSR_StopRecognizer();/停止识别器SACM_S480_Initial(1);/初始化为自动
22、播放SACM_S480_Play(SndIndex, DAC_Channel, 3);/开始播放一段语音while(SACM_S480_Status()&0x0001)!= 0)/是否播放完毕?SACM_S480_ServiceLoop();/解码并填充队列*P_Watchdog_Clear=0x0001;/清看门狗SACM_S480_Stop();/停止播放BSR_InitRecognizer(BSR_MIC);/初始化识别器/=/ 训练一条指令/=int TrainWord(unsigned int WordID,unsigned int SndID)int Result;PlaySnd(
23、SndID,3);/引导训练,播放指令对应动作while(1)Result = BSR_Train(WordID,BSR_TRAIN_TWICE);/训练两次,获得训练结果if(Result=0)break;switch(Result)case -1:/没有检测出声音PlaySnd(S_NOVOICE,3);return -1;case -2: /需要训练第二次PlaySnd(S_AGAIN,3);break;case -3:/环境太吵PlaySnd(S_NOISY,3);return -3;case -4:/数据库满 return -4;case -5: /检测出声音不同PlaySnd(S_
24、CMDDIFF,3);return -5;case -6: /序号错误return -6;default:break;return 0;/=/ 训练函数/=void TrainSD()while(TrainWord(NAME_ID,S_NAME) != 0) ; /训练名称while(TrainWord(COMMAND_YKKZ_ID,S_ACT1) != 0) ; /训练第1个动作while(TrainWord(COMMAND_FZKZ_ID,S_ACT2) != 0) ; /训练第2个动作while(TrainWord(COMMAND_ZNKZ_ID,S_ACT3) != 0) ; /训练
25、第3个动作while(TrainWord(COMMAND_GSM_ID,S_ACT4) != 0) ; /训练第4个动作/=/ 存储语音模型函数/=void StoreSD() unsigned int ulAddr,i,commandID,g_Ret;F_FlashWrite1Word(0xef00,0xaaaa); F_FlashErase(0xe000); F_FlashErase(0xe100); F_FlashErase(0xe200); ulAddr=0xe000;/*for(commandID=0x100;commandID0x105;commandID+)g_Ret=BSR_E
26、xportSDWord(commandID);while(g_Ret!=0)/模型导出成功?g_Ret=BSR_ExportSDWord(commandID);for(i=0;i100;i+)/保存语音模型SD1(0xe000-0xe063) F_FlashWrite1Word(ulAddr,BSR_SDModeli);ulAddr+=1;/=/ 装载语音模型函数/=void LoadSD() unsigned int *p,k,jk,Ret,g_Ret;p=(int *)0xe000;for(jk=0;jk5;jk+)for(k=0;k=0&data=9)switch(data)case 0
27、 :return 0x3f;case 1 :return 0x06;case 2 :return 0x5b;case 3 :return 0x4f;case 4 :return 0x66;case 5 :return 0x6d;case 6 :return 0x7d;case 7 :return 0x07;case 8 :return 0x7f;case 9 :return 0x6f;else return 0;/=/ 中断/=void IRQ3(void)_attribute_(ISR); /外部中断入口,用于测距离void IRQ3(void)if(sjone=0)sjone=42;else sjone-;if(sjtwo=42)sjtwo=0;else sjtwo+;intcount+=1;disdata=(intcount*6)/100+intcount*2);