基于STM32(F103ZE)的LD3320語音控制系統(tǒng)
暑假快完了也什么成果,就打算做點東西來讓這個暑假充實點。發(fā)現(xiàn)手頭有一個LD3320語音模塊,又剛學C#上位機,就想結(jié)合一個做一個小項目。
第一次寫,多多包含。
我的目的是:可以語音控制一個LED燈 如果有條件就控制明亮度然后在LCD上顯示出來,并且在上位機上也可以顯示當前狀態(tài)和控制LED狀態(tài)。
材料
STM32開發(fā)板(我用的是正點原子的戰(zhàn)艦V3 STM32F103ZET6大家也可以用自己的開發(fā)板做)
LD3320語音模塊
杜邦線
嗯 還需要電腦軟件
keil4 或 keil5 因為下載的例程文件是keil4寫的 而手頭LCD屏的頭文件都是keil5戰(zhàn)艦的 所以兩個都用到了
-VS2017
-串口調(diào)試助手 我用的是XCOME
然后就開始做了。
制作過程
硬件部分
想去找一些關(guān)于LD3320的資料。
我先去淘寶找了這個模塊,發(fā)現(xiàn)有瀏覽了幾家商家之后發(fā)現(xiàn)了資料關(guān)于LD3320的,很完整。附上料地址http://www.waveshare.net/wiki/LD3320_Board
發(fā)現(xiàn)他有keil4已經(jīng)寫好的程序,我就下載下來,然后又找到引腳圖
**雖然已經(jīng)有圖了,但是還要提醒下VCC和GND千萬不要接反了?。?**
這樣硬件部分就連接好了,接下來就是程序和上位機了-
程序部分
拿到例程后發(fā)現(xiàn)他的LED燈的端口不同,改成我們板子的LED
#define LED1_PIN GPIO_Pin_5
#define LED1_GPIO_PORT GPIOB
#define LED1_GPIO_CLK RCC_APB2Periph_GPIOB
#define LED2_PIN GPIO_Pin_5
#define LED2_GPIO_PORT GPIOE
#define LED2_GPIO_CLK RCC_APB2Periph_GPIOE
改之后,看他已經(jīng)寫的指令有哪些,有“流水燈”、“閃爍”、“按鍵觸發(fā)”、“全滅”、“狀態(tài)”這幾個,試試管用不管 看串口部分配置是 115200 的波特率,打開串口調(diào)試工具。
設(shè)置好波特率之后打開串口 按復(fù)位鍵 對著模塊用清晰的普通話講“流水燈” (哈哈 開始說的幾次都沒識別出來 還以為有問題 慢點清晰后成功率明顯提高了。
附圖:
第一部分 嘗試就成功了 接下來就是 修改代碼 加上LCD 在LCD上也可以顯示當時命令和狀態(tài)。
還有就是把發(fā)送給上位機的串口數(shù)據(jù)做好 以便上位機能更好的識別命令和執(zhí)行命令。
找了半天,戰(zhàn)艦V3的LCD就只有正點原子哥寫好的,是用keil5寫的,還是在sys的支持下(因為sys頭文件我在移植到keil4上時就有很多error),所以只能在5上寫了。首先先創(chuàng)個工程把源代碼原封不動的移植到5上,執(zhí)行后結(jié)果正常,然后添加LCD的程序,因為sys頭文件包含了delay、sys、usart所以串口部分也要替換掉,在主函數(shù)里添加頭文件 初始化等函數(shù);
//添加頭文集
#include 'delay.h'
#include 'sys.h'
//主函數(shù)下添加
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
delay_init();
uart_init(115200);
然后試試,也正常。
接下來就是添加LCD程序
//添加頭文件
#include 'lcd.h' LCD_Init();
//主函數(shù)里添加
LCD_Clear(WHITE);
POINT_COLOR=RED;
LCD_ShowString(72,100,200,16,16,'Hello STM32!');
除了在代碼里加這些 還要在工程項目里把lcd的.c文件添加進去 在路含 lcd文件夾
顯示正常 然后我發(fā)現(xiàn)這樣就只能寫英文 不能寫漢字 于是就添加了漢字顯示
//在lcd.c下添加
void LCD_ShowChinese(u16 x,u16 y,u8 num,u8 size,u8 mode)
{
u8 csize;
u8 temp,t1,t;
u16 y0=y;
csize=(2*(size/8+((size%8)?1:0))*(size/2)); //得到字體一個字符對應(yīng)點陣集所占的字節(jié)數(shù)
for(t=0;t if(size==12)temp=chinese_12[num][t]; //調(diào)用1206字體 else if(size==16)temp=chinese_16[num][t]; //調(diào)用1608字體 else if(size==24)temp=chinese_24[num][t]; //調(diào)用2412字體 else return; //沒有字體庫 for(t1=0;t1<8;t1++) { if(temp&0x80)LCD_Fast_DrawPoint(x,y,POINT_COLOR); else if(mode==0)LCD_Fast_DrawPoint(x,y,BACK_COLOR); temp<<=1; y++; if((y-y0)==size) { y=y0; x++; break; } } } } //在lcd.h下添加 void LCD_ShowChinese(u16 x,u16 y,u8 num,u8 size,u8 mode);//在指定位置顯示一個漢字 因為用的時16*16大小的字體 所以在字庫里添加字組時要添加到const unsigned char chinese_16[40][32]里。 //主函數(shù)下添加 LCD_ShowChinese(29,40,5,16,1); //開 LCD_ShowChinese(46,40,6,16,1); //始 LCD_ShowChinese(63,40,7,16,1); //運 LCD_ShowChinese(78,40,8,16,1); //行 LCD_ShowChinese(95,40,9,16,1); //L LCD_ShowChinese(103,40,10,16,1); //D LCD_ShowChinese(111,40,11,16,1); //3 LCD_ShowChinese(119,40,12,16,1); //3 LCD_ShowChinese(127,40,13,16,1); //2 LCD_ShowChinese(135,40,14,16,1); //0 LCD_ShowChinese(143,40,15,16,1); //測 LCD_ShowChinese(160,40,16,16,1); //試 LCD_ShowChinese(177,40,17,16,1); //程 LCD_ShowChinese(194,40,18,16,1); //序 這樣就可以正常顯示漢字了 在LD3320.c里 //在LD_AsrAddFixed函數(shù)中sRecog[DATE_A][DATE_B]數(shù)組里加上你要說的口令的拼音 //比如第二個閃爍 uint8 sRecog[DATE_A][DATE_B] = { 'liu shui deng', 'shan shuo', 'an jian chu fa', 'quan mie', 'zhuang tai' }; //和我的一樣即可 //在pCode[DATE_A]數(shù)組中添加指令,數(shù)組序號要對應(yīng)比如上邊第二個是閃爍,這個數(shù)組中就要相應(yīng)閃爍的函數(shù) //比如第二個ss uint8 pCode[DATE_A] = { CODE_LSD, CODE_SS, CODE_AJCF, CODE_QM, CODE_JT }; //在Board_text函數(shù)中添加相應(yīng)執(zhí)行的函數(shù) //比如第二個Flicker_LED() static void Board_text(uint8 Code_Val) { switch(Code_Val) //???á1??′DD?à1?2ù×÷ { case CODE_LSD: //?üá??°á÷??μ??± Glide_LED(); break; case CODE_SS: //?üá??°éá???± Flicker_LED(); break; case CODE_AJCF: //?üá??°°′?ü′¥·¢?± Key_LED(); break; case CODE_QM: //?üá??°è??e?± Off_LED(); break; case CODE_JT: //?üá??°×′ì??± Jt_LED(); break; default:break; } } //在下邊添加相應(yīng)函數(shù)所要執(zhí)行的動作 //Flicker_LED函數(shù) static void Flicker_LED(void) { LED1_ON(); LED2_ON(); Delayms(0XFFF); LED1_OFF(); LED2_OFF(); Delayms(0XFFF); } 這樣就添加了我們想要的命令了 完美! 接下來就是給上位機寫好數(shù)據(jù) 我們用串口1。除了添加中斷是否接收完成,還要添加們要用指令。 //在usart.c或者stm32f10x_it.c里添加 void USART1_IRQHandler(void) //串口1中斷服務(wù)程序 { u8 Res; int i=0; #if SYSTEM_SUPPORT_OS //如果SYSTEM_SUPPORT_OS為真,則需要支持OS OSIntEnter(); #endif if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET) //接收中斷(接收的數(shù)據(jù)必須是0x0d 0x0a結(jié)尾) { Res =USART_ReceiveData(USART1); //讀取接收到的數(shù)據(jù) if((USART_RX_STA&0x8000)==0)//接受未完成 { if(USART_RX_STA&0x4000)//接收到了0x0d { if(Res!=0x0a)USART_RX_STA=0;//接收錯誤,重新開始 else USART_RX_STA|=0x8000; //接收完成了 if(USART_RX_STA&0x8000) { if(strcmp(USART_RX_BUF,'全亮')==0) {
接下來就是字體取模 我用這個PCtoLCD2002軟件,配置好后,添加我們要用到的字體。
下邊就是我們要的字組,復(fù)制到剛才說的數(shù)組里,在程序中添加 就OK了,還有好多漢字 我就不一一列舉了,方法是一樣的。 注意要把數(shù)字變大足以裝下字組。
然后找到LD3320.c文件下 語識別后要執(zhí)行的部分 添加要顯示的漢字 這樣就做好了。注意:要在顯示之前添加
LCD_ShowString(72,100,200,16,16,' ');這樣顯示其下次的會把上次的覆蓋掉,顯示的就是新的內(nèi)容。 試試添加或修改口令
代碼如下:
上一篇:【調(diào)試記錄】STM32 HAL庫硬件I2C從機Seq DMA方式不定長接收和發(fā)送
下一篇:參照STM32時鐘樹配置STM32CubeMX Clock Configuration(STM32L011G4U6為例)
推薦閱讀最新更新時間:2025-04-24 07:40

設(shè)計資源 培訓 開發(fā)板 精華推薦
- 英飛凌微控制器:以全新實惠套件和強大開發(fā)環(huán)境為開發(fā)者提供支持
- iTOP-i.MX6開發(fā)板設(shè)備數(shù)驅(qū)動Menuconfig的用法
- 迅為IMX6ULL開發(fā)板Qt for Android搭建開發(fā)環(huán)境
- 迅為i.MX8M mini開發(fā)板Windots QT系統(tǒng)開發(fā)環(huán)境搭建
- 迅為IMX8MM開發(fā)板Yocto系統(tǒng)使用Gstarwmra(一)
- 迅為IMX8M mini開發(fā)板Linix系統(tǒng)修改默認屏幕
- iTOP-4412開發(fā)板支持4G以上文件系統(tǒng)擴展
- 迅為IMX8MM開發(fā)板Yocto系統(tǒng)設(shè)置開機自啟動
- 迅為IMX6Q開發(fā)板 Buildroot文件系統(tǒng)mqtt測試
- 熱插拔 Compact PCI 總線
- 用于微功率 A/D 轉(zhuǎn)換器的 LT1634BCMS8-2.5 電壓基準的典型應(yīng)用
- 使用 RECOM Power GmbH 的 RSO-243.3DZ 的參考設(shè)計
- NCP45540 Eco SWITCH 具有低 RON 的高級負載管理控制負載開關(guān)的典型應(yīng)用
- TWR-S12G128: MC9S12G128超可靠的16位塔式系統(tǒng)模塊
- LT1086CM-3.6 受保護大電流燈驅(qū)動器的典型應(yīng)用
- LTC1736 的典型應(yīng)用 - 5 位可調(diào)高效同步降壓型開關(guān)穩(wěn)壓器
- LTC2207-14 演示板,CMOS 輸出,105Msps,14 位 ADC,1MHz
- ADA4062-2BRZ運算放大器用作反相解決方案電路的典型應(yīng)用電路
- AM2G-0512DH30Z ±12V 2 瓦 DC-DC 轉(zhuǎn)換器的典型應(yīng)用
- Vishay 推出的27款600 V標準整流器和60 V - 200 V TMBS?整流器
- 泰克亮相2025 慕尼黑展: 以全棧式解決方案與中國智造同頻共振
- Nordic Semiconductor nRF9151 蜂窩物聯(lián)網(wǎng)模組與日本 IIJ SoftSIM產(chǎn)品相輔相成
- 汽車顯示屏——第2部分:TFT LCD、OLED和micro-LED顯示屏電源技術(shù)
- 車機操作系統(tǒng)自主可控加速!華為、小米和理想,誰是真正的領(lǐng)跑者?
- FOC入門教程
- 如何為工業(yè)物聯(lián)網(wǎng)選擇最節(jié)能的通信方案
- 什么是PID算法?一文帶你深度理解PID算法
- 控制無刷直流電動機以應(yīng)對新挑戰(zhàn)
- 汽車加熱器的工作原理和功能