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 口的引出,可与外部单片机进行通
信交互信息亦可控制继电器等设备。
LDV7 语音识别模块开发_第1张图片

3.串口连接图

本模块的串口如下图所示,从下至上的5根针分别为GND、RXD、TXD、5V、3.3V,其中RXD和TXD为实际内部单片机的串口接收和发射端口,故与外部串口设备连接时要注意RXD接TXD的交叉接法。3.3V的口为输出口,可用于外部设备的供电利用,一般未用上直接忽略不用即可。
下图为USB转TTL与语音模块的连接方法,如与其他单片机或者其他设备的连接时注意串口电平需要为5V,与语音模块电平一致,如电平不一致可加入串口电平转换模块否则将导致通信异常甚至损坏设备端口

LDV7 语音识别模块开发_第2张图片

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

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

LDV7 语音识别模块开发_第3张图片

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_ZS	0x2f			//最帅  切记地址用户不要修改

在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 
#include 
#include 
#include 
#include 
#include 
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修改代码
LDV7 语音识别模块开发_第4张图片
编译后重新烧录
在串口工具上验证无误后在重新链接开发板

你可能感兴趣的:(orangePi,Zero2,语音识别,单片机,人工智能,linux)