基于LD3320和MSP430語音識(shí)別智能家居設(shè)計(jì)
來21ic潛水了好久,發(fā)現(xiàn)這次的活動(dòng)很給力,我也來分享一下自己正在做的項(xiàng)目。這個(gè)是基于MSP430G2553和LD3320的語音識(shí)別智能家居設(shè)計(jì),是我以前的大學(xué)老師幫我找的項(xiàng)目,感謝王老師。
本文引用地址:http://www.butianyuan.cn/article/200760.htm大家先看下視頻:
h()t()tp://v.youku.com/v_show/id_XNTg2MDUwNjM2.html(去掉括號(hào))
這個(gè)項(xiàng)目現(xiàn)在已近做好的部分包括:
一,電腦軟件部分的上位機(jī)用VB寫的,來實(shí)現(xiàn)圖形界面和反饋。
二,語音識(shí)別部分使用芯片LD3320和STC89LE52,來實(shí)現(xiàn)語音識(shí)別。
三,接收語音識(shí)別碼再和電腦通信使用MSP430G2553作為主機(jī)。
四,MSP430G2553主機(jī)控制NRF24l01模塊與另一塊帶有NRF24l01控制繼電器的MSP430G2553節(jié)點(diǎn)通信。
五,最后就是為了實(shí)現(xiàn)語音控制家電用另一個(gè)MSP430G2553節(jié)點(diǎn)來模擬遙控器,實(shí)現(xiàn)語音控制電視的功能。




硬件部分的話,為了先寫代碼,調(diào)試程序方便就用了2塊LUANCHPAD,一塊做主機(jī)一塊做節(jié)點(diǎn)(各自帶有NRF24l01模塊)。還有一塊LD3320模塊上面帶了一塊STCLE52,通過
STCLE52控制LD3220進(jìn)行語音識(shí)別,再把識(shí)別出來結(jié)果通過串口和LUANCHPAD主機(jī)通信,來實(shí)現(xiàn)語音識(shí)別。最后臨時(shí)用萬用板焊了一塊繼電器來控制燈的開關(guān),還有一塊是
模擬遙控發(fā)射的電路板。LUNCHPAD的電路我看21ic的大家因該不陌生了,NRF24l01模塊因該都用過了,那就說下LD3320實(shí)現(xiàn)語音識(shí)別的電路,這個(gè)芯片主要通過80總線和
STCLE52通信,也可以用SPI通信。這個(gè)芯片只要外接一些電容電阻,還有最重要的麥克風(fēng)就可以了。麥克風(fēng)推薦用電容麥。

最主要和21ic的大家分享一下軟件的實(shí)現(xiàn)了。首先說下上位機(jī)。我在學(xué)校學(xué)過C++,但是由于但是不用功,所以如果要用C++寫個(gè)好的上位機(jī)不是一件容易的事,所以說改用
比較容易的VB來開發(fā)。這個(gè)上位機(jī)主要實(shí)現(xiàn)的功能是串口通信,接收來自單片機(jī)的語音識(shí)別碼和溫度數(shù)據(jù),通過播放動(dòng)畫來實(shí)現(xiàn)互動(dòng)和反饋。這個(gè)上位機(jī)啟動(dòng)是就自動(dòng)檢測
串口,搜索那個(gè)串口是和單片機(jī)連接的。就等待單片機(jī)發(fā)來的命令了,通信協(xié)議是這樣的,如果是語音識(shí)別碼就直接發(fā)過來,如果是溫度數(shù)據(jù)則先發(fā)送一個(gè)數(shù)據(jù)0xea,接
著就發(fā)MSP430G2553內(nèi)部的溫度傳感器測的溫度。例如上位機(jī)收到0xea+0x1a,這就表示收到了測的是溫度數(shù)據(jù)而且溫度是26度,最后根據(jù)溫度來播放動(dòng)畫。
調(diào)用MSComm1控件實(shí)現(xiàn)串口通信的代碼
Private Sub MSComm1_OnComm()
Select Case MSComm1.CommEvent
Case comEvReceive
ax1 = MSComm1.Input
MSComm1.InBufferCount = 0
ax(0) = ax1(0)
If flag_c = 1 Then
rdata(0) = ax(0)
ax(0) = 0
' Text2.Text = rdata(0)
flag_c = 0
End If
If ax(0) = HEA Then
ax(0) = 0
flag_c = 1
End If
MSComm1.InBufferCount = 0
End Select
End Sub
說下LD3320的代碼。由于LD3320是內(nèi)置DSP的芯片,內(nèi)部有語音識(shí)別算法,我只要通過80總線來讀寫寄存器實(shí)現(xiàn)芯片的初始化,再把要識(shí)別的語句通過拼音的字符串寫入芯片,
最多可以實(shí)現(xiàn)50個(gè)語句的識(shí)別。LD3320有兩個(gè)模式,一個(gè)就是口令模式,一個(gè)是普通模式,因?yàn)樵诃h(huán)境里畢竟有噪聲的存在,為了防止噪聲誤觸發(fā)識(shí)別命令,所以選擇口令模式最好,再有先說口令之后識(shí)別
才有效,為了讓知道語音識(shí)別成功與否,加了一個(gè)LED,如果檢測到口令LED就會(huì)亮,如果檢測到口令后再識(shí)別到關(guān)鍵字LED就會(huì)滅。
以下是LD3320的添加關(guān)鍵字部分代碼
uint8 LD_AsrAddFixed()
{
uint8 k, flag;
uint8 nAsrAddLength;
#define DATE_A 17
#define DATE_B 20
uint8 code sRecog[DATE_A][DATE_B] = {
chu yin, //添加語音識(shí)別拼音字符串
ni hao,
wen du,
kai deng,
guan deng,
};
uint8 code pCode[DATE_A] = {
CODE_CMD,
NI_HAO,
WEN_DU,
KAI_DENG,
GUAN_DENG,
};
for (k=0; k
{
if(LD_Check_ASRBusyFlag_b2() == 0)
{
flag = 0;
break;
}
LD_WriteReg(0xc1, pCode[k] );
LD_WriteReg(0xc3, 0 );
LD_WriteReg(0x08, 0x04);
delay(1);
LD_WriteReg(0x08, 0x00);
delay(1);
for (nAsrAddLength=0; nAsrAddLength
{
if (sRecog[k][nAsrAddLength] == 0)
break;
LD_WriteReg(0x5, sRecog[k][nAsrAddLength]);
}
LD_WriteReg(0xb9, nAsrAddLength);
LD_WriteReg(0xb2, 0xff);
LD_WriteReg(0x37, 0x04);
}
return flag;
}
說下主角MSP430G2553作為主機(jī)和節(jié)點(diǎn)。作為主機(jī)的MSP430G2553主要是接受來自STC89LE52的識(shí)別碼和對(duì)這些識(shí)別碼的相應(yīng)處理。例如收到的是
開燈的識(shí)別碼就會(huì)通過NRF24l01發(fā)送到節(jié)點(diǎn),節(jié)點(diǎn)就驅(qū)動(dòng)繼電器來開燈。如果收到的是XX電視臺(tái)的識(shí)別碼,就發(fā)送到另一個(gè)節(jié)點(diǎn)來模擬遙控器實(shí)現(xiàn)
萬能遙控器相關(guān)文章:萬能遙控器代碼
c++相關(guān)文章:c++教程
評(píng)論