一、前言
这一部分暂时是用STM32F1单片机进行测试的,在STM32上测试完成后,即可移植到ESP32,非常方便,目前可以实现语音交互。用的模块是LD3320语音识别模块(串口版)+JQ8900(语音播报模块)。
二、接线方式
下图是LD3320,JQ8900,STM32三者之间的接线图。
- LD3320只起发送作用,所以LD3320的TXD(发送端)接至STM32单片机的RXD(接收端),LD3320的RXD(接收端)不用接线,浮空即可。
- JQ8900只起接收作用,所以JQ8900的RXD(接收端)接至STM32单片机的TXD(发送端),JQ8900的TXD(发送端)不用接线,浮空。
- STM32我用的是串口1,PA9是TXD(发送端),PA10是RXD(接收端);
三、实现过程
1、LD3320的使用
串口版的就是将一个51单片机集成到语音模块上,将识别到的语音通过串口发送到其他带有串口功能的设备上。
1.1、模块测试
拿到模块后,我们首先将它和USB转TTL模块连接起来,测试模块是否正常运行,具体测试方法如下
- LD3320和USB转TTL模块进行连接后接入电脑
- 打开资料中的串口助手,其他串口助手也可以。配置如下图
- 通过程序中设定的词条进行呼叫,可以在串口助手中看到模块返回的信息,我们可以根据这些信息,进行相应的操作。
1.2、自定义词条
我们可以自定义呼叫的内容词条。
词条可以在资料程序中的LDChip.c文件中的第275行进行修改、添加、删除,这里面的词条都是用的拼音,比如 我们想设置 打开厨房灯 的词条,那么就可以直接将其拼音输入,中间用空格隔开。
da kai chu fang deng
1.3、自定义串口发送内容
LD3320串口发送的内容非常重要,关乎到我们整个系统的控制,因此,我们要重视
这里面改的也很简单,在程序main.c文件中的221行,可以自行修改发送的内容,建议数字或者是英文,尽量不要发送中文。PrintCom("@5\r\n"); 我们可以直接修改其中的内容
1.4、将修改好的程序下载到LD3320
配置好stc-isp后即可下载,详细步骤模块资料中有介绍
1.5、测试
将以上的步骤修改好之后,可以进行测试,我们将模块与STM32单片机的串口1进行连接,在STM32上下载串口实验的程序,我们即可收到数据,如下图,第一个图是通过调试器我们看到的数据,第二个图是串口上打印的数据,若此时收到的数据与上面修改过的串口发送的内容一致,那么我们就可以开始使用这个模块了。
1.6、总结
LD3320模块修改完成,我们可以连接JQ8900进行播报了。
注意!如果1.5测试的时候,串口收到的数据一直是0,或者收不到数据,那么检查一下STM32程序和LD3320模块程序中,两个程序的波特率是否一致,建议将STM32程序中的波特率设置为9600。
2、JQ8900的使用
此模块资料中有详细介绍,且使用简单,就不做过多描述,只需注意合成语音是的命名正确即可。
四、测试
将JQ8900资料中的JQ8x00.c和.h文件移植到STM32的串口实验中,然后调用这个函数即可。函数第二个参数对应合成语音时候的名称,2代表02。
JQ8x00_Command_Data(AppointTrack,2)
main.c
#include "delay.h"
#include "sys.h"
#include "usart.h"
#include "JQ8X00.h"
#include "led.h"
int main(void)
{
u16 t;
u16 len;
u16 times=0;
delay_init(); //延时函数初始化
JQ8x00_Init();
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //设置NVIC中断分组2:2位抢占优先级,2位响应优先级
uart_init(9600); //串口初始化为115200
LED_Init();
JQ8x00_Command_Data(SetVolume,30); //设置音量
while(1)
{
if(USART_RX_STA&0x8000)
{
switch(USART_RX_BUF[1])
{
case '2':JQ8x00_Command_Data(AppointTrack,2);break; //播放曲目2
case '3':JQ8x00_Command_Data(AppointTrack,3);break;
case '4':JQ8x00_Command_Data(AppointTrack,4);break;
case '5':JQ8x00_Command_Data(AppointTrack,5);break;
case '6':JQ8x00_Command_Data(AppointTrack,6);break;
case '7':JQ8x00_Command_Data(AppointTrack,7);break;
case '8':JQ8x00_Command_Data(AppointTrack,8);break;
case '9':JQ8x00_Command_Data(AppointTrack,9);break;
case 'a':JQ8x00_Command_Data(AppointTrack,10);break;
case 'b':JQ8x00_Command_Data(AppointTrack,11);break;
case 'c':JQ8x00_Command_Data(AppointTrack,12);break;
case 'd':JQ8x00_Command_Data(AppointTrack,13);break;
}
USART_RX_STA=0;
}
}
}
到目前语音交互功能已经完成,下面一篇是在ESP32是上实现,篇幅应该不长。在这里我会上传两个模块的资料和我修改过的程序