600字范文,内容丰富有趣,生活中的好帮手!
600字范文 > LDV7 语音识别模块开发

LDV7 语音识别模块开发

时间:2018-11-14 18:30:03

相关推荐

LDV7 语音识别模块开发

文章目录

1.模块参数2.模块介绍3.串口连接图4.分析原厂代码架构找出修改代码处1. 代码框架分析2.用户需要修改的代码 5.对原厂代码进行修改(二次开发)6.烧录进行测试1.烧录2.测试 7.orangepiZero2驱动LD3320语音模块1.接线2.代码验证

1.模块参数

型号: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℃

2.模块介绍

本模块实际原理为 1 片 STC11 单片机+1 片 LD3320 组合形成的一款语音

识别模块,语音识别部分已写好驱动程序,用于只需要对 STC 单片机进行编

程加入自己的识别语句和控制程序即可,语音识别部分无需理会和做编程处

理。

对此用户只需要在提供的源程序基础上做单片机的编程应用即可,本模

块具备 1 个 5V TTL 串口和 16 个单片机 IO 口的引出,可与外部单片机进行通

信交互信息亦可控制继电器等设备。

3.串口连接图

本模块的串口如下图所示,从下至上的5根针分别为GND、RXD、TXD、5V、3.3V,其中RXD和TXD为实际内部单片机的串口接收和发射端口,故与外部串口设备连接时要注意RXD接TXD的交叉接法。3.3V的口为输出口,可用于外部设备的供电利用,一般未用上直接忽略不用即可。

下图为USB转TTL与语音模块的连接方法,如与其他单片机或者其他设备的连接时注意串口电平需要为5V,与语音模块电平一致,如电平不一致可加入串口电平转换模块否则将导致通信异常甚至损坏设备端口

4.分析原厂代码架构找出修改代码处

1.把代码加入source insight中2.给代码文件建立关联project->Synchronlize Files 点击OK

1. 代码框架分析

void ExtInt0Handler(void) interrupt 0 //终端处理{ProcessInt0();//当LD模块接收到音频信号时,将进入该函数}main(){Led_test();//LEd亮三次MCU_init();//单片机初始化LD_Reset();//lD3320初始化UartIni(); /*串口初始化*/nAsrStatus = LD_ASR_NONE;//初始状态:没有在作ASR识别while(1){RunASR()//启动识别流程 ASR初始化,ASR添加关键词语,启动ASR运算进行识别LD_AsrStart()//ASR初始化LD_AsrAddFixed()//添加关键词 此处用户自己修改LD_AsrRun()//开始ASR识别ProcessInt0();//当LD模块接收到音频信号时,将进入该函数LD_GetResult()//获取识别结果User_handle()//用户执行函数,此处用户自己修改}}

2.用户需要修改的代码

LD_AsrAddFixed()//添加关键词 此处用户自己修改User_handle()//用户执行函数,此处用户自己修改

5.对原厂代码进行修改(二次开发)

为了防止代码被破坏,我们拷贝一份代码,在keil中打开CTR+F搜索要修改的函数

//在main.c中修改void User_handle(uint8 dat){//UARTSendByte(dat);//串口识别码(十六进制)if(0==dat){G0_flag=ENABLE;LED=0;PrintCom("收到\r\n"); /*text.....*/}else if(ENABLE==G0_flag){G0_flag=DISABLE;LED=1;switch(dat) /*对结果执行相关操作,客户可删除Printcom 串口输出语句替换为其他需要控制的代码*/{case CODE_DMCS:/*命令“测试”*///PrintCom("“代码测试”命令识别成功\r\n"); /*text.....*/break;case CODE_KFBYZ: /*命令“全开”*///PrintCom("“开发板验证”命令识别成功\r\n"); /*text.....*/break;case CODE_KD:/*命令“复位”*/PrintCom("open light\r\n"); /*text.....*/break;case CODE_GD:/*命令“复位”*/PrintCom("close light\r\n"); /*text.....*/break;case CODE_BJ:/*命令“复位”*///PrintCom("“北京”命令识别成功\r\n"); /*text.....*/break;case CODE_SH:/*命令“复位”*///PrintCom("“上海”命令识别成功\r\n"); /*text.....*/break;case CODE_ZS:/*命令“复位”*/PrintCom("handsome\r\n"); /*text.....*/break;default:PrintCom("请重新识别发口令\r\n"); /*text.....*/break;}}else {PrintCom("请说出一级口令\r\n"); /*text.....*/}}

在LDCHIP.h中修改

#define CODE_ZS0x2f//最帅 切记地址用户不要修改

在LDCHIP.c中修改

uint8 LD_AsrAddFixed(){uint8 k, flag;uint8 nAsrAddLength;#define DATE_A 50 /*数组二维数值*/#define DATE_B 70/*数组一维数值*/uint8 code sRecog[DATE_A][DATE_B] = {"zhui xi xi",\"kai fa ban yan zheng",\"dai ma ce shi",\"kai deng",\"guan deng",\"bei jing",\"shang hai",\"zui shuai"};/*添加关键词,用户修改*/uint8 code pCode[DATE_A] = {CODE_CMD,\CODE_KFBYZ,\CODE_DMCS,\CODE_KD,\CODE_GD,\CODE_BJ,\CODE_SH,\CODE_ZS};/*添加识别码,用户修改*/flag = 1;for (k=0; k<DATE_A; 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<DATE_B; 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;}

6.烧录进行测试

1.烧录

把修改的代码编译,确定没有错误。

打开STC-ISP串口工具->选择开发板型号(STC11L16XE)->打开程序文件->下载/编程->立刻拔掉GND在立刻接上,让其二次启动

2.测试

打开串口,进行测试

7.orangepiZero2驱动LD3320语音模块

1.接线

用GPIO readall 看到引脚

GND接GND

5v接5v

RX接TX

TX接RX

2.代码验证

#include <stdio.h>#include <stdlib.h>#include <wiringPi.h>#include <string.h>#include <wiringSerial.h>#include <unistd.h>int main(){int fd;char cmd[128] = {'\0'};int nread;wiringPiSetup();//硬件初始化fd = serialOpen("/dev/ttyS5",115200);//打开串口while(1){nread = read(fd,cmd,sizeof(cmd));//直接read会出错,因为串口一次最多只能发送1个字节的数据if(strlen(cmd) == 0){//如果过了一定的时间串口上还是没有信息的话就会打印下面的超时printf("chaoshi\n");continue;}if(strstr(cmd,"open") != NULL){printf("open light\n");}if(strstr(cmd,"close") != NULL){printf("close light\n");}//printf("getData:%dbyte,contex:%s\n",nread,cmd);memset(cmd,'\0',sizeof(cmd)/sizeof(char));//每次读取完指令并执行对应得操作后,把字符串清空一下}return 0;}

注意:orangepiZero2的波特率必须是115200

如果orangepiZero无法驱动LD3320

那么打开keil修改代码

编译后重新烧录

在串口工具上验证无误后在重新链接开发板

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。