0、结果
说明:向串口发送字符A,播放音效1;向串口发送字符B,播放音效2;向串口发送字符C,暂停播放音乐;向串口发送字符D,恢复播放音乐。
1、外观
说明:虽然8900-16p语音模块形态各异,但是原理和代码都是适用的。
2、连接电脑usb
说明:模块有usb接口,和电脑连接会显示一个U盘,我们需要将播放的文件放到这个U盘里。
将修改好名称的音频文件复制到此U盘中,注意是mp3格式的文件为宜。
3、连线
说明:只需要连接五根线。
- uno————8900-16p语音模块
- 5V--------------DC-5V
- GND--------------GND
- 3--------------VPP
- 喇叭--------------SPK-
- 喇叭--------------SPK+
4、源程序
说明:发送不同的字符可以实现不同的功能,并将对应功能进行函数化,方便移植。
/****************************************8900-16P part****************************************/
/*
接线:
5V------DC-5V
GND------GND
D3------VPP
喇叭------SPK+
喇叭------SPK-
*/
#define vppPin 3 //接vpp引脚
char val = ""; //接收串口发送过来的值
/****************************************set up and loop part*********************************/
void setup() {
Serial.begin(9600); //设置串口波特率为9600
pinMode(vppPin, OUTPUT); //引脚设置成输出
Serial.println("设备上线!");
}
void loop() {
receiveUart();
}
/****************************************8900-16P part****************************************/
/*接收串口发送的数据*/
void receiveUart() {
while (Serial.available() > 0) { //检验在串口缓存区中是否有数据,如果有则返回1,没有就是0.
val = char(Serial.read()); //Serial.read()一位一位的从串口缓存区里读数据
delay(10);
controlRun() ; //串口控制运行
}
}
/*串口控制运行*/
void controlRun() {
if (val == 'A') { //如果输入A,就播放第一首歌
sysRun1();
} else if (val == 'B') { //如果输入B,就播放第二首歌
sysRun2();
} else if (val == 'C') { //如果输入C,就暂停
sysStop();
} else if (val == 'D') { //如果输入D,就恢复播放
sysStart();
}
}
/*发送数据给模块*/
void SendData (char addr ) { //发送函数
digitalWrite(vppPin, HIGH); //开始拉高
delayMicroseconds ( 1000 );
digitalWrite(vppPin, LOW); //开始引导码
delayMicroseconds ( 3200 ); //此处延时最少要大于2ms
for (int i = 0; i < 8; i++ ) { //总共8位数据
digitalWrite(vppPin, HIGH);
if ( addr & 0x01 ) { //3:1表示数据位1,每个位用两个脉冲表示
delayMicroseconds ( 600 );
digitalWrite(vppPin, LOW);
delayMicroseconds ( 200 );
}
else { //1:3表示数据位0 ,每个位用两个脉冲表示
delayMicroseconds (200);
digitalWrite(vppPin, LOW);
delayMicroseconds ( 600 );
}
addr >>= 1;
}
digitalWrite(vppPin, HIGH);
}
/*播放第一首歌*/
void sysRun1() {
//输入控制信号之前,必须要先清除之前的数据
SendData(0x0a); //清空数字
SendData(0x03); //将音量设置为30
SendData(0x00);
SendData(0x0c); //设置音量
//下面是实际的控制信号
SendData(0x0a); //清空数字
SendData(0x01); //对应00001.mp3
SendData(0x0b); //选曲播放,确认的意思
}
/*播放第二首歌*/
void sysRun2() {
//输入控制信号之前,必须要先清除之前的数据
SendData(0x0a); //清空数字
SendData(0x03); //将音量设置为30
SendData(0x00);
SendData(0x0c); //设置音量
SendData(0x0a); //清空数字
SendData(0x02); //对应00002.mp3
SendData(0x0b); //选曲播放,确认的意思
}
/*暂停播放*/
void sysStop() {
//输入控制信号之前,必须要先清除之前的数据
SendData(0x0a); //清空数字
SendData(0x03); //将音量设置为30
SendData(0x00);
SendData(0x0c); //设置音量
SendData(0x0a); //清空数字
SendData(0x12); //暂停的意思
}
/*恢复播放*/
void sysStart() {
//输入控制信号之前,必须要先清除之前的数据
SendData(0x0a); //清空数字
SendData(0x03); //将音量设置为30
SendData(0x00);
SendData(0x0c); //设置音量
SendData(0x0a); //清空数字
SendData(0x11); //恢复播放
}
5、相关指令
6、注意事项
说明:程序在写入指令之前必须要清除指令。当控制信号为播放音乐的时候,可以不发送0x11。最好选取一个功率大一点的喇叭,不然声音很小。改变音量为0x03,应该是最大的音量了。
7、基本原理
8900-16p语音模块是一种常用的语音识别和合成模块,可以与Arduino等微控制器进行通信,实现语音识别、播放、录音等功能。
工作原理方面,8900-16p模块基于数字信号处理技术和语音识别算法,可以识别和分析人类语言中的声音特征,并将其转换为可识别的数字信号。具体来说,8900-16p语音模块通过内置的麦克风或外接的声音传感器,采集用户的语音输入,并经过预处理和去噪等处理后,传输到芯片进行数字信号处理。模块内置了多种语音识别模型,可以对不同声音特征进行匹配和识别,从而判断用户的语音指令并进行相应的响应动作。
另外,8900-16p语音模块还具备语音合成功能,可以通过内置的音源或外接扬声器等播放设备,将预先定义好的文字信息转换为语音信号输出,实现对话交互等功能。
在Arduino中使用8900-16p语音模块,我们需要先将其正确连接到Arduino板上,并编写相应的程序进行控制。通常,可以通过串口通信等方式,将用户输入的语音指令传输到语音模块进行识别,并根据识别结果进行相应的处理和响应。同时,也可以通过编写语音合成程序,将特定的文字信息转换为相应的语音信号,并通过模块输出到外部播放设备进行播放。