互动智能多功能控制小车论文.docx
《互动智能多功能控制小车论文.docx》由会员分享,可在线阅读,更多相关《互动智能多功能控制小车论文.docx(37页珍藏版)》请在冰豆网上搜索。
![互动智能多功能控制小车论文.docx](https://file1.bdocx.com/fileroot1/2023-3/19/7f660921-9975-42f2-b814-d4c0486ecf1b/7f660921-9975-42f2-b814-d4c0486ecf1b1.gif)
互动智能多功能控制小车论文
人机互动智能多功能控制小车
摘要
本设计采用凌阳的SPCE061A型十六位单片机,前面避障采用一体化红外接受头接受38KHZ脉冲,后面避障采用红外对管,车速和距离的检测采用红外对管检测轮子的行驶产生脉冲,速度的改变利用PWM的占空比改变实现,使用电机控制专用芯片LM298驱动电机,在市场上遥控小车的基础上,加上61板上的语音部分配上独特的算法,实现小车的人机互动智能多功能控制。
实验目的
本小车设计有高频、低频、语音控制,是一个较具有创新性的综合设计。
它在现市场遥控小车的基础上,将避障、语音功能加进小车中,实现小车的多模式控制。
可当以后小车玩具发展的一个趋势,亦可很好的锻炼我们综合设计能力。
方案器件选择
方案一采用传统的89C51作为控制核心。
51单片机具有价格低廉、使用简单等特点,但其运算速度较低、功能比较单一,如要对小车实现语音等功能就必须外扩芯片,控制过程相对比较繁琐。
方案二凌阳16位单片机SPCE061A芯片作为控制核心。
SPCE061A具有丰富的资源、指令周期短、工作速率快、低功耗、地电压、可编程音频处理、在线下载易于调试等优点,相对51来说更适于对小车的控制。
尤其是语音播放功能,对我们所要做的互动式智能小车提供很大的方便,大大节省了我们的软件、硬件工作。
基于上述分析,拟选择方案二。
硬件器件见附件1。
工作原理及电路原理图
一、硬件电路的具体实现
硬件方面主要包括六方面:
前后避障,遥控信号输入,电机驱动电路,速度的测量、速度路程的显示以及语音的输入、播放。
前后避障、遥控信号输入皆由软件进行扫描从而执行相应程序;驱动电路由IOB9口输出的脉冲与IOB12、IOB13相与分别控制小车的前进、后退,通过改变脉冲的占空比从而调节小车的速度;速度测量则是通过计算速度检测输入的脉冲并按一定算法计算出瞬时速度与总路程;并用2个LED输出瞬时速度,用4个LED输出总路程,LED皆为动态扫描的共阴管;语音的输入及播放则直接使用61板上的语音识别、播放功能。
总的设计框架如下图
速度、路程显示
遥控
发射
电路
遥控
接收
电路
语音的识别、播放
前、后避障
速度测量
电机的驱动
61板
图1总硬件框图
(1)避障
避障包括前面避障和后面避障。
前避障具体电路见图2所示。
图2前面避障原理图
本避障的发射采用555定时器构成的多谐振荡器产生38KHZ、占空比4/5的方形脉冲信号,通过三极管电平取反并放大来驱动红外发光管。
接收部分采用一体化红外接收头,它只接收38KHZ左右的脉冲信号,具有较强的抗干扰性,低电压,低功耗等优点。
没障碍物时对应的I/O输入口IOB0与IOB1口输入为低电平,当遇到障碍物时,若为左边接收头的相应管脚发生电平变化即输入口IOB0变为高电平或为右边接收头的相应管脚发生电平变化即输入口IOB1变为高电平,或二者皆输入高电平,单片机通过扫描发现输入为高电平时,采取相应的操作,实现在车的左前进、右前进、倒车或停止等。
后面避障见图3所示。
电路采用发光对管,与前避障相似,遇到障碍物接收管发生电平改变输入高电平,单片机通过扫描执行相应程序。
图3后面避障原理图
(2)测速
速度、路程的测量电路图与后避障类似,具体电路见下图
图4速度检测原理图
亦采用发光对光,将输出端接到单片机的外部中断口IOB2。
由于轮子有7个沟槽,轮子转一圈接收管可得到7个脉冲,单片机发生7次外部中断。
通过单片机计算外部中断次数并按一定的算法计算出小车速度与路程。
(3)速度、路程的显示
速度的显示采用两个动态扫描共阴管LED,路程的显示采用四个动态扫描共阴的LED管,具体电路如图5所示。
动态扫描的LED管节省了单片机的I/O口,采用74HC04提高LED管公共端的驱动能力。
单片机采用1KHZ的定时器中断,利用余晖效应实现LED的逐个显示。
图5速度、路程显示原理图
(4)电机驱动电机的驱动电路如图6所示。
图6驱动电路原理图
电机驱动电路直接使用电机控制专用芯片L298。
由IOB9口直接输出由单片机内部产生的PWM脉冲,与控制前进、后退的I/O口输出的电平相与从而控制小车的速度。
当对应的前进、后退、左拐、右拐I/O口输出高电平时,可驱动相应的电机运动。
其基本输出和小车运动状态对照如下表。
IOB12
IOB13
IOB14
IOB15
后电机
前电机
小车
0
0
0
0
停转
停转
停
1
0
0
0
正转
停转
前进
0
1
0
0
反转
停转
倒车
1
0
1
0
正转
正转
左前拐
1
0
0
1
正转
反转
右前拐
0
1
0
1
反转
反转
左后拐
0
1
1
0
反转
正转
右后拐
原理上IOB12与IOB13、IOB14与IOB15不可同时为高电平。
(5)遥控发射、接受电路
由于本小车是基于市场上的遥控小车开发出来的多功能小车,遥控发射、接受模块就采用原小车上的发射接受模块。
然后把接收模块的前进、后退、左拐、右拐四个输出接到单片机上的IOB4、IOB5、IOB6、IOB7上,经单片机处理有驱动模块控制小车的运动。
(6)61板上语音播放、识别电路如下图
图7语音播放、识别电路
语音波形传到话筒MIC经AD转换后传到单片机,由单片机专门的语音识别指令识别语音。
而单片机中存储的语音则通过喇叭SPEAKER发出。
在61板上,这些主要都有软件实现。
另外还用一个按键开关一端接高电平,一端IOB10。
当按键按下去时,输入高电平,1KHZ的定时中断中对它进行判别,若输入为高电平,则执行死循环,由于没喂狗从而使系统重新执行,实现语音的重新训练。
二、系统的软件组成部分
单片机的控制电路由凌阳单片机实现,主要负责语音的训练于辨识指令,对避障的处理,遥控信号的处理,速度的检测的计算,速度路程的显示输出,电机的驱动输出,及对语音的反应处理。
从而使小车能够实现三种控制模式的工作。
即遥控控制、辅助控制、智能控制。
软件的主要特色:
﹡语音识别在程序中为最高级别,实时判别是否有指令相关的语音输入。
﹡通过按键来实现小车指令的重新训练,从而适用于不同的人更好的控制小车。
﹡使用了5条指令:
小车、遥控控制、辅助控制、智能控制、你在干什么。
当识别到“小车”这个语句,小车就会回答“yeah”,识别到“你在干什么”时
若不在任何模式下,它会回答“累了,休息一下”,若在智能控制控制模式下且进入stop子程序,也会回答“累了,休息一下”,其他情况下回答“巡逻”。
当接收到“遥控控制”、“辅助控制”或“智能控制”指令时,则小车会重复一遍所接收到的指令并进入相应模式下工作。
外部硬件与单片机I/O口的连接如下图
图8外部硬件与单片机I/O口接图
小车通过中断实现速度、路程的检测显示
初始化
1KHZ中断
外部中断
速度、路程的显示
速度、路程的计算
图9速度、路程处理流程图
通过输入单片机的脉冲信号计算小车所走的路程,除以所使用的时间,得到瞬时速度。
通过1KHZ的中断轮流选择LED,实现速度、路程的动态LED显示。
在1KHZ的处理程序中还加有对重新训练按键的识别,若按键按下,死循环,由于没有喂狗,从而使程序从头开始,实现语音的从新训练。
小车主要可实现三种控制模式:
遥控控制、辅助控制、智能控制
总流程如下
初始化
训练
经过训练
N
遥控控制
辅助控制
智能控制
名字
在干什么
语音识别
语音模型载入识别器
Y
0x1010x1020x1030x1040x100
图10模式总流程图
(1)遥控控制
遥控信号的电路为小车的原硬件模块,将接收到的电平信息输入到对应的I/O口,单片机通过处理输出相对应的驱动电路电平,实现完全的人为控制小车。
同时实时语音识别。
如识别出控制指令则跳到主程序再进入相应的控制模式。
并且当你问及“你在干什么”时会回答“巡逻”。
遥控控制流程图如下
主程序
语音识别
干什么
智能控制
小车
辅助控制
遥控控制
相应的驱动电路信号输出
0x101
遥控信号输入
Y
N
语音判别返回值
非模式指令
为模式指令
图11遥控控制流程图
(2)辅助控制
辅助控制即为在遥控控制的基础上加上避障功能。
如果前进过程中前避障探测到前面有障碍物,且小车在继续前进中,则不管遥控有没有输入拐信号,若是左边探测到障碍物小车都将自动右拐前进;若是右边探测到障碍物小车都将自动左拐前进;若是两边都探测到即障碍物在正前方,小车将自动停下。
如果是后退时后避障探测到障碍物,小车若继续后退则将自动停下来且会提示“有障碍物”。
直至遥控输入前进信号,它才继续运动。
它亦具有实时语音识别功能。
问及“你在干什么”时会回答“巡逻”。
辅助控制流程图如下:
主程序
语音识别
干什么
智能控制
小车
遥控控制
0x102
辅助控制
前面测到障碍物
N
Y
相应的驱动电路信号输出
有前进信号输入
只能前进右拐
Y
N
后面测到障碍物
有后退信号输入
Y
Y
停车
N
N
遥控前进信号输入
Y
相应的驱动电路信号输出
语音判别返回值
非模式指令
为模式指令
图12辅助控制流程图
(3)智能控制
智能控制则是利用单片机,按一定算法产生随机数,通过随机数实现小车的随机前进、后退、左拐、右拐、和停车。
主要流程如下,
主程序
语音识别
干什么
辅助控制
小车
遥控控制
0x103
智能控制
随机进入子程序
子程序返回值
为模式指令
语音判别返回值
非模式指令
判别值=子程序
返回值
非模式指令为模式指令
图13智能控制流程图
随机进入的子程序包括:
停车、前进、倒车、左拐、右拐。
子程序的执行时间长短由单片机通过一定算法随机产生,当碰到障碍物时会执行特定的处理。
在整个过程中都实时语音指令的判别。
具体软件程序见附件2。
实验中遇到的问题及分析
(1)由于对凌阳板的语音处理方面不是了解得很透测,以至在小车运行时发现总不能跳入外部中断和定时中断子程序。
后经过察看中断控制寄存器发现单片机每播放一次语音,中断寄存器只开TimerA中断,其他中断都被关了,故每执行一次语音播放后都重开一次中断,从而导致小车在播放语音时,会导至LED的暂时不显示,由于对凌阳板还在学习中,故这个问题还没从根本上解决,但还好,对小车的影响不大。
(2)本来小车的速度通过TimerB的输出脉冲的占空比来调节小车速度,使小车在智能控制模式下可以随机改变速度,但由于小车负重过大,在速度较小时走不动,故整个过程中都采用匀速。
(3)在设计智能控制时为了想办法尽量让小车的运动状态能够实现,尝试了多种算法,都不是很如意,最后通过设计随机数才解决了这个问题。
(4)在智能控制模式下,小车的速度较快,噪音较大,还有一些软件设计的不足吧,小车的语音判别不如其他模式下灵敏。
但由于我的语音控制部分能力较不足,故不能很好的解决它。
心得体会
整个小车做下来,论文写到这边最先想到的就一个字“累”。
这个系统说大不大,但对于能力不是特别强的我来说,也不小了。
本来我幼稚的还想小车的程序可以一个嵌着一个,无限的执行下去,现在发现,好可笑哦。
凌阳学了没几天就开始写程序,中间难免会磕磕碰碰的,特别是语音部分,没人问,也没多少相关资料,有好几次都想放弃了,但在一次次的坚持下来后,发现我各方面都长进了不少。
虽然本小车的软件还有许多的不足,但仍让我感受到了成功的喜悦。
在和组员的讨论中也对硬件加深了兴趣,充分地去了解每个硬件的工作原理,而不是照搬别人的。
第一次写论文写得这么淋漓尽致。
因为以前的论文都是要嘛网上摘抄,要嘛就是参考别人,只有这一次是真真实实属于自己的,每一句话都是自己的理解,它是完完全全属于我的东西。
第一次对写心得不会那么还怕,因为我是真的学到了东西。
这次遇到了许多的问题及它的最后解决,让我处理问题的能力也提高了不少。
总的来说呢,这次的小车基本实现了原先所设想的功能,或还有一些不足,但相对来说也还算不错啦!
自满了点。
总归一句话,好累,但也好开心!
附件1
L2981片
LM3391片
74LS042片
74HC001片
555定时器1片
二共阴LED1片
四共阴LED1片
PNP90122个
红外发光管5个
红外接收管3个
一体化红外接收头2个
精密变阻器100K3个
10K1个
2K2个
电阻9.52个
27016个
6802个
1.2K2个
5.1K4个
5.7K1个
22K4个
附件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----电机的驱动
//IOB10----重新训练
//=============================================================
#include"SPCE061A.h"
#include"s480.h"
#include"bsrSD.h"
#defineNAME_ID0x100
#defineCOMMAND_YKKZ_ID0x101
#defineCOMMAND_FZKZ_ID0x102
#defineCOMMAND_ZNKZ_ID0x103
#defineCOMMAND_GSM_ID0x104
#defineS_NAME0//给我取个名字吧
#defineS_ACT11//遥控控制
#defineS_ACT22//辅助控制
#defineS_ACT33//智能控制
#defineS_ACT44//干什么
#defineS_RDY5//Yeah
#defineS_AGAIN6//请再说一遍
#defineS_NOVOICE7//没有听到任何声音
#defineS_CMDDIFF7//说什么暗语呀
#defineS_NOISY7//说什么暗语呀
#defineS_START8//准备就绪,开始辨识
#defineS_XL9//巡逻
#defineS_LL10//累了,休息
#defineS_ZAW11//障碍物
externunsignedintBSR_SDModel[100];//外部变量BSR_SDModel[100],辨识器自带
externvoidF_FlashWrite1Word(unsignedintaddr,unsignedintValue);
externvoidF_FlashErase(unsignedintsector);
unsignedintintcount;//中断的次数,用于计算速度
unsignedintdisdata;//路程的全局变量
unsignedintk_count;//1KHZ记数
unsignedintsavesp;//保存上个距离值
unsignedintdisadd;//LED位显示值
unsignedintspeed;//要显示的速度值
unsignedintret;//识别序列号
unsignedintsjone;//随机数1
unsignedintsjtwo;//随机数2
unsignedintdelone;
unsignedintdeltwo;
//=============================================================
//延时
//=============================================================
voiddelay(unsignedinta)
{
unsignedinti,j;
for(i=0;ifor(j=0;j<500;j++)
*P_Watchdog_Clear=1;
}
//=============================================================
//语音播放函数
//=============================================================
voidPlaySnd(unsignedSndIndex,unsignedDAC_Channel)
{
BSR_StopRecognizer();//停止识别器
SACM_S480_Initial
(1);//初始化为自动播放
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);//初始化识别器
}
//=============================================================
//训练一条指令
//=============================================================
intTrainWord(unsignedintWordID,unsignedintSndID)
{
intResult;
PlaySnd(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_CMDDIFF,3);
return-5;
case-6:
//序号错误
return-6;
default:
break;
}
}
return0;
}
//=============================================================
//训练函数
//=============================================================
voidTrainSD()
{
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);//训练第3个动作
while(TrainWord(COMMAND_GSM_ID,S_ACT4)!
=0);//训练第4个动作
}
//=============================================================
//存储语音模型函数
//=============================================================
voidStoreSD()
{unsignedintulAddr,i,commandID,g_Ret;
F_FlashWrite1Word(0xef00,0xaaaa);
F_FlashErase(0xe000);
F_FlashErase(0xe100);
F_FlashErase(0xe200);
ulAddr=0xe000;//********
for(commandID=0x100;commandID<0x105;commandID++)
{
g_Ret=BSR_ExportSDWord(commandID);
while(g_Ret!
=0)//模型导出成功?
g_Ret=BSR_ExportSDWord(commandID);
for(i=0;i<100;i++)//保存语音模型SD1(0xe000---0xe063)
{
F_FlashWrite1Word(ulAddr,BSR_SDModel[i]);
ulAddr+=1;
}
}
}
//========================