STM32與LD3320語音識別模塊串口交互,實現語音控制繼電器

2021-02-23 電子芯吧客
實現目標
LD3320模塊將識別結果通過串口發送至STM32;

我們繼續在上文口令模式的Demo示例程序基礎上,實現本文的目標。
上文連結如下:

語音識別LD3320模塊控制LED和舵機

改造STC工程將識別結果以JSON字符串的形式輸出

只留五句PrintCom串口輸出,對應五個命令:

JSON字符串含義{"VoiceCommandCode":0}喚醒詞{"VoiceCommandCode":1}開燈{"VoiceCommandCode":2}關燈{"VoiceCommandCode":3}開門{"VoiceCommandCode":4}關門

cJSON相關知識參考閱讀:
Keil環境下STM32工程加入cJSON
用cJSON解析心知天氣返回的數據包

編譯程序並下載程序至LD3320模塊中

程序編譯沒有錯誤之後,將編譯結果下載至LD3320模塊中驗證程序是否正確。

LD3320串口輸出測試

測試四個口令,查看串口輸出的字符串是否符合預期。

由上可以看出,四個指令跟咱們預先設定的值是一致的,將LD3320模塊與STM32的串口相連,然後STM32對接收到的串口數據進行解析,進而做不同的動作即可,至此LD3320端的開發完畢。

STC單片機更新程序的方法參考網文:

STC單片機開發環境建立及更新LD3320模塊程序

修改STM32工程硬體連接

LD3320模塊與STM32F103的串口4相連,具體原理圖如下圖所示:

初始化串口4

因為LD3320模塊使用的波特率為9600,所以串口4也要初始化為波特率9600,串口初始化調用的代碼如下:

uart4_init(9600); 

USART4_RX_STA=0;  
memset(USART4_RX_BUF, 0, sizeof(USART4_RX_BUF)); 

串口初始化代碼中添加了TIM4的初始化代碼,設置的定時器時間為10ms,串口4的初始化詳細代碼如下:

//初始化串口4
//bound:波特率
void uart4_init(u32 bound){
 //GPIO埠設置
 GPIO_InitTypeDef GPIO_InitStructure;
 USART_InitTypeDef USART_InitStructure;
 NVIC_InitTypeDef NVIC_InitStructure;
 
 RCC_APB1PeriphClockCmd(RCC_APB1Periph_UART4, ENABLE);
 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE); //使能USART4,GPIOC時鐘
  USART_DeInit(UART4);  //復位串口4
  //USART4_TX   PC.10
 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; //PC10
 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //復用推輓輸出
 GPIO_Init(GPIOC, &GPIO_InitStructure); //初始化PC10
   
 //USART4_RX   PC.11
 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;
 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//浮空輸入
 GPIO_Init(GPIOC, &GPIO_InitStructure);  //初始化PC11

 //USART 初始化設置
 USART_InitStructure.USART_BaudRate = bound;//一般設置為9600;
 USART_InitStructure.USART_WordLength = USART_WordLength_8b;//字長為8位數據格式
 USART_InitStructure.USART_StopBits = USART_StopBits_1;//一個停止位
 USART_InitStructure.USART_Parity = USART_Parity_No;//無奇偶校驗位
 USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//無硬體數據流控制
 USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; //收發模式
 USART_Init(UART4, &USART_InitStructure); //初始化串口
 
#if EN_USART4_RX    //如果使能了接收  
 //Usart4 NVIC 配置
 NVIC_InitStructure.NVIC_IRQChannel = UART4_IRQn;  //中斷號
 NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=1 ;//搶佔優先級3
 NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;  //子優先級3
 NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;   //IRQ通道使能
 NVIC_Init(&NVIC_InitStructure); //根據指定的參數初始化VIC寄存器
   
 USART_ITConfig(UART4, USART_IT_RXNE, ENABLE);//開啟中斷
#endif

 USART_Cmd(UART4, ENABLE);                    //使能串口 
 
 TIM4_Int_Init(99,7199);          //10ms中斷
 USART4_RX_STA=0;          //清零
 TIM_Cmd(TIM4,DISABLE);   //關閉定時器4
}

接收來自於LD3320的串口數據
void UART4_IRQHandler(void)
{
 u8 res;   
   
 if(USART_GetITStatus(UART4, USART_IT_RXNE) != RESET)//接收到數據
 {  
  res =USART_ReceiveData(UART4);   
  if((USART4_RX_STA&(1<<15))==0)//接收完的一批數據,還沒有被處理,則不再接收其他數據
  { 
   if(USART4_RX_STA<USART4_REC_LEN) //還可以接收數據
   {
    TIM_SetCounter(TIM4,0);   //計數器清空              //計數器清空
    if(USART4_RX_STA==0)     //使能定時器4的中斷 
    {
     TIM_Cmd(TIM4,ENABLE);   //使能定時器4
    }
    USART4_RX_BUF[USART4_RX_STA++]=res; //記錄接收到的值  
   }
   else 
   {
    USART4_RX_STA|=1<<15;    //強制標記接收完成
   } 
  }
 }                   
}

從接收到第一個字符開始啟動定時器,當收到一個新字符的時候,計數器清空,直到定時器中斷產生時,即計時到10ms時間之後,如果不再收到新的串口數據,證明一個完整的數據包接收完畢,在TIM4的中斷函數中,對串口4是否接收完成數據的變量USART4_RX_STA進行標記,代表數據接收完畢。

//定時器4中斷服務程序      
void TIM4_IRQHandler(void)
{  
 if (TIM_GetITStatus(TIM4, TIM_IT_Update) != RESET)//是更新中斷
 {        
  USART4_RX_STA|=1<<15; //標記接收完成
  TIM_ClearITPendingBit(TIM4, TIM_IT_Update  );  //清除TIM4更新中斷標誌    
  TIM_Cmd(TIM4, DISABLE);  //關閉TIM4 
 }     
}

使用cJSON解析收到的串口數據並動作
//LD3320
if(USART4_RX_STA&0x8000)

 uart4Len=USART4_RX_STA&0x3f;                  //得到此次接收到的數據長度   

 receive_json = cJSON_Parse(USART4_RX_BUF);   //創建JSON解析對象,返回JSON格式是否正確
 if (!receive_json)
 {
  printf("JSON格式錯誤:%s \r\n", cJSON_GetErrorPtr()); //輸出json格式錯誤信息
 }
 else
 {
  item_obj = receive_json->child; 
  
  while(item_obj)
  {
   char * string = item_obj->string;
   
   if(!strcmp(string,"VoiceCommandCode"))
   {
    if(item_obj->valueint==0)
    {
     printf("收到一級口令 小哈 ... \r\n"); 
    }
    else if(item_obj->valueint==1)
    {
     printf("「開燈」命令識別成功 \r\n");
     RelayControl(1);
     
    }
    else if(item_obj->valueint==2)
    {
     printf("「關燈」命令識別成功\r\n");
     RelayControl(0);       
    }
    else if(item_obj->valueint==3)
    {
     printf("「開門」命令識別成功\r\n");
     
    }
    else if(item_obj->valueint==4)
    {
     printf("「關門」命令識別成功\r\n");
     
    }
   }
   
   item_obj = item_obj->next;
  }
  
 }
 
 cJSON_Delete(receive_json);  
 
 USART4_RX_STA=0;   
 memset(USART4_RX_BUF, 0, sizeof(USART4_RX_BUF));            //清空數組  
}

總結

本文實現的方法和使用LD3320直接控制設備的方法相比,利用串口使STM32和LD3320模塊進行數據通信的優勢是:傳統設備,只需要預留一個串口,就可以為傳統設備添加語音控制功能。主控制板無需大的改動即可升級完畢,而且這種方式更靈活,也可以將項目轉移到自己熟悉的領域(假如不熟悉STC單片機,熟悉STM32的話),降低了開發難度。

結果展示

相關焦點

  • LD3320結合MP3模塊加入語音交互功能,實現人和機器交流對話
    今天教大家給LD3320語音識別模塊加上語音交互的功能。上節課已經教大家將LD3320語音識別模塊使用起來了,但是使用的時候是我們單方面說出命令,機器識別後並沒有給我們一些視覺上或者聽覺上的應答反饋,總覺得缺少點什麼,所以今天我就教大家給語音識別模塊加上語音交互的功能,我們問一句,模塊答一句,這樣多有意思,這也使得這個機器更加人性化,實用性更強。
  • 語音識別LD3320模塊控制LED和舵機
    舵機的控制參考閱讀:SG90舵機驅動原理和實現我們繼續在官方提供的口令模式的Demo示例程序基礎上,實現本文的目標。添加「開門」和「關門」的識別結果處理。在編譯程序並下載程序至LD3320模塊中程序編譯沒有錯誤之後,將編譯結果下載至LD3320模塊中驗證程序是否正確。
  • 國產離線語音識別晶片哪家強?未來誰才是語音識別晶片NO.1
    語音識別晶片/模塊: 1)語音識別晶片/模塊GM11A550 2)高端語音識別晶片/模塊WS117--最多支持1000條詞條識別 3)特定人語音識別(SD)晶片WS-100 廣州九芯電子科技有限公司 總部:廣州 簡介:專注於語音技術研究、語音產品方案設計及控制等軟、硬體設計的高新技術公司
  • ...410c實現科大訊飛麥克風陣列模塊的語音喚醒控制及US-100超聲波...
    前言:本文主要是針對沒有接觸過Dragonboard 410c開發板的朋友,教大家如何從裸板搭建平臺以及通過這個平臺如何去實現科大訊飛麥克風陣列模塊的語音喚醒控制以及US-100超聲波的實際應用,總而言之通過這個過程我相信大家可以更進一步的體驗到Dragonboard 410c開發板的樂趣了。
  • 門禁當中加入語音識別和rfid會有怎樣的不同
    ASR技術在「能聽會說」的智能計算機系統中扮演著重要角色,相當於給計算機系統安裝上「耳朵」使其具備,「能聽」的功能,從而實現資訊時代利用「語音」這一最自然、最便捷的手段進行人機通 信和交互。將RFID技術和ASR技術運用到門禁系統,能使門禁系統更加安全、人性化和智能化。 1.總體結構設計 圖 1 為系統總體的硬體結構框圖。
  • 科技離線語音交互方案識別一秒鐘線下十年功
    這時給這些智能產品使用離線語音交互方案顯得十分必要。(智能語音交互)識別一秒鐘,線下十年功離線語音交互方案是種無需WIFI、無需APP,直接用晶片本地指令集對產品進行操控的語音識別技術。使用簡單方便,老人小孩皆能無障礙使用。
  • 語音識別的痛點在哪,從交互到精準識別如何做? | 雷鋒網公開課
    語音識別是目前應用最成熟的人機互動方式,從最初大家體驗過的有屏手持設備這種近場的語音識別,如Siri以及各種語音助手,到現在,語音識別的應用已經完成了向智能硬體以及機器人上延伸,不過,新的人機互動對硬體、算法要求更加苛刻,各企業正面臨著巨大的挑戰。
  • AAAI 2020 | 中科院自動化所:通過識別和翻譯交互打造更優的語音...
    近年來,隨著人工智慧技術在語音、翻譯等相關領域的蓬勃發展,語音翻譯技術逐漸成為學術界和企業界競相研究的熱點。當前的語音翻譯系統通常由語音識別、機器翻譯和語音合成等多個模塊串聯組成,方法簡單,但面臨著噪聲容錯、斷句標點、時間延遲等一系列技術難題。
  • stm32 freertos 之串口中斷
    項目(二) —— 車燈測試臺架 需求:(1)、點燈控制器:在線節拍,離線節拍;(2)、PWM控制盒:在線PWM,離線PWM;(3)、電流測試模塊:檢測車燈電流校準係數;方案:點燈控制器:STM32 + CAN + GPIO節拍:比如亮多長時間,滅多長時間;大節拍中嵌套多個小節拍,每個燈對應相同或者不同的節拍。
  • AAAI 2020|中科院自動化所:通過識別和翻譯交互打造更優的語音翻譯...
    近年來,隨著人工智慧技術在語音、翻譯等相關領域的蓬勃發展,語音翻譯技術逐漸成為學術界和企業界競相研究的熱點。當前的語音翻譯系統通常由語音識別、機器翻譯和語音合成等多個模塊串聯組成,方法簡單,但面臨著噪聲容錯、斷句標點、時間延遲等一系列技術難題。
  • 語音交互丨要把語音搜索放APP,攏共分幾步?
    ,我們總結了語音搜索嵌入APP的幾步走——喚醒、輸入、識別、執行,探索傳統界面交互方式如何融合、甚至是遷移至語音交互等未來的交互方式。這篇文章我從入口、喚醒方式、頁面層級方式來分析喚醒階段的設計。語音交互有著解放雙手雙眼、高效、自然、學習成本低等優勢,正被越來越多地應用到面向普通用戶的產品和服務中。但由於準確率、用戶的使用習慣等的限制,視覺界面需要實時配合,提供一定的引導提示與反饋,以保證語音交互的易學性、可用性,保證用戶使用過程中有控制感和信任感、體驗良好。
  • 基於人體動作識別與語音識別的舞蹈機器人
    基於人體動作識別與語音識別的舞蹈機器人 —— ——2008年英特爾杯大學生電子設計競賽嵌入式系統專題邀請賽作品簡介 作者:鄧磊,薛源海,代明月,吳瓊之 北京理工大學時間:2008-11-10來源:電子產品世界收藏
  • 語音識別技術
    什麼叫自然語音交互,為什麼喚醒詞都需要四個字以上,為什麼方言也能識別,喚醒詞和後面的語音識別有什麼區別,這期的內容給你精彩答案。比如當車載沒有4G網絡的時候,語音交互依舊可以控制車機的一些簡單操作。邊緣計算的好處是響應速度快。
  • 關於語音交互,你不得不知的技術知識
    語音交互的系統構成語音交互面臨的困難自然語言處理的關鍵技術具體場景語音交互實現的技術原理一、語音交互的構成語音交互一般包括三個模塊:語音識別 ASR(Automatic Speech Recognition),主要工作是將聲音信息轉化為文字。
  • 語音識別技術簡史
    最後,attention 模塊的輸出傳遞給 Decoder,生成一系列假設詞的概率分布,類似於傳統的語言模型。端到端技術的突破,不再需要 HMM 來描述音素內部狀態的變化,而是將語音識別的所有模塊統一成神經網絡模型,使語音識別朝著更簡單、更高效、更準確的方向發展。
  • 領先語音體驗,探析博泰車聯網擎AI語音技術
    同時在基礎語音技術模塊,擎AI還可以根據使用場景選擇最好的技術供應商,保證技術領先性的同時通過組合使用可動態圖插拔和替換技術,保證良好的產品體驗,領先於單一技術供應商。 以常見的車噪場景為例,在噪聲影響下,語音識別的準確度勢必會受到明顯影響,採用常規識別方式識別語音交互流程存在加大困難。
  • 還在嘲笑羅永浩看好語音交互?百度發力,語音輸入效率再提升
    錘子科技打造的桌面系統有一個重要的交互標誌——語音交互,即便是操作電子表格這樣的數據文件,羅永浩也主推通過語音的方式進行相關文件數據處理操作,雖然最終有了「吵到我用TNT了」的調侃,但可見羅永浩在人機互動方面還是力推語音交互的,同時現在智能音箱的快速普及似乎也印證著「語音交互」是未來重要的交互方式。
  • 一顆晶片解決所有語音交互,百度做了一項改變行業的技術革新
    AI 科技評論對其背後技術做了詳細分析,認為這主要得益於在他們在語音交互方面提出的兩大「端到端一體化」創新,1)在軟體層面。目前智能音箱領域流行的語音交互方案為:先語音增強,後語音識別。這種過程把語音交互分割成了兩個獨立的過程,在優化過程中往往目標不一致。
  • 語音交互:從語音喚醒(KWS)聊起
    而語音喚醒就成功的避開了這個問題,在只有用戶叫名字的時候工作,其他時間休眠。其實到底是否需要語音喚醒這個能力,也是看場景的,有些廉價的玩具,就是通過按住按鈕進行語音交互的。二、語音喚醒的應用有哪些語音喚醒目前的應用範圍比較窄,主要是應用在語音交互的設備上面,用來解決不方便觸摸,但是又需要交互的場景。
  • 谷歌開源語音命令數據集 搭建基礎的語音交互
    谷歌的工程師們經常被問到這麼個問題:怎麼上手用深度學習做語音識別或其它音頻識別,比如關鍵詞或指令?雖然,現在出現了些很優秀的開源語音識別系統,比如 Kaldi,就能把神經網絡作為其中的一個模塊。但其高度複雜性,讓它們並不適合作為解決簡單任務的指南。