文章目录
前言
上个月给大家展示了使用ESP-C3-12F来控制WS2812 RGB灯条(安信可ESP32-C3模组阿里云远程控制WS2812RGB灯条(基于ESP-IDF的SDK)),其中的第三节就提到了VB-01 这个模块。因为当时该模块还处于完全保密状态,不允许做过多的介绍。
而本篇博文也不会提到如何对模块做二次开发,只介绍外部MCU如何与VB-01进行通信。
一、VB-01模块介绍
VB-01 是安信可即将上线的一款 离线语音控制模块 ,而且自带单MIC输入和单扬声器输出。用户可以直接把2线的MIC和2线的扬声器接入,不需要附带功放电路和MIC滤波电路,控制命令可由智能AI语音进行解码。
博主自己测试体验来看,误识别的概率还是挺小的,可以说几乎没有。 鉴于还处于保密状态,博主就不展示VB-01的真容了(VB-01不久之后就会安信可官方某宝上架,大家可以关注一下,链接在本文结尾)。为了配合下文,只能给出引脚图。
二、通信串口选择
1.通信串口介绍
VB-01一共给出了三组串口: RX0_5V-TXD0_5V、RXD0_3V3-TXD0_3V3和RXD1-TXD1。其中,RX0_5V-TXD0_5V、RXD0_3V3-TXD0_3V3是共用的UART0,也是MCU的通信接口,。而TXD1和RXD1是UART1 用来下载程序用的。
2.UART0
VB-01和外部MCU通信接口建议使用UART0,默认波特率:38400,也就是图中的: RX0_5V-TXD0_5V、RXD0_3V3-TXD0_3V3。
3.打印信息说明
UART0的打印内容如下:
ASR Result: 你好小薇 //中文在Windows 环境呈 乱码状态
Wakeup:你好小薇 //中文在Windows 环境呈 乱码状态
Send data len:4
Send uart data:0xAA 01 00 BB
ReadmePlay ID: 4
所打印的信息全部以字符串方式打印。
ASR Result: 为是被到的指令
Wakeup: 为唤醒指令 其他指令不会打印这个
Send data len: 发送数据的字节数
Send uart data: 发送的数据
ReadmePlay ID: 播放提示音的ID 号
注:发送的数据和播放提示音通常是一一对应的。
三 、ESP-C3-12F端与VB-01的数据交互
ESP-C3-12F的角色就是外部MCU,目的就是为了更直观展示VB-01的语音识别功能。
1.读取指令并解析控制
从上一节提到的VB-01打印信息可以看出:识别控制有两个方式:
1. 解析VB-01发送的数据:例如:0xAA 01 00 BB;
2. 解析提示音ID号:
这两种方式都是可以的。博主觉得第二种方式更容易一些,并且灵活,而第一种方式解析更加复杂,但也会更加可靠。
选择第二种方式还有一个原因是因为ID号也代表了提示音,而且还是字符串数字,可以使用atoi() 函数直接转换成整型数。 ESP-C3-12F的数据解析代码:
int uartDataHandle(uint8_t *data)
{
uint8_t *temp;
char *TAG = "uartDataHandle";
int ID_NUM = 0;
temp = data;
if (temp != NULL)
{
temp = (uint8_t *)strstr((const char *)temp, "ID:"); //识别“ID:”字符串
if (temp != NULL)
{
temp = (uint8_t *)strstr((const char *)temp, ":");//获取字符串中ID后面的字符串数字
++temp; //跨过冒号 “ : ”
ID_NUM = atoi((const char *)temp); //把字符串ID 转换成整型数
ESP_LOGI(TAG, "Cmd ID:%d", ID_NUM);
goto __RETURN_ID;
}
else
goto __RETURN_ID;
}
else
goto __RETURN_ID;
__RETURN_ID:
return ID_NUM;
}
这样就可以通过不同提示音的ID号做不同的动作。
2.控制VB-01播放提示音
发送播放提示音指令和接收不同,不能发送ID号令VB-01播放提示音。因为VB-01的程序并没有串口接收ID号来播放提示音,它是通过一组4个十六位数据来控制播放的,例如:
unsigned char rcv_uart_buf[RCV_UART_DATA_NUM][RCV_UART_DATA_LEN] =
{
{0xAA, 0x02, 0x00, 0xBB}, //播放提示音 BEEP_00
{0xAA, 0x02, 0x01, 0xBB}, //播放提示音 BEEP_01
{0xAA, 0x02, 0x02, 0xBB}, //播放提示音 BEEP_02
{0xAA, 0x02, 0x03, 0xBB}, //如此类推
{0xAA, 0x02, 0x04, 0xBB},
{0xAA, 0x02, 0x05, 0xBB},
{0xAA, 0x02, 0x06, 0xBB},
{0xAA, 0x02, 0x07, 0xBB},
{0xAA, 0x02, 0x08, 0xBB},
{0xAA, 0x02, 0x09, 0xBB},
{0xAA, 0x02, 0x0A, 0xBB},
所以外部MCU想控制VB-01播放提示音的时候,直接发送4个对应的十六位数据即可,VB-01默认的控制数据和上述的一样。下面是ESP-C3-12F控制VB-01播放提示音的相关代码:
/*控制数组*/
unsigned char beep[][4] = {
{0xAA, 0x02, 0x03, 0xBB}, //开灯
{0xAA, 0x02, 0x04, 0xBB}, //关灯
{0xAA, 0x02, 0x05, 0xBB}, //调成绿色
{0xAA, 0x02, 0x06, 0xBB}, //调成红色
{0xAA, 0x02, 0x07, 0xBB}, //调成蓝色
{0xAA, 0x02, 0x08, 0xBB}, //调成紫色
{0xAA, 0x02, 0x09, 0xBB}, //调成橙色
{0xAA, 0x02, 0x0A, 0xBB}, //开始跑
{0xAA, 0x02, 0x0B, 0xBB}, //停止跑
{0xAA, 0x02, 0x0C, 0xBB}, //提速
{0xAA, 0x02, 0x0D, 0xBB}, //降速
{0xAA, 0x02, 0x0E, 0xBB}, //还在跑
};
//控制代码段
switch (RGB_24Bit)
{
case 0XFF00:
uart_write_bytes(UART_NUM_1, beep[2], sizeof(beep[0]));
break;
case 0xFF0000:
uart_write_bytes(UART_NUM_1, beep[3], sizeof(beep[0]));
break;
case 0xFF:
uart_write_bytes(UART_NUM_1, beep[4], sizeof(beep[0]));
break;
case 0XF05308:
uart_write_bytes(UART_NUM_1, beep[6], sizeof(beep[0]));
break;
case 0X8C0BEE:
uart_write_bytes(UART_NUM_1, beep[5], sizeof(beep[0]));
break;
case 0xFFFFFF:
uart_write_bytes(UART_NUM_1, beep[0], 4); //播放:已经打开灯了
break;
case 0x0:
uart_write_bytes(UART_NUM_1, beep[1], 4); //播放:已经关灯了
break;
default:
break;
}
四、总结
MCU与VB-01的通信其实就只是正常的串口通信,只需要懂得一些字符串操作可以解析数据,并作出控制动作。相信大家,更关注的不是怎么控制播放提示音,而是怎么DIY语音指令,比如让VB-01识别 “小爱同学”,识别“天猫精灵”等指令,或者一些更骚的语音指令。这方面的知识大家就期待一下。演示视频相关会过两天更新到本博文当中。
本文会同步到安信可科技官方博文:
欢迎关注安信可官方博客:https://aithinker.blog.csdn.net/
安信可模组购买连接:安信可科技某宝连接,关注获取第一手资讯