关闭

关闭

封号提示

内容

首页 红外避障小车.doc

红外避障小车.doc

红外避障小车.doc

上传者: Myron龙 2017-10-07 评分 5 0 158 21 716 暂无简介 简介 举报

简介:本文档为《红外避障小车doc》,可适用于IT/计算机领域,主题内容包含红外避障小车年月日星期三:今天就用Arduino简单的控制一下小车的前进及转弯。要准备的有:机器人基地WD小车、Arduino控制器、Arduino符等。

红外避障小车年月日星期三:今天就用Arduino简单的控制一下小车的前进及转弯。要准备的有:机器人基地WD小车、Arduino控制器、Arduino传感器扩展板(这里我为了接线方便使用)、双H桥直流电机驱动板、电池、杜邦线若干。双H桥直流电机驱动板的接线方式及使用方法以前博文Arduino控制直流电机曾介绍过这里做一下详细说明。首先VMS驱动部分取电可接VV逻辑部分可板内取电即端子可悬空也可接入VV。端子左右两排三个插针分别用来控制两路直流电机。EA、EB接入ArduinoPWM接口用于电机调速I、I、I、I接口分别用来控制两路直流电机前进、后退、转向以及刹车只需接入Arduino的数字接口即可。散热片后有单排四个插针用来接步进电机但是我们也可以用他们接入两路直流电机这样首先可以解决电机线不够长的问题其次就是用杜邦线做电机引线方便插接问题了不过用这个方式接线我们一定要注意一点就是板子左右上角的电流反馈接口跳线帽一定要像下图一样接好左右对称。电流反馈功能以后再研究且电机插针左边两插针与左路电机对应右边两插针与右路电机对应杜邦线插接即可。下面附几幅我的接线完成图仅供大家参考。传感器接线图红黑线为电源线我是从双H桥直流电机驱动板取电其他为电机控制线。驱动板接线细节图直流电机接线细节图到此准备工作基本完成可以编写程序了这里我把WD小车直走、后退、左转、右转、刹车的功能都编写进程序供大家参考。程序如下:intpinI=定义I接口intpinI=定义I接口intspeedpin=定义EA(PWM调速)接口intpinI=定义I接口intpinI=定义I接口intspeedpin=定义EB(PWM调速)接口voidsetup(){pinMode(pinI,OUTPUT)pinMode(pinI,OUTPUT)pinMode(speedpin,OUTPUT)pinMode(pinI,OUTPUT)pinMode(pinI,OUTPUT)pinMode(speedpin,OUTPUT)}voidloop(){直走analogWrite(speedpin,)输入模拟值进行设定速度analogWrite(speedpin,)digitalWrite(pinI,LOW)使直流电机(右)逆时针转digitalWrite(pinI,HIGH)digitalWrite(pinI,LOW)使直流I=定义I接口intpinI=定义I接口intspeedpin=定义EB(PWM调速)接口intIRR=定义右侧避障传感器接口intIRM=定义中间避障传感器接口intIRL=定义左侧避障传感器接口voidsetup(){pinMode(pinI,OUTPUT)pinMode(pinI,OUTPUT)pinMode(speedpin,OUTPUT)pinMode(pinI,OUTPUT)pinMode(pinI,OUTPUT)pinMode(speedpin,OUTPUT)pinMode(IRR,INPUT)pinMode(IRM,INPUT)pinMode(IRL,INPUT)}voidadvance(inta)前进{analogWrite(speedpin,a)输入模拟值进行设定速度analogWrite(speedpin,a)digitalWrite(pinI,LOW)使直流电机(右)逆时针转digitalWrite(pinI,HIGH)digitalWrite(pinI,LOW)使直流电机(左)顺时针转digitalWrite(pinI,HIGH)}voidright(intb)右转{analogWrite(speedpin,b)输入模拟值进行设定速度analogWrite(speedpin,b)digitalWrite(pinI,HIGH)使直流电机(右)顺时针转digitalWrite(pinI,LOW)digitalWrite(pinI,LOW)使直流电机(左)顺时针转digitalWrite(pinI,HIGH)}voidleft(intc)左转{analogWrite(speedpin,c)输入模拟值进行设定速度analogWrite(speedpin,c)digitalWrite(pinI,LOW)使直流电机(右)逆时针转digitalWrite(pinI,HIGH)digitalWrite(pinI,HIGH)使直流电机(左)逆时针转digitalWrite(pinI,LOW)}voidstop()停止{digitalWrite(pinI,HIGH)使直流电机(右)制动digitalWrite(pinI,HIGH)digitalWrite(pinI,HIGH)使直流电机(左)制动digitalWrite(pinI,HIGH)}voidback(intd)后退{analogWrite(speedpin,d)输入模拟值进行设定速度analogWrite(speedpin,d)digitalWrite(pinI,HIGH)使直流电机(右)顺时针转digitalWrite(pinI,LOW)digitalWrite(pinI,HIGH)使直流电机(左)逆时针转digitalWrite(pinI,LOW)}voidloop(){intr,m,lr=digitalRead(IRR)m=digitalRead(IRM)l=digitalRead(IRL)if(l==HIGHm==HIGHr==HIGH)advance()if(l==LOWm==LOWr==LOW){back()delay()right()delay()}if(l==LOWm==HIGHr==LOW){back()delay()right()delay()}if(l==HIGHm==LOWr==HIGH){back()delay()right()delay()}if(l==LOWm==LOWr==HIGH)right()if(l==LOWm==HIGHr==HIGH)right()if(l==HIGHm==LOWr==LOW)left()if(l==HIGHm==HIGHr==LOW)left()蔽障程序#include<ATXH>bitRandomFactor=bitRandomFactorBuf=#include<TimerH>#defineFLeftMotorP=P=#defineBLeftMotorP=P=#defineFRightMotorP=P=#defineBRightMotorP=P=#defineLeftStopP=P=#defineRightStopP=P=#defineCarStopP=P=P=P=#defineRightSenserP#defineLeftSenserP********************************************************左转********************************************************voidTurnLeft(){LeftStopFRightMotor}********************************************************快速左转********************************************************voidTurnLeftFast(){BLeftMotorFRightMotor}********************************************************右转********************************************************voidTurnRight(){RightStopFLeftMotor}********************************************************快速右转********************************************************voidTurnRightFast(){BRightMotorFLeftMotor}********************************************************用倒退的方式进行车头右转********************************************************voidBTurnRight(){LeftStopBRightMotor}********************************************************用倒退的方式进行车头左转********************************************************voidBTurnLeft(){RightStopBLeftMotor}********************************************************前进********************************************************voidFCar(){FLeftMotorFRightMotor}********************************************************后退********************************************************voidBCar(){BLeftMotorBRightMotor}********************************************************壁障程序********************************************************voidObstacleAvoid(void){if(RightSenserLeftSenserPWM){FCar()}if((!RightSenser)LeftSenserPWM){BTurnLeft()}if(RightSenser(!LeftSenser)PWM){BTurnRight()}if(!(RightSenser||LeftSenser)){RandomFactorBuf=RandomFactorwhile(!(RightSenser||LeftSenser)){if(RandomFactorBuf){BTurnLeft()delay()}if(!RandomFactorBuf){BTurnRight()delay()}}}if(!PWM){LeftStopRightStop}}********************************************************跟随程序********************************************************voidFollow(void){if(RightSenserLeftSenserPWM){LeftStopRightStop}if((!RightSenser)LeftSenserPWM){TurnRight()}if(RightSenser(!LeftSenser)PWM){TurnLeft()}if(!(RightSenser||LeftSenser)){FCar()}}****************************************************************************************************************main(){TimerSetup()TimerSetup()ObstacleAvoid()Follow()}基于凌阳单片机的语音控制小车的设计自己做的东西::阅读评论字号:大中小实习目的与意义实习任务设计并制作一个能自动往返于起跑线与终点线间的智能小车并具备人工遥控的功能其跑道俯视图如图所示。跑道说明:跑道宽度m表面贴有白纸两表面贴有白纸两侧有挡板挡板与地面垂直。在跑道的B、C、D、E、F、G各点处画有cm宽的黑线各段的长度如图所示。基本要求()、智能小车主控芯片任选一款单片机:ATS或SPCEA()、人工遥控小车发车(语音遥控或无线遥控任选)()、智能小车从起跑线出发(出发前车体不得超过起跑线)到达终点后停留秒然后自动返回起跑线(允许倒车返回)往返一次的时间应力求最短(从小车起跑开始计时)()、到达终点线和返回起跑线停车位置离终点线和起跑线偏差应最小且小车与跑道中心线的偏差也应为最小()、DE间为限速区车辆往返均要求以低速通过通过时间不得少于秒但不允许在限速区内停车()、如采用语音遥控则小车回到起跑线后需语音播报“旅行结束”。(实习意义通过智能小车的设计及制作,巩固并掌握IDE的编程方法学会利用单片机进行程序设计并实现功能。通过在小车的设计与制作将所学的知识体现出来并应用于实际生活中在设计过程中对小车功能的创新和改良增强学生的创新意识和逻辑思维能力提高学生的动手能力和研究主动性。实验内容和步骤车体设计板简介板是SPCEAEMUBOARD的简称是以凌阳位单片机SPCEA为核心的精简开发仿真实验板大小相当于一张扑克牌是“凌阳大学计划”专为电子爱好者和高校大学生进行课程设计、毕业设计及电子竞赛所设计的也可作为单片机项目初期研发使用。板除了具备单片机最小系统电路外还包括电源电路、音频电路(含MIC输入部分和DAC音频输出部分)、复位电路等使学生在掌握软件设计的同时熟悉单片机硬件的设计制作锻炼动手能力也为单片机学习者和开发者创造了一个良好的学习条件和开发新产品的机会~SPCEA单片机简介SPCEA是一款位结构的微控制器下图是它的结构概览:SPCEA主要包括输入输出端口、定时器计数器、数模转换、模数转换、串行设备输入输出、通用异步串行接口、低电压监测和复位等部分并且内置在线仿真电路ICE接口较高的处理速度使其能够快速的处理复杂的数字信号。SPCEA单片机应用领域广泛例如应用在家用电器控制器、工业控制、通信产品、医疗设备以及电子书籍等诸多方面。电源板采用节号电池进行供电由J接入。其中的前后两组电容用来去耦滤波使其供给芯片的电源更加干净平滑。为了获得标准的V电压在扳子上加入SPYA三端稳压器。两个二极管是为了防止误将电源接反造成不必要损失而设置的在操作过程中千万不要将电源接反因为反向电压超过一定的值二极管将会被损坏达不到保护的目的。后面的零电阻及其电源、地分成不同的几路是为了减少电磁干扰设置的。程序下载区ICE基本运作方式是通过控制CLOCK及通过ICE喂入指令方式来控制CPU的运行及缓存器资料和内存资料的存取因此必须透过控制缓存器值的设定来控制目前CPU的动作。每个相连接的不同ICE模块都拥有自己独特的bitID当PC在传送control信号时都会先传送该bitID只有ICE本身的ID和control信号的ID相同时才会执行该命令或回传资料。板上的HC主要在我们选用下载线的时候起作用主要奇缓存的作用和完成SDA是作为数据回送还是数据下传的选择。传感器模块用光敏电阻组成光敏探测器。光敏电阻的阻值可以跟随周围环境光线的变化而变化。当光线照射到白线上面时光线发射强烈光线照射到黑线上面时光线发射较弱。因此光敏电阻在白线和黑线上方时阻值会发生明显的变化。将阻值的变化值经过比较器就可以输出高低电平。(语音控制小车概述功能要求语音控制小车是凌阳大学计划推出的基于SPCEA的代表性兴趣产品它配合板推出综合应用了SPCEA的众多资源打破了传统教学中单片机学习枯燥和低效的现状。小车采用语音识别技术可通过语音命令对其行驶状态进行控制。语音控制小车的主要功能:可以通过简单的IO操作实现小车的前进、后退、左转、右转功能配合SPCEA的语音特色利用系统的语音播放和语音识别资源实现语音控制的功能可以在行走过程中声控改变小车的运动状态车体结构车体结构图图、所示。语音控制小车为四轮结构车的结构示意图如下图所示。其中前面两个车轮由前轮电机控制在连杆和支点作用下控制前轮左右摆动来调节小车的前进方向。在自然状态下前轮在弹簧作用下保持中间位置。后面两个车轮又后轮电机驱动为整个小车提供动力所以又称前面的轮子为方向郑竺娴牧礁雎肿游整个小车分为三大部分:车体部分、板、控制板。车体部分:小车车体主要为两个电机驱动装置分前轮(方向)驱动和后轮(动力驱动)。在车体的下面有一个可以安装节AA电池的电池盒整个小车的电源就是由它来提供的。在小车的底部有一个红色的小开关它负责控制整个小车的电源开通与关断。板:板是小车的核心部分它负责整个小车控制信号的产生以及语音的播放和识别功能实现的。在不使用小车时可以将板从小车上拆下来板仍然是完整的可以用它来做其它的实验或开发。控制板:控制板负责将来自板的控制信号转化为能够驱动电动机的信号。硬件框图小车控制系统硬件结构比较简单主要分为两个部分:一个是SPCEA精简开发板(即“”板)如图所示另外一个是电机控制板如图所示。电机控制板的工作就是根据板的输出新高去启动和停止相应的电机以及调整电机的正反转方向。正是通过开启和关闭相应的电机使电机在不同的组合状态运转最终来实现小车的前进倒退等功能。小车方案及程序分析小车方案可以通过简单的IO操作实现小车的前进、后退、左转、右转功能配合SPCEA的语音特色利用系统的语音播放和语音识别资源实现语音控制的功能可以在行走过程中声控改变小车的运动状态实现能自动往返于起跑线与终点线间的智能流程并具备人工遥控(我们选用语音控制)的功能。程序流程图、语音识别总流程图语音识别小车的主程序流程如图所示分为四大部分:初始化部分、训练部分、识别部分、重训操作。初始化部分:初始化操作将IOB~IOB设置为输出端用以控制电机。必要时还要有对应的输入端设置和PWM端口设置等。训练部分:训练部分完成的工作就是建立语音模型。程序一开始判断小车是否被训练过如果没有训练过则要求对其进行训练并且会在训练成功之后将训练的模型存储到FLASH在以后使用时不需要重新训练如果已经训练过会把存储在FLASH中的模型调出来装载到辨识器中。识别部分:在识别环节当中如果辨识结果是名字则进入自动往返流程状态。如果辨识结果为动作指令小车会语音告知相应动作并执行该动作。重训操作:考虑到有重新训练的需求设置了重新训练的按键(板的KEY)循环扫描该按键一旦检测到此键按下则将擦除训练标志位(xe单元)并等待复位。复位后程序重新执行当检测到训练标志位为xffff时会要求重新对其进行训练。下面详细介绍以上提到的子程序。、训练函数流程图当程序检测到训练标志位BSFlag内容为xffff就会要求操作者对它进行训练操作训练操作的过程如图所示:训练采用两次训练获取结果的方式以训练名字为例:小车首先会提示:给我取个名字吧这时你可以告诉它一个名字然后它会提示:请再说一遍这时再次告诉它名字如果两次的声音差别不大小车就能够成功的建立模型名称训练成功如果没能够成功的建立模型小车会告知失败的原因并要求重新训练。成功训练名称后会给出下一条待训练指令提示音:前进参照名称训练方式训练前进指令。依次训练小车的名称前进指令倒车指令左转指令右转指令全部训练成功子程序返回训练结束。、语音识别函数流程图语音识别流程如图所示:首先获取辨识器的辨识结果判断是否有语音触发如果有语音触发则会返回识别结果的ID号ID号对应名称或者对应不同的动作。如果ID号为名称则进入运动自动往返程序流程如果ID号为动作则语音告知将要执行的动作并执行该动作。动作子程序:动作子程序包括:前进、倒车、左拐、右拐、自动往返子程序。前进:由小车的结构原理和驱动电路分析知:只要IOB为高电平IOBIOBIOB全部为低电平即可实现小车的前进。前进子程序包括语音提示、置端口数据、启动定时器操作。倒车:由小车的结构原理分析和驱动电路分析知:只要IOB为高电平IOBIOBIOB全部为低电平即可实现小车的倒退。倒退子程序包括语音提示、置端口数据、启动定时器操作。左转:由小车的结构原理分析和驱动电路分析知:小车左转需要两个条件:前轮左偏后轮前进这时对应的IO状态为:IOB、IOB为高电平IOB、IOB为低电平。左转子程序包括语音提示、置端口数据、启动定时器操作。右转:由小车的结构原理分析和驱动电路分析知:小车右转需要两个条件:前轮右偏后轮前进这时对应的IO状态为:IOB、IOB为高电平IOB、IOB为低电平。右转子程序包括语音提示、置端口数据、启动定时器操作。、自动往返(如图所示):由语音识别子函数的名字命令来触发的自动往返鱼如图所示的跑道的上的子程序。该程序流程实现小车对各黑线的识别并在识别后执行相应的动作识别黑线流程实质上是在检测到黑线并又黑线到白线的上升(原为下降为实现检测信号的灵敏度加反向器后为上升沿)沿脉冲触发下依次开外部中断ExtIRQ次的过程。在从起点到终点过程中当检测到D线以及在从终点返回起点检测到E线时小车步进减速并开启IRQHZ中断定时s后自动加速前进继续检测后续黑线并执行相应动作流程。同时为实现在终点线H过后停留s的要求需要在检测到H线后开启IRQHZ中断实现定时A、B、C、D、E、F、G……线时开外不中断分别在去城和回程检测到D、E线时开IRQHZ在第一次检测到G线时小车停S。、中断控制流程。虽然已经有了前进、后退以(通过直接呼叫小车的名字使其停车)等语音控制指令但是考虑环境的干扰因素小车运行时的噪音影响和有效距离的限制小车运行后可能接收不到语音指令而一直运行。为了防止出现这种情况加入了时间控制在启动小车运行的同时启动定时器定时器时间到停止小车的运行该定时器借助于Hz时基中断完成图所示为该程序的流程图。可以在程序中修改uiTimeset参数来控制运行时间当uiTimeset=时运行时间为s以此类推。硬件连接调试过程硬件调试过程相对顺利实验第一步就是按照实验说明书对板的元件进行焊接以及小车车体的连接安装在对实习要求理解的基础上确立了实现方案后硬件的连接有了明确的要求:为了实现对黑线的检测需要连接黑白传感器由于黑白线的识别是基于外部黑白传感信号的输入进而开外不中断实现的(在本次方案中采用外部中断IPQ)所以将IOB口外接黑白传感器以实现对黑白信号的检测。由于光线的关系在实际调程序时传感器的灵敏度不是很高多数情况下很难检测到信号。基于上述现象我们给传感器附加白光灯用以解决光线不稳定给程序调试带来的影响。经过上面步骤的硬件改良后虽然黑白线的识别以明显改善在光线条件良好的情况下黑白线识别信号检测基本正常但在相对较暗情况下传感器并不灵敏。为了改进这个缺陷通过对传感器的输出信号的检测发现在有白线到黑线时信号更为灵敏于是就有有了在黑白传感器输出口加反向器的设计。由于车体焊接存在的问题在程序调试过程中出现了一系列的硬件问题但经过仔细分析后这些问题都得到了解决硬件的调试改进为软件的实现调试打下了基础。程序调试过程分析本次设计任务对软件编写调试的能力要求相对较高程序调节是否顺利决定了实习进度。由于初次接触的编程所以在实习初期我们主要是学习和认知的板以及编程的基本知识这是个学习深入的过程。在对编程基础知识了解后基于对题目要求的理解和思考我们确定实现方案。可以通过简单的IO操作实现小车的前进、后退、左转、右转功能配合SPCEA的语音特色利用系统的语音播放和语音识别资源实现语音控制的功能可以在行走过程中声控改变小车的运动状态实现能自动往返于起跑线与终点线间的智能流程并具备人工遥控(我们选用语音控制)的功能。这个方案的确定是在查阅了资料“语音控制小车”的实现程序后得到的思路。基于对现有程序框架的理解我们加入了自动往返程序流程。当然程序的调试是不可能一两次就能成功的。这其中遇到的问题有很多其中就有硬件的问题以及对编程的知识的理解的不够而出现的调试困难。总体结果分析本设计综合应用了SPCEA丰富的软硬件资源成功的实现了语音控制功能。标准的C语言编程丰富的语音资源函数为编程提供了很大的方便。该设计方案结构简单以单芯片实现了语音播放与识别以及电机控制功能相当于“语音识别芯片普通单片机”的功能。但是比“语音识别芯片普通单片机”。该语音控制小车操作比较简单训练和识别成功的几率也比较高是一个典型的语音识别方案。由于时间和精力有限我们实现了实习要求的基本内容和发挥部分的大部分内容但未能实现自动语音播报行驶距离的设计要求这主要是我们对硬件的设计还不够熟练和精通以及对编程也未达到纯熟的地步。对以实现的功能要求来说我们的设计相对理想为了实现小车从起跑线出发到达终点后停留秒后然后自动返回起跑线(容许倒车返回)D~E减速区车辆减速通过不得少于s但又不容许停车往返一次的时间力求最短的要求。我们在检测黑线程序流程中的相应操作中引用了三次定时中断分别为从D~E的减速区用到IRQHZ中断定时s到终点线后的停车s定时引用IRQHZ中断以及从E~D的倒车减速区用到了IRQHZ中断。这几个定时中断确保了往返时间的精确和紧凑性。但有一点不理想的是:在减速区小车步进过程过慢造成在限速区车体如遇到些许障碍时甚至发生停车现象还好我们在设计中加入了s的定时操做避免了车体在D~E区间由于过慢的步进而长时间停留。源代码:======================================================TheinformationcontainedhereinistheexclusivepropertyofSunnnorthTechnologyCoAndshallnotbedistributed,reproduced,ordisclosedinwholeinpartwithoutpriorwrittenpermission(C)COPYRIGHTSUNNORTHTECHNOLOGYCOALLRIGHTSRESERVEDTheentirenoticeabovemustbereproducedonallauthorizedcopies================================================================================================================工程名称:CarDemo功能描述:实现小车的语音控制涉及的库:CMacrolibbsrvSDLlibsacmvelib组成文件:maincFlashasm,hardwareasm,ISRasmhardwareh,sh,hardwareinc硬件连接:IOAKEYIOAKEYIOAKEYIOB前进IOB倒车IOB左拐IOB右拐维护记录:v========================================================#include"sh"#include"bsrsdh"#definePIOAData(volatileunsignedint*)x#definePIOADir(volatileunsignedint*)x#definePIOAAttrib(volatileunsignedint*)x#definePIOBData(volatileunsignedint*)x#definePIOBDir(volatileunsignedint*)x#definePIOBAttrib(volatileunsignedint*)x#definePTimerAData(volatileunsignedint*)xA#definePTimerACtrl(volatileunsignedint*)xB#definePTimerBData(volatileunsignedint*)xC#definePTimerBCtrl(volatileunsignedint*)xD#definePWatchdogClear(volatileunsignedint*)x#definePINTMask(volatileunsignedint*)xD#definePINTClear(volatileunsignedint*)x#definePINTCtrl(volatileunsignedint*)x#definePSystemClock(volatileunsignedint*)x#defineNAMEIDx#defineCOMMANDGOIDx#defineCOMMANDBACKIDx#defineCOMMANDLEFTIDx#defineCOMMANDRIGHTIDx#defineSNAME给我取个名字吧#defineSACT前进#defineSACT倒车请注意#defineSACT左拐#defineSACT右拐#defineSRDYYeah#defineSAGAIN请再说一遍#defineSNOVOICE没有听到任何声音#defineSCMDDIFF说什么暗语呀#defineSNOISY说什么暗语呀#defineSSTART准备就绪开始辨识#defineSGJG拐就拐#defineSDCZY倒车请注意externunsignedintBSRSDModel外部变量BSRSDModel辨识器自带externvoidFFlashWriteWord(unsignedintaddr,unsignedintValue)externvoidFFlashErase(unsignedintsector)unsignedintuiTimeset=运行时间定时调整该参数控制运行时间unsignedintuiTimecont运行时间计时unsignedinttimes,time,tem,h,temp,m,c,y,t=============================================================语法格式:voidDelay()实现功能:延时参数:无返回值:无=============================================================voidDelay(){unsignedintifor(i=i<xFffi){*PWatchdogClear=x}}=============================================================语法格式:voidPlaySnd(unsignedSndIndex,unsignedDACChannel)实现功能:语音播放函数参数:SndIndex播放语音资源索引号DACChannel播放声道选择返回值:无=============================================================voidPlaySnd(unsignedSndIndex,unsignedDACChannel){BSRStopRecognizer()停止识别器SACMSInitial()初始化为自动播放SACMSPlay(SndIndex,DACChannel,)开始播放一段语音while((SACMSStatus()x)!=)是否播放完毕,{SACMSServiceLoop()解码并填充队列*PWatchdogClear=x清看门狗}SACMSStop()停止播放BSRInitRecognizer(BSRMIC)初始化识别器}=============================================================语法格式:intTrainWord(intWordID,intSndID)实现功能:训练一条指令参数:WordID指令编码SndID指令提示音索引号返回值:无=============================================================intTrainWord(unsignedintWordID,unsignedintSndID){intResultPlaySnd(SndID,)引导训练播放指令对应动作while(){Result=BSRTrain(WordID,BSRTRAINTWICE)训练两次获得训练结果if(Result==)breakswitch(Result){case:没有检测出声音PlaySnd(SNOVOICE,)returncase:需要训练第二次PlaySnd(SAGAIN,)breakcase:环境太吵PlaySnd(SNOISY,)returncase:数据库满returncase:检测出声音不同PlaySnd(SCMDDIFF,)returncase:序号错误returndefault:break}}return}=============================================================语法格式:voidTrainSD()实现功能:训练函数参数:无返回值:无=============================================================voidTrainSD(){while(TrainWord(NAMEID,SNAME)!=)训练名称while(TrainWord(COMMANDGOID,SACT)!=)训练第个动作while(TrainWord(COMMANDBACKID,SACT)!=)训练第个动作while(TrainWord(COMMANDLEFTID,SACT)!=)训练第个动作while(TrainWord(COMMANDRIGHTID,SACT)!=)训练第个动作}=============================================================语法格式:voidStoreSD()实现功能:存储语音模型函数参数:无返回值:无=============================================================voidStoreSD(){unsignedintulAddr,i,commandID,gRetFFlashWriteWord(xef,xaaaa)FFlashErase(xe)FFlashErase(xe)FFlashErase(xe)ulAddr=xe********for(commandID=xcommandID<xcommandID){gRet=BSRExportSDWord(commandID)while(gRet!=)模型导出成功,gRet=BSRExportSDWord(commandID)for(i=i<i)保存语音模型SD(xexe){FFlashWriteWord(ulAddr,BSRSDModeli)ulAddr=}}}=============================================================语法格式:voidStoreSD()实现功能:装载语音模型函数参数:无返回值:无=============================================================voidLoadSD(){unsignedint*p,k,jk,Ret,gRetp=(int*)xefor(jk=jk<jk){for(k=k<k){Ret=*pBSRSDModelk=Ret装载语音模型p=}gRet=BSRImportSDWord()while(gRet!=)模型装载成功,gRet=BSRImportSDWord()}}=============================================================语法格式:voidGoAhead()实现功能:前进子函数参数:无返回值:无=============================================================voidGoAhead()前进{PlaySnd(SACT,)提示*PIOBData=x前进*PINTMask|=x以下为中断定时操作asm("intfiq,irq")uiTimecont=}=============================================================语法格式:voidBackUp()实现功能:后退子函数参数:无返回值:无=============================================================voidBackUp()倒退{PlaySnd(SDCZY,)提示*PIOBData=x倒退*PINTMask|=x以下为中断定时操作asm("intfiq,irq")uiTimecont=}=============================================================语法格式:voidTurnLeft()实现功能:左转子函数参数:无返回值:无=============================================================voidTurnLeft()左转{PlaySnd(SGJG,)*PIOBData=x右转Delay()延时*PIOBData=x左转*PINTMask|=x以下为中断定时操作asm("intfiq,irq")uiTimecont=}=============================================================语法格式:voidTurnRight()实现功能:右转子函数参数:无返回值:无=============================================================voidTurnRight()右转{PlaySnd(SGJG,)语音提示*PIOBData=x左转Delay()延时*PIOBData=x右转*PINTMask|=x以下为中断定时操作asm("intfiq,irq")uiTimecont=}=============================================================语法格式:voidStop()实现功能:停车子函数参数:无返回值:无=============================================================voidStop()停车{*PIOBData=x停车PlaySnd(SRDY,)语音提示}=============================================================语法格式:voidBSR(void)实现功能:辨识子函数参数:无返回值:无=============================================================voidBSR(void){intResult辨识结果寄存Result=BSRGetResult()获得识别结果if(Result>)有语音触发,{*PIOBData=x临时停车switch(Result){caseNAMEID:c=BSRStopRecognizer()*PSystemClock=x*PINTMask=x识别出名称命令breakcaseCOMMANDGOID:识别出第一条命令GoAhead()执行动作一:直走breakcaseCOMMANDBACKID:识别出第二条命令BackUp()执行动作二:倒车breakcaseCOMMANDLEFTID:识别出第三条命令TurnLeft()执行动作三:左转breakcaseCOMMANDRIGHTID:识别出第四条命令TurnRight()执行动作四:右转breakdefault:break}}}=============================================================语法格式:voidIRQ(void)实现功能:中断服务子函数参数:无返回值:无=============================================================voidDelay(){unsignedintifor(i=i<xffi){*PWatchdogClear=x}}voidDelay(unsignedintm){unsignedintifor(i=i<mi){*PWatchdogClear=x}}voidDelayh(){unsignedintifor(i=i<xi){*PWatchdogClear=x}}voidDelay(){unsignedintifor(i=i<xFfi){*PWatchdogClear=x}}voidDelay(){unsignedintifor(i=i<xDffi){*PWatchdogClear=x}}voidDelay(){unsignedintifor(i=i<xfffi){*PWatchdogClear=x}}voidIRQ(void)attribute((ISR))voidIRQ(void){if(*PINTCtrlx){while(!(*PIOBDatax)){Delayh()if((*PIOBData)x)h}*PINTClear=x}elseif(*PINTCtrlx){m=m*PINTClear=x}}voidIRQ(void)attribute((ISR))voidIRQ(void){if(c==){if(uiTimecont==uiTimeset){*PIOBData=x}*PINTClear=x}elseif(c==){if(*PINTCtrlx){time*PINTClear=x}if(*PINTCtrlx){*PINTClear=xtimesif(times==){h=h*PINTMask=x}}}}=============================================================语法格式:voidplay()实现功能:全程计时播放参数:无返回值:无=============================================================voidplay(void){unsignedints,s,s,sdoublexintlengthPlaySnd(,)PlaySnd(,)if(time==){s=(time)s=(time)}else{s=((time))s=((time))}PlaySnd(s,)PlaySnd(,)PlaySnd(s,)PlaySnd(,)PlaySnd(,)x=m*s=(int)(x)s=(int)(x)s*s=(int)(x)s*s*s=(int)xs*s*s*PlaySnd(s,)PlaySnd(,)PlaySnd(s,)PlaySnd(,)PlaySnd(s,)PlaySnd(s,)PlaySnd(,)PlaySnd(,)x=xtimes=(x)s=(int)(x)s*s=(int)(x)s*s*PlaySnd(s,)PlaySnd(,)PlaySnd(s,)PlaySnd(s,)PlaySnd(,)}=============================================================语法格式:intmain(void)实现功能:主函数参数:无返回值:无=============================================================intmain(void){unsignedintBSFlagTrain标志位unsignedinta,b*PIOADir=xff初始化IOA,IOA~下拉输入*PIOAAttrib=xff*PIOAData=x*PIOBDir=xf初始化IOB,IOB~同向输出*PIOBAttrib=xf*PIOBData=xCh=time=times=m=b=a=c=y=t=BSRDeleteSDGroup()初始化存储器RAMBSFlag=*(unsignedint*)xe读存储单元xeif(BSFlag==xffff)没有经过训练(xe内容为xffff){TrainSD()训练StoreSD()存储训练结果(语音模型)}else经过训练(xe内容为x){LoadSD()语音模型载入识别器}PlaySnd(SSTART,)开始识别提示BSRInitRecognizer(BSRMIC)初始化识别器while(){*PWatchdogClear=xif(c==){BSR()if((*PIOAData)x)是否重新训练{FFlashErase(xe)while()}}elseif(c==)switch(h){case:tem=*PIOBDataxffftemp=tem|x*PIOBData=tempbreakcase:*PINTMask|=xtem=*PIOBDataxffftemp=tem|x*PIOBData=tempbreakcase:tem=*PIOBDataxffftemp=tem|x*PIOBData=tempbreakcase:*PINTMask|=xtem=*PIOBDataxfff*PIOBData=temDelay()temp=tem*PIOBData=temp|xDelay()*PIOBData=tempbreakcase:tem=*PIOBDataxffftemp=tem|x*PIOBData=tempbreakcase:tem=*PIOBDataxffftemp=tem|x*PIOBData=tempbreakcase:tem=*PIOBDataxffftemp=tem|x*PIOBData=tempbreakcase:tem=*PIOBDataxffftemp=tem*PIOBData=temp*PINTCtrl=xCif(a==){*PIOBData=tem|xDelay()*PIOBData=tempa=}breakcase:*PINTMask|=xtem=*PIOBDataxffftemp=tem|x*PIOBData=tempbreakcase:tem=*PIOBDataxffftemp=tem|x*PIOBData=tempbreakcase:tem=*PIOBDataxffftemp=tem|x*PIOBData=tempbreakcase:*PINTMask|=xtem=*PIOBDataxfff*PIOBData=temDelay()temp=tem|x*PIOBData=tempDelay()breakcase:tem=*PIOBDataxffftemp=tem|x*PIOBData=tempbreakcase:tem=*PIOBDataxffftemp=tem|x*PIOBData=tempbreakcase:tem=*PIOBDataxffftemp=tem|x*PIOBData=tempbreakcase:asm("intoff")tem=*PIOBDataxffftemp=tem*PIOBData=tempif(b==){*PIOBData=tem|xDelay()*PIOBData=tempb=}play()PlaySnd(SSTART,)开始识别提示BSRInitRecognizer(BSRMIC)初始化识别器c=asm("intfiq,irq")breakdefault:break}}}voidIRQ(void)attribute((ISR))voidIRQ(void){y=yif(y==){y=*PINTMask=xFFFDh=h}*PINTClear=x

职业精品

精彩专题

上传我的资料

热门资料

资料评价:

/ 61
所需积分:0 立即下载

意见
反馈

返回
顶部

Q