LD3320语音模块与Wemos的串口通信控制

LD3320语音模块和Arduino的串口通信控制小车的方向

    设计过程

                 (1)连接模块与芯片是 LD3320 ,Aduino的Wemos

                    (2)通信方式为串口通信

                  (3)代码的讲解

     前言

             今天心血来潮想通过LD3320模块以通信的方式来控制小车的方向,当然你们也可用这代码来简单改一下来控制家电 比如电灯,更好的了解物联网的基本操作,多动手去完成一个一个成品或项目,培养研发的乐趣,这才是打开正确的学习方式。

      WeMos D1 的特性

                 1  基于ESP-8266EX

                 2  ARDUINO兼容, 使用RDUINO IDE来编程

                 3  11*I/O引脚

                 4  1 * ADC 引脚(输入范围0  ~ 3.3)

                 5  板载5V  1A  开关电源  (高输入电压24V)

 

      引脚的连接

 

                   LD3320—Arduino
                   3.3V—3.3V
                   TXD—D3
                   RXD—D2
                   GND—GND

                     

 

 

            代码的讲解

                           LD3320模块从淘宝上买的时候,就会有相关的例程代码我们的语音部分的代码可以直接从上面去改,如图我是直接用普通模式的代码来做的。LD3320我们不用了解全部的代码,因为我们改的部分只有3个部分,懂得那3个部分就行,第一个部分是     User_handle(uint8 dat)  用户执行函数     第二部分为   LD_AsrAddFixed()向LD模块添加关键词     第三部分   //识别码客户修改处   如图

 

 

 

 

      

 

 

 

        接下来我先放 LD3320模块的代码

      LD_AsrAddFixed();

/************************************************************************
功能描述: 向LD模块添加关键词
入口参数: none
返 回 值: flag:1->添加成功
其他说明: 用户修改.
					 1、根据如下格式添加拼音关键词,同时注意修改sRecog 和pCode 数组的长度
					 和对应变了k的循环置。拼音串和识别码是一一对应的。
					 2、开发者可以学习"语音识别芯片LD3320高阶秘籍.pdf"中
           关于垃圾词语吸收错误的用法,来提供识别效果。
					 3、”xiao jie “ 为口令,故在每次识别时,必须先发一级口令“小捷”
**************************************************************************/
uint8 LD_AsrAddFixed()
{
	uint8 k, flag;
	uint8 nAsrAddLength;
	#define DATE_A 8   /*数组二维数值*/
	#define DATE_B 20		/*数组一维数值*/
	uint8 code sRecog[DATE_A][DATE_B] = {	   //该部份是你想输入的语音口令的拼音
																				 "xiang qian",\	  
																				 "xiang ho",\
																				 "xiang zuo",\
																				 "xiang you",\
																			};	/*添加关键词,用户修改*/
	uint8 code pCode[DATE_A] = {               //该部分是对应着拼音来写的识别码
															CODE_XQ,\
														
															CODE_HT,\
															CODE_XZ,\
															CODE_XY,\
														 };	/*添加识别码,用户修改*/	
	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;
}

 

       LD_AsrAddFixed();

 

/***********************************************************
* 名    称:用户执行函数 
* 功    能:识别成功后,执行动作可在此进行修改 
* 入口参数: 无 
* 出口参数:无
* 说    明: 通过控制PAx端口的高低电平,从而控制外部继电器的通断					 
**********************************************************/
void 	User_handle(uint8 dat)
{
			 switch(dat)		   /*对结果执行相关操作,客户修改*/
			  {
	                case CODE_XQ:			/*小车向前*/
					UARTSendByte(0x01);   // 向串口发送十六进制的命令
					PrintCom("1\r\n");	  //可在串口助手打印出命令字符
					break;
					case CODE_HT:	 /*小车向后*/
						UARTSendByte(0x10);
						PrintCom("10\r\n");
						break;
					case CODE_XZ:	 /*小车向左*/
						UARTSendByte(0x16);  
						PrintCom("16\r\n");
						break;
					case CODE_XY:	 /*小车向右*/
						UARTSendByte(0x17);  
						PrintCom("17\r\n");
						break;
				}	
}	 

       LDCHIP.H文件中   找到自行修改自己需要的代码


//识别码客户修改处 
#define CODE_XQ 0x01			//向前
#define CODE_HT 0x10			//向后
#define CODE_XZ 0x16			//向左
#define CODE_XY 0x17			//向右

 

 

       接下来是Arduino 的代码(该段代码为接收语音模块的串口信号代码,语音模块每接收到一个指令,Wemos芯片的对应引脚就会产生相应的电平变化,我们可以利用这变化来设置相应的引脚中断,因为想到大伙不一定做小车,因此我只发了这段代码给大伙去开发,大家调试时可以用LED灯,或蜂鸣器去调试相应的引脚,当然有也可以用示波器)

 

 


#include<SoftwareSerial.h>    //需要调用这个库实现串口通信

void setup() {
 pinMode(D3,OUTPUT);        //设置IO口D3为输出模式
 pinMode(D4,OUTPUT);        //设置IO口D4为输出模式
  Serial.begin(9600);
  digitalWrite(D2,LOW);     //给D2口低电平
    digitalWrite(D3,LOW);     //给D3口低电平
  delay(3000);

}

void loop() {
  int cmd;



  if(Serial.available() > 0){
      cmd = Serial.read();
      switch(cmd)
        {
          case 1:          //前面提到的读取到1表示向前
            digitalWrite(D3,HIGH);//当喊“向前”时,可以看到Arduino上的D3会置高
            break;
          case 10:
            digitalWrite(D3,LOW);//当喊“向前”时,可以看到Arduino上的D3会置低
            break;
           
             break;
          case 0x16:
            digitalWrite(D4,HIGH);//当喊“向前”时,可以看到Arduino上的D4会置高
            break;
          case 0x17:
            digitalWrite(D4,LOW);//当喊“向前”时,可以看到Arduino上的D4会置低
            break;
           default:
            break;
        }
          
    
    }

}

 

猜你喜欢

转载自blog.csdn.net/HHHSSD/article/details/109272064