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;
}
}
}
本文地址:https://blog.csdn.net/HHHSSD/article/details/109272064
上一篇: 使用TLC2543来读取电压