ESP32驱动JQ8900语音模块

出于嵌入式大赛的需求,要使用JQ8900语音播报模块,这里先用配置较为简单的ESP32来熟悉其功能。


前言

(1)硬件:ESP-WROOM-32开发板一块,JQ8900播报模块一个,喇叭一个,电源适配器一个,杜邦线若干
(2)软件:基于vscode拓展platform,采用arduino框架开发。

一、JQ8900介绍

示例:pandas 是基于NumPy 的一种工具,该工具是为了解决数据分析任务而创建的。

各引脚定义:
VPP: 单线串口(就是接收脉冲信号的引进)
BUSY: 播放指示灯
RX: 接收段
TX: 发送段
DC-5V: 5v供电
SPK-: 扬声器负极
SPK+: 扬声器正极
IO1~IO7是触发输入口,对地触发,DAC为音频输出。
USB连接到电脑,会有一个盘,把需要的音频放入其中就可以使用。如果想使用IO口对地触发的方式必须按5位数字进行命名,如00001、00002。模块有7个触发IO口,最多支持19段录音。当然,这几个IO口也可以通过配置文>件改变每个IO口的作用。
在这里插入图片描述

音频替换
JQ8900-16P的一个优点是其音频可替换性,用USB线连接电脑与模块,会出现一个新的盘:
在这里插入图片描述
这里的十个MP3文件是出场自配的,如果想要修改,可以自行录制MP3文件,放入该盘,注意,这里文件的名字必须是0000x形式的,这样才可以使用指令来选择不同音频。

二、代码编写

这里我借鉴了CDSN一位大佬的例程,主要使用了他提供的send_DATA函数:

void SendData (char addr )//发送函数
{
    
    
    digitalWrite(pin,HIGH); /*开始拉高*/
    delayMicroseconds ( 1000 );
    digitalWrite(pin,LOW); /*开始引导码*/
    delayMicroseconds ( 3200 );/*此处延时最少要大于2ms*/
    for (int i = 0; i < 8; i++ ) /*总共8位数据  */
    {
    
    
        digitalWrite(pin,HIGH);
        if ( addr & 0x01 ) /*3:1表示数据位1,每个位用两个脉冲表示  */
        {
    
    
            delayMicroseconds ( 600 );
            digitalWrite(pin,LOW);
            delayMicroseconds ( 200 );
        }
        else        /*1:3表示数据位0 ,每个位用两个脉冲表示  */
        {
    
    
            delayMicroseconds (200);
            digitalWrite(pin,LOW);
            delayMicroseconds ( 600 );
        }
        addr >>= 1;
    }
    digitalWrite(pin,HIGH);
}

有了这个函数,便可以利用它并配合JQ8900原生的指令来实现音频选择、音量调节的功能。
音频播放选择规则
在这里插入图片描述
IO口对地触发的方式必须按5位数字进行命名,如00001、00002。模块有7个触发IO口,最多支持19段录音。
播放音频
这里我以播放第一首和第二首音频为例:

void show_number1()
{
    
    
    //设置音量为20
    SendData(0x0a);    //清空数字
    SendData(0x02);    //音量20
    SendData(0x00);
    SendData(0x0c);    //设置音量
    delay(2000);    //延时
    
    //选取曲目1播放
    SendData(0x0a);//清空数字
    SendData(0x01);//曲目数字,对应00001.mp3
    SendData(0x0b);//选曲播放
    delay(2000);
    
    //开始播放
    //SendData(0x11);//开始播放
    //delay(2000);
}

void show_number2()
{
    
    
    //设置音量为20
    SendData(0x0a);    //清空数字
    SendData(0x02);    //音量20
    SendData(0x00);
    SendData(0x0c);    //设置音量
    delay(2000);    //延时
    
    //选取曲目2播放
    SendData(0x0a);//清空数字
    SendData(0x02);//曲目数字,对应00002.mp3
    SendData(0x0b);//选曲播放
    delay(2000);
    
    //开始播放
    //SendData(0x11);//开始播放,这部分可以没有
    //delay(2000);
}

JQ8900内置的指令帮助我们快速配置播放功能:
在这里插入图片描述

解释函数一的具体含义:
用于控制JQ8900音频模块播放曲目1并设置音量为20的函数。具体解释如下:

这四段指令用于设置音量大小,0x0(1~9)可以理解为对选取功能的细化设置,要配合0x0(B-F),具体化功能。
步骤如下: 清空数字->音量20->“设置音量”控制指令。
SendData(0x0a);:发送指令清空音频模块的数字显示屏上的内容。
SendData(0x02);:发送指令设置JQ8900音频模块的音量为20。其中,0x02表示音量大小,可以根据需要进行调整。
SendData(0x00);:发送指令,将音量值写入JQ8900音频模块。
SendData(0x0c);:发送指令设置JQ8900音频模块的音量,将前面设置的音量值生效。

delay(2000);:延时2秒,等待JQ6500音频模块设置音量生效。

SendData(0x0a);:发送指令清空JQ6500音频模块的数字显示屏上的内容。
SendData(0x01);:发送指令选择播放曲目1,对应文件名为00001.mp3。其中,0x01表示曲目编号,可以根据需要进行调整。
SendData(0x0b);:发送指令,让JQ6500音频模块开始播放选择的曲目。

delay(2000);:延时2秒,等待JQ6500音频模块开始播放曲目。

最后两行的代码被注释掉了,是因为这两行是用于让JQ6500音频模块开始播放的,但是由于上面已经发送了播放指令,因此这两行代码可以省略。

另外,如果要选曲目号15播放:
SendData(0x0a);
SendData(0x01);
SendData(0x05);
SendData(0x0b);

主程序
首先将连接JQ8900的VPP接口的引脚设置为输出模式,loop函数里间隔5秒循环播放音频1和音频2.

void setup()
{
    
    
    pinMode(pin,OUTPUT);
    Serial.begin(115200);//设置波特率
    
}
 
void loop()
{
    
    
 show_number1();//播放音频1
 delay(5000);
 show_number2();//播放音频2
 delay(5000);
}

三、硬件连接

ESP32_pin5 <---------------> JQ8900_VPP
ESP32_GND <--------> JQ8900_GND <--------> 电源适配器GND(即三者共地)
JQ8900_DC5V <--------> 电源适配器5V
JQ8900_SPK-/SPK+ <-----------------> 喇叭的on/off口
在这里插入图片描述

总结

借鉴大佬的部分代码,简单的用ESP32驱动JQ8900完成语音播报的功能,后续我将使用STM32F103和ch32v307两款单片机完成更为复杂的音频播放功能,并补充关于自定义MP3音频文件的方法。

猜你喜欢

转载自blog.csdn.net/qq_53092944/article/details/130182708