出于嵌入式大赛的需求,要使用JQ8900语音播报模块,这里先用配置较为简单的ESP32来熟悉其功能。
(1)硬件:ESP-WROOM-32开发板一块,JQ8900播报模块一个,喇叭一个,电源适配器一个,杜邦线若干
(2)软件:基于vscode拓展platform,采用arduino框架开发。
各引脚定义:
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音频模块播放曲目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音频文件的方法。