第十六篇、基于Arduino uno,一线串口通讯控制8900-16p语音模块播放指定音乐、暂停音乐——结果导向

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板上,并编写相应的程序进行控制。通常,可以通过串口通信等方式,将用户输入的语音指令传输到语音模块进行识别,并根据识别结果进行相应的处理和响应。同时,也可以通过编写语音合成程序,将特定的文字信息转换为相应的语音信号,并通过模块输出到外部播放设备进行播放。

  • 3
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值