|
0.png (590.06 KB, 下載次數(shù): 220)
下載附件
2016-4-11 23:19 上傳
語(yǔ)音控制小車的主要功能:
- 可以通過(guò)簡(jiǎn)單的I/O操作實(shí)現(xiàn)小車的前進(jìn)、后退、左轉(zhuǎn)、右轉(zhuǎn)功能;
- 配合SPCE061A的語(yǔ)音特色,利用系統(tǒng)的語(yǔ)音播放和語(yǔ)音識(shí)別資源,實(shí)現(xiàn)語(yǔ)音控制的功能;
- 可以在行走過(guò)程中聲控改變小車運(yùn)動(dòng)狀態(tài);
- 在超出語(yǔ)音控制范圍時(shí)能夠自動(dòng)停車。
整個(gè)小車分為三大部分:車體部分、61板、控制板。
車體部分:小車車體主要為兩個(gè)電機(jī)驅(qū)動(dòng)裝置,分前輪(方向)驅(qū)動(dòng)和后輪(動(dòng)力驅(qū)動(dòng))。在車體的下面有一個(gè)可以安裝4節(jié)AA電池的電池盒,整個(gè)小車的電源就是由它來(lái)提供的。在小車的底部有一個(gè)小開(kāi)關(guān),它負(fù)責(zé)控制整個(gè)小車的電源開(kāi)通與關(guān)斷。
61板:61板是小車的核心部分,它負(fù)責(zé)整個(gè)小車控制信號(hào)的產(chǎn)生,以及語(yǔ)音的播放和識(shí)別功能實(shí)現(xiàn)。在不使用小車時(shí)可以將61板從小車上拆下來(lái),61板仍然是完整的,可以用它來(lái)做其它的實(shí)驗(yàn)或開(kāi)發(fā)。
控制板:控制板負(fù)責(zé)將來(lái)自61板的控制信號(hào)轉(zhuǎn)化為能夠驅(qū)動(dòng)電動(dòng)機(jī)的信號(hào)。
電路圖:
0.png (65.67 KB, 下載次數(shù): 190)
下載附件
2016-4-11 23:16 上傳
“61”板實(shí)物圖
1.png (1.16 MB, 下載次數(shù): 198)
下載附件
2016-4-12 00:00 上傳
教程pdf文檔:
1.png (72.18 KB, 下載次數(shù): 191)
下載附件
2016-4-11 23:16 上傳
小車采用語(yǔ)音識(shí)別技術(shù),可通過(guò)語(yǔ)音命令對(duì)其行駛狀態(tài)進(jìn)行控制。
部分源碼預(yù)覽:
- //======================================================
- // The information contained herein is the exclusive property of
- // Sunnnorth Technology Co. And shall not be distributed, reproduced,
- // or disclosed in whole in part without prior written permission.
- // (C) COPYRIGHT 2003 SUNNORTH TECHNOLOGY CO.
- // ALL RIGHTS RESERVED
- // The entire notice above must be reproduced on all authorized copies.
- //========================================================
- //========================================================
- // 工程名稱: Car_Demo
- // 功能描述: 實(shí)現(xiàn)小車的語(yǔ)音控制
- // 涉及的庫(kù): CMacro1016.lib
- // bsrv222SDL.lib
- // sacmv26e.lib
- // 組成文件: main.c
- // Flash.asm, hardware.asm,ISR.asm
- // hardware.h,s480.h, hardware.inc
- // 硬件連接: IOA0-----KEY1
- // IOA1-----KEY2
- // IOA2-----KEY3
- // IOB8-----前進(jìn)
- // IOB9-----倒車
- // IOB10----左拐
- // IOB11----右拐
- // 維護(hù)記錄: 12-12 v1.0
- //========================================================
- #include "s480.h"
- #include "bsrsd.h"
- #define P_IOA_Data (volatile unsigned int *)0x7000
- #define P_IOA_Dir (volatile unsigned int *)0x7002
- #define P_IOA_Attrib (volatile unsigned int *)0x7003
- #define P_IOB_Data (volatile unsigned int *)0x7005
- #define P_IOB_Dir (volatile unsigned int *)0x7007
- #define P_IOB_Attrib (volatile unsigned int *)0x7008
- #define P_TimerA_Data (volatile unsigned int *)0x700A
- #define P_TimerA_Ctrl (volatile unsigned int *)0x700B
- #define P_TimerB_Data (volatile unsigned int *)0x700C
- #define P_TimerB_Ctrl (volatile unsigned int *)0x700D
- #define P_Watchdog_Clear (volatile unsigned int *)0x7012
- #define P_INT_Mask (volatile unsigned int *)0x702D
- #define P_INT_Clear (volatile unsigned int *)0x7011
- #define NAME_ID 0x100
- #define COMMAND_GO_ID 0x101
- #define COMMAND_BACK_ID 0x102
- #define COMMAND_LEFT_ID 0x103
- #define COMMAND_RIGHT_ID 0x104
- #define S_NAME 0 //給我取個(gè)名字吧
- #define S_ACT1 1 //前進(jìn)
- #define S_ACT2 2 //倒車,請(qǐng)注意
- #define S_ACT3 3 //左拐
- #define S_ACT4 4 //右拐
- #define S_RDY 5 //Yeah
- #define S_AGAIN 6 //請(qǐng)?jiān)僬f(shuō)一遍
- #define S_NOVOICE 7 //沒(méi)有聽(tīng)到任何聲音
- #define S_CMDDIFF 8 //說(shuō)什么暗語(yǔ)呀
- #define S_NOISY 8 //說(shuō)什么暗語(yǔ)呀
- #define S_START 9 //準(zhǔn)備就緒,開(kāi)始辨識(shí)
- #define S_GJG 10 //拐就拐
- #define S_DCZY 11 //倒車,請(qǐng)注意
- extern unsigned int BSR_SDModel[100]; //外部變量BSR_SDModel[100],辨識(shí)器自帶
- extern void F_FlashWrite1Word(unsigned int addr,unsigned int Value);
- extern void F_FlashErase(unsigned int sector);
- unsigned int uiTimeset = 3; //運(yùn)行時(shí)間定時(shí),調(diào)整該參數(shù)控制運(yùn)行時(shí)間
- unsigned int uiTimecont; //運(yùn)行時(shí)間計(jì)時(shí)
- //=============================================================
- // 語(yǔ)法格式: void Delay();
- // 實(shí)現(xiàn)功能: 延時(shí)
- // 參數(shù): 無(wú)
- // 返回值: 無(wú)
- //=============================================================
- void Delay()
- {
- unsigned int i;
- for(i=0;i<0x3Fff;i++)
- {
- *P_Watchdog_Clear=0x0001;
- }
- }
- //=============================================================
- // 語(yǔ)法格式: void PlaySnd(unsigned SndIndex,unsigned DAC_Channel);
- // 實(shí)現(xiàn)功能: 語(yǔ)音播放函數(shù)
- // 參數(shù): SndIndex-播放語(yǔ)音資源索引號(hào)
- // DAC_Channel-播放聲道選擇
- // 返回值: 無(wú)
- //=============================================================
- void PlaySnd(unsigned SndIndex,unsigned DAC_Channel)
- {
- BSR_StopRecognizer(); //停止識(shí)別器
- SACM_S480_Initial(1); //初始化為自動(dòng)播放
- SACM_S480_Play(SndIndex, DAC_Channel, 3); //開(kāi)始播放一段語(yǔ)音
- while((SACM_S480_Status()&0x0001)!= 0) //是否播放完畢?
- {
- SACM_S480_ServiceLoop(); //解碼并填充隊(duì)列
- *P_Watchdog_Clear=0x0001; //清看門狗
- }
- SACM_S480_Stop(); //停止播放
- BSR_InitRecognizer(BSR_MIC); //初始化識(shí)別器
- }
- //=============================================================
- // 語(yǔ)法格式: int TrainWord(int WordID,int SndID);
- // 實(shí)現(xiàn)功能: 訓(xùn)練一條指令
- // 參數(shù): WordID-指令編碼
- // SndID-指令提示音索引號(hào)
- // 返回值: 無(wú)
- //=============================================================
- int TrainWord(unsigned int WordID,unsigned int SndID)
- {
- int Result;
- PlaySnd(SndID,3); //引導(dǎo)訓(xùn)練,播放指令對(duì)應(yīng)動(dòng)作
- while(1)
- {
- Result = BSR_Train(WordID,BSR_TRAIN_TWICE); //訓(xùn)練兩次,獲得訓(xùn)練結(jié)果
-
- if(Result==0)break;
- switch(Result)
- {
- case -1: //沒(méi)有檢測(cè)出聲音
- PlaySnd(S_NOVOICE,3);
- return -1;
- case -2: //需要訓(xùn)練第二次
- PlaySnd(S_AGAIN,3);
- break;
- case -3: //環(huán)境太吵
- PlaySnd(S_NOISY,3);
- return -3;
- case -4: //數(shù)據(jù)庫(kù)滿
- return -4;
- case -5: //檢測(cè)出聲音不同
- PlaySnd(S_CMDDIFF,3);
- return -5;
- case -6: //序號(hào)錯(cuò)誤
- return -6;
- default:
- break;
- }
- }
- return 0;
- }
- //=============================================================
- // 語(yǔ)法格式: void TrainSD();
- // 實(shí)現(xiàn)功能: 訓(xùn)練函數(shù)
- // 參數(shù): 無(wú)
- // 返回值: 無(wú)
- //=============================================================
- void TrainSD()
- {
- while(TrainWord(NAME_ID,S_NAME) != 0) ; //訓(xùn)練名稱
- while(TrainWord(COMMAND_GO_ID,S_ACT1) != 0) ; //訓(xùn)練第1個(gè)動(dòng)作
- while(TrainWord(COMMAND_BACK_ID,S_ACT2) != 0) ; //訓(xùn)練第2個(gè)動(dòng)作
- while(TrainWord(COMMAND_LEFT_ID,S_ACT3) != 0) ; //訓(xùn)練第3個(gè)動(dòng)作
- while(TrainWord(COMMAND_RIGHT_ID,S_ACT4) != 0) ; //訓(xùn)練第4個(gè)動(dòng)作
- }
- //=============================================================
- // 語(yǔ)法格式: void StoreSD();
- // 實(shí)現(xiàn)功能: 存儲(chǔ)語(yǔ)音模型函數(shù)
- // 參數(shù): 無(wú)
- // 返回值: 無(wú)
- //=============================================================
- 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;commandID<0x105;commandID++)
- {
- g_Ret=BSR_ExportSDWord(commandID);
- while(g_Ret!=0) //模型導(dǎo)出成功?
- g_Ret=BSR_ExportSDWord(commandID);
- for(i=0;i<100;i++) //保存語(yǔ)音模型SD1(0xe000---0xe063)
- {
- F_FlashWrite1Word(ulAddr,BSR_SDModel[i]);
- ulAddr+=1;
- }
- }
- }
- //=============================================================
- // 語(yǔ)法格式: void StoreSD();
- // 實(shí)現(xiàn)功能: 裝載語(yǔ)音模型函數(shù)
- // 參數(shù): 無(wú)
- // 返回值: 無(wú)
- //=============================================================
- void LoadSD()
- { unsigned int *p,k,jk,Ret,g_Ret;
- p=(int *)0xe000;
- for(jk=0;jk<5;jk++)
- {
- for(k=0;k<100;k++)
- {
- Ret=*p;
- BSR_SDModel[k]=Ret; //裝載語(yǔ)音模型
- p+=1;
- }
- g_Ret=BSR_ImportSDWord();
- while(g_Ret!=0) //模型裝載成功?
- g_Ret=BSR_ImportSDWord();
- }
- }
- //=============================================================
- // 語(yǔ)法格式: void GoAhead();
- // 實(shí)現(xiàn)功能: 前進(jìn)子函數(shù)
- // 參數(shù): 無(wú)
- // 返回值: 無(wú)
- //=============================================================
- void GoAhead() //前進(jìn)
- {
- PlaySnd(S_ACT1,3); //提示
- *P_IOB_Data=0x0100; //前進(jìn)
- *P_INT_Mask |= 0x0004; //以下為中斷定時(shí)操作
- __asm("int fiq,irq");
- uiTimecont = 0;
- }
- //=============================================================
- // 語(yǔ)法格式: void BackUp();
- // 實(shí)現(xiàn)功能: 后退子函數(shù)
- // 參數(shù): 無(wú)
- // 返回值: 無(wú)
- //=============================================================
- void BackUp() //倒退
- {
- PlaySnd(S_DCZY,3); //提示
- *P_IOB_Data=0x0200; //倒退
- *P_INT_Mask |= 0x0004; //以下為中斷定時(shí)操作
- __asm("int fiq,irq");
- uiTimecont = 0;
- }
- //=============================================================
- // 語(yǔ)法格式: void TurnLeft();
- // 實(shí)現(xiàn)功能: 左轉(zhuǎn)子函數(shù)
- // 參數(shù): 無(wú)
- // 返回值: 無(wú)
- //=============================================================
- void TurnLeft() //左轉(zhuǎn)
- {
- PlaySnd(S_GJG,3);
- *P_IOB_Data=0x0900; //右轉(zhuǎn)
- Delay(); //延時(shí)
- *P_IOB_Data=0x0500; //左轉(zhuǎn)
- *P_INT_Mask |= 0x0004; //以下為中斷定時(shí)操作
- __asm("int fiq,irq");
- uiTimecont = 0;
- }
- //=============================================================
- // 語(yǔ)法格式: void TurnRight();
- // 實(shí)現(xiàn)功能: 右轉(zhuǎn)子函數(shù)
- // 參數(shù): 無(wú)
- // 返回值: 無(wú)
- //=============================================================
- void TurnRight() //右轉(zhuǎn)
- {
- PlaySnd(S_GJG,3); //語(yǔ)音提示
- *P_IOB_Data=0x0500; //左轉(zhuǎn)
- Delay(); //延時(shí)
- *P_IOB_Data=0x0900; //右轉(zhuǎn)
- *P_INT_Mask |= 0x0004; //以下為中斷定時(shí)操作
- __asm("int fiq,irq");
- uiTimecont = 0;
- }
- //=============================================================
- // 語(yǔ)法格式: void Stop();
- // 實(shí)現(xiàn)功能: 停車子函數(shù)
- // 參數(shù): 無(wú)
- // 返回值: 無(wú)
- //=============================================================
- void Stop() //停車
- {
- *P_IOB_Data=0x0000; //停車
- PlaySnd(S_RDY,3); //語(yǔ)音提示
- }
- //=============================================================
- // 語(yǔ)法格式: void BSR(void);
- // 實(shí)現(xiàn)功能: 辨識(shí)子函數(shù)
- // 參數(shù): 無(wú)
- // 返回值: 無(wú)
- //=============================================================
- void BSR(void)
- {
- int Result; //辨識(shí)結(jié)果寄存
- Result = BSR_GetResult(); //獲得識(shí)別結(jié)果
- if(Result>0) //有語(yǔ)音觸發(fā)?
- {
- *P_IOB_Data=0x0000; //臨時(shí)停車
- switch(Result)
- {
- case NAME_ID: //識(shí)別出名稱命令
- Stop(); //停車待命
- break;
- case COMMAND_GO_ID: //識(shí)別出第一條命令
- GoAhead(); //執(zhí)行動(dòng)作一:直走
- break;
- case COMMAND_BACK_ID: //識(shí)別出第二條命令
- BackUp(); //執(zhí)行動(dòng)作二:倒車
- break;
- case COMMAND_LEFT_ID: //識(shí)別出第三條命令
- TurnLeft(); //執(zhí)行動(dòng)作三:左轉(zhuǎn)
- break;
- case COMMAND_RIGHT_ID: //識(shí)別出第四條命令
- TurnRight(); //執(zhí)行動(dòng)作四:右轉(zhuǎn)
- break;
- default:
- break;
- }
- }
- }
- //=============================================================
- // 語(yǔ)法格式: void IRQ5(void);
- // 實(shí)現(xiàn)功能: 中斷服務(wù)子函數(shù)
- // 參數(shù): 無(wú)
- // 返回值: 無(wú)
- //=============================================================
- void IRQ5(void)__attribute__((ISR)); //運(yùn)動(dòng)定時(shí)控制
- void IRQ5(void)
- {
- if(uiTimecont++ == uiTimeset)
- {
- *P_IOB_Data = 0x0000;
- }
- *P_INT_Clear = 0x0004;
- }
- //=============================================================
- // 語(yǔ)法格式: int main(void);
- // 實(shí)現(xiàn)功能: 主函數(shù)
- // 參數(shù): 無(wú)
- // 返回值: 無(wú)
- //=============================================================
- int main(void)
- { unsigned int BS_Flag; //Train標(biāo)志位
-
- *P_IOA_Dir=0xff00; //初始化IOA,IOA0~7下拉輸入
- *P_IOA_Attrib=0xff00;
- *P_IOA_Data=0x0000;
-
- *P_IOB_Dir=0x0f00; //初始化IOB,IOB8~11同向輸出
- *P_IOB_Attrib=0x0f00;
- *P_IOB_Data=0x0000;
-
- BSR_DeleteSDGroup(0); //初始化存儲(chǔ)器RAM
- BS_Flag=*(unsigned int *)0xe000; //讀存儲(chǔ)單元0xe000
- if(BS_Flag==0xffff) //沒(méi)有經(jīng)過(guò)訓(xùn)練(0xe000內(nèi)容為0xffff)
- {
- TrainSD(); //訓(xùn)練
- StoreSD(); //存儲(chǔ)訓(xùn)練結(jié)果(語(yǔ)音模型)
- }
- else //經(jīng)過(guò)訓(xùn)練(0xe000內(nèi)容為0x0055)
- {
- LoadSD(); //語(yǔ)音模型載入識(shí)別器
- }
-
- PlaySnd(S_START,3); //開(kāi)始識(shí)別提示
- BSR_InitRecognizer(BSR_MIC); //初始化識(shí)別器
-
- while(1)
- {
- BSR();
- if((*P_IOA_Data)&0x0004) //是否重新訓(xùn)練
- {
- F_FlashErase(0xe000);
- while(1);
- }
- }
- }
復(fù)制代碼
全部代碼下載:
DemoCode.zip
(144.65 KB, 下載次數(shù): 31)
2016-4-11 23:19 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
語(yǔ)音控制小車(迷你型)產(chǎn)品說(shuō)明書&使用說(shuō)明書.zip
(1.24 MB, 下載次數(shù): 36)
2016-4-11 23:20 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
語(yǔ)音控制小車(迷你型)電路原理圖.zip
(73.69 KB, 下載次數(shù): 31)
2016-4-11 23:20 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
|
|