LD3320语音识别模块二次开发及与树莓派间的通讯
实物图如下:
·
实物图如下:
- 一般这种模块的资料厂家都会给,需要的话可以私信我发邮箱,下面介绍该模块的各种参数。
- 型号:YS-LDV7
- 名称:一体化语音识别模块
- 规格:43*29.7MM
- 供电电压:5V (内部工作电压 3.3V)
- 待机电流:30MA 识别时电流:45MA
- IO 口输出:高电平为 3.3V
- 通信方式:串口通信(5V TTL 电平,不可直接接 RS232、RS485)
- 单片机参数:型号–>STC11L08XE 、flash–>8k、SRAM–>1280、eeprom–>32k
- 识别词条个数:50 句
- 工作温度:-20 至 60℃
- 本模块实际原理为 1 片 STC11 单片机+1 片 LD3320 组合形成的一款语音 识别模块,语音识别部分已写好驱动程序,用于只需要对 STC 单片机进行编 程加入自己的识别语句和控制程序即可,语音识别部分无需理会和做编程处 理。
- 实物连接图
- 模块下载程序需要用到STC-ISP这个软件,本模块的程序下载实际为 STC 单片机的程序下载方法,首先我们需要安装 USB 转 TTL 驱动(如已安装无需再安装),然后接好 USB 转 TTL。按照下图进行选择各个选项。
- 这里使用一个代码阅读器——sourceInsight(需要的私信)
- 首先在源代码(是为了让这些代码产生关联)那里新建一个文件夹,然后进入新建的文件夹然后,复制路径。
- 打开sourceInsight新建一个工程,工程存放的路径就是我们刚才复制的路径(放在这个路径下方便添加和查找代码,注意路径不要有中文)
- 点击ok再点击ok,然后出现下图,这时我们需要将源代码添加到我们新建的工程中,点击源代码所在文件夹(code),然后再点击Add all,点击ok,确定,然后关闭即可。
- 如果右侧已经出现代码结构,则不需要下面的操作,如果没有出现则按下图操作。
- 接下来如果乱码则继续往下走,点击file然后选择Reload Encoding然后选择编码格式为Chinese Simplified(GB2312),然后点击Load即可。
- 还有一种在方法可以永久解决乱码问题,点击Options,然后点击preference,然后点击file,将Default encoding改成SystemDefault(Windows ANSI)或者Chinese Simplified(GB2312)936
- 然后如果想修改代码大小和格式,点击Options下面的File Type Options,选择自己喜欢的字体。
- 那么如何让代码关联起来呢?点击Project选择同步文件Synchrogaze File,同步文件后想要查找某个函数的函数体就很方便了只需要按住Ctrl此时鼠标变为小手,点击即可跳转,现在基本所有的代码编辑软件都带有这个功能。还可以选中你想要查找的目标,然后按住ctrl加斜杠再点击sercher即可在整个工程中查找你选中的目标。
LD3320语音模块代码阅读(以下只是main函数部分代码):
void main(void)
{
uint8 idata nAsrRes;
uint8 i=0;
Led_test();//开机闪烁3次
MCU_init();//单片机本身初始化,开启中断
LD_Reset();//LD3320初始化
UartIni(); //串口初始化,上电后让串口打印东西
nAsrStatus = LD_ASR_NONE; // 初始状态:没有在作ASR
#ifdef TEST //这里的意思是,在代码里有TEST这个宏,下面一段代码参与编译,否则不参与编译
PrintCom("一级口令:小杰\r\n"); /*text.....*/
PrintCom("二级口令:1、代码测试\r\n"); /*text.....*/
PrintCom(" 2、开发板验证\r\n"); /*text.....*/
PrintCom(" 3、开灯\r\n"); /*text.....*/
PrintCom(" 4、关灯\r\n"); /*text.....*/
PrintCom(" 5、北京\r\n"); /*text.....*/
PrintCom(" 6、上海\r\n"); /*text.....*/
PrintCom(" 7、广州\r\n"); /*text.....*/
#endif
while(1)
{
switch(nAsrStatus)
{
case LD_ASR_RUNING:/*表示LD3320正在作ASR识别中*/
case LD_ASR_ERROR: /*表示一次识别流程中LD3320芯片内部出现不正确的状态*/
break;
case LD_ASR_NONE:/* 表示没有在作ASR识别*/
{
nAsrStatus=LD_ASR_RUNING;
if (RunASR()==0) /*启动一次ASR识别流程:ASR初始化,ASR添加关键词语,启动ASR。RunASR运算功能描述:运行ASR识别流程,入口参数:none,返 回 值:asrflag:1->启动成功, 0—>启动失败*/
{
nAsrStatus = LD_ASR_ERROR;
}
break;
}
case LD_ASR_FOUNDOK: /* 一次ASR识别流程结束,去取ASR识别结果*/
{
nAsrRes = LD_GetResult(); /*获取结果*/
User_handle(nAsrRes);//用户执行函数,根据返回值进行串口输出
nAsrStatus = LD_ASR_NONE;//完成一次识别后,将nAsrStatus置为LD_ASR_NONE
break;
}
case LD_ASR_FOUNDZERO:
default:
{
nAsrStatus = LD_ASR_NONE;
break;
}
}// switch
}// while
}
分析完整体的代码,如果只需要指令是在LDChip.c这个文件里面的LD_AsrAddFixed()这个函数里面去修改,主要是下图部分:(注意不要忘记将LDChip.h里面的宏修改一下,还要有要改main.c里面的User_handle()里面的代码)
单片机C语言code是什么作用?
- code的作用是告诉单片机,我定义的数据要存储在ROM(程序存储区)里面,写入后就不能再更改,其实是相当与汇编里面的寻址MOVC(好像是),因为C语言中没办法详细描述存入的是ROM还是RAM(存储器),所以在软件中添加了这一个语句起到代替汇编指令的作用,对应的还有data是存入RAM(存储器)的意思。
- 程序可以简单的分为code(程序)区,和data
(数据)区,code区在运行的时候是不可以更改的,data区放全局变量和临时变量,是要不断的改变的,cpu从code区读取指令,对data区的数据进行运算处理,因此code区存储在什么介质上并不重要,象以前的计算机程序存储在卡片上,code区也可以放在rom里面,也可以放在ram里面,也可以放在flash里面(但是运行速度要慢很多,主要读flash比读ram要费时间),因此一般的做法是要将程序放到flash里面,然后load到
ram里面运行的;DATA区就没有什么选择了,肯定要放在RAM里面,放到rom里面改动不了。
附:
- c51中的存储类型
- code :程序存储区(64KB)
- data :可直接寻址的内部数据存储区(128B)
- idata:不可直接寻址的内部数据存储区(256B)
- bdata:可位寻址内部数据存储区(16B)
- xdata:外部数据存储区(64KB)
- pdata:分页的外部数据存储区
树莓派和电脑之间的串口通信(基于WringPi库,使用时需要包含头文件:#include <wiringSerial.h>):
- 初次使用树莓派串口编程,需要配置。
- 修改 cmdline.txt文件 ,
cd /boot/
,sudo vim cmdline.txt
,删除【】之间的部分dwc_otg.lpm_enable=0 【console=ttyAMA0,115200】 kgdboc=ttyAMA0,115200 console=tty1 root=/dev/mmcblk0p2 rootfstype=ext4 elevator=deadline rootwai
- 修改 inittab文件 ,
cd /etc/
,sudo vim inittab
注释掉最后一行内容:,在前面加上 # 号,我这里没有找到这个文件,查找文件命令可以使用sudo find -name inittab
- sudo reboot 重启
在linux下面一切皆文件,进入到dev这个文件下面,如下图所示(串口就是在下面的那一个文件夹): 其中fb0是显示器、mem是内存、rem是磁盘、input是输入系统的一些设备。
树莓派电脑串口通信代码(树莓派串口一次只能接受8个字节,如果超出8个字节就分多次接收):
#include<stdio.h>
#include<wiringSerial.h>
#include<wiringPi.h>
#include <unistd.h>
#include<stdlib.h>
#include<string.h>
int main()
{
int fd;
int readsize;
char* readbuf;
readbuf=(char*)malloc(128);
wiringPiSetup();//init IO
fd=serialOpen("/dev/ttyAMA0",115200);//open serial,("file adress")
while(1){
memset(readbuf,'\0',128);
//serialPutchar(fd,'h');
//serialPuts(fd,"ello\r\n");
while(serialDataAvail(fd)>0){
memset(readbuf,'\0',128);
readsize=read(fd,readbuf,128);
serialFlush(fd);
printf("read %d,context is %s\n",readsize,readbuf);
}
delay(1000);
//serialClose(fd);
}
return 0;
}
树莓派和LD3320语音模块之间的通信:
- 首先是接线:rxd和trd交叉连接,将语音模块的VCC和GND连接到树莓派,VCC接5V,查看树莓派引脚功能指令:
gpio readall
,read函数在没有数据的时候会阻塞,但是在这里没有阻塞,可能是因为串口底层驱动的设置问题。
#include<stdio.h>
#include<wiringSerial.h>
#include<wiringPi.h>
#include <unistd.h>
#include<stdlib.h>
#include<string.h>
int main()
{
int fd;
int readsize;
char* readbuf;
readbuf=(char*)malloc(8);
wiringPiSetup();//init IO
fd=serialOpen("/dev/ttyAMA0",115200);//open serial,("file adress")
while(1){
while(serialDataAvail(fd)>0){
memset(readbuf,'\0',8);
readsize=read(fd,readbuf,8);
printf("cmd is %s",readbuf);//readbuf里面存放的是语音模块串口发送的指令。
}
}
return 0;
}
更多推荐
已为社区贡献5条内容
所有评论(0)