概 述

DFRduino Player语音播放模块的设计初衷是为了让您的机器人会说话。如果机器人能与人进行简单的交流的话,那么机器人就会显的更加智能,同时也增加了不少可玩性。

模块具有立体声输出,可与有源音箱连接;2路功放输出,每路最大3W,可直接接喇叭;支持两种通讯模式,I2C模式和TTL串口模式,方便与各种Arduino、单片机以及电脑连接。

通过一个ATMEGA168芯片进行处理,尽量不占用Arduino或其他控制器上的资源,只需要将语音文件放置在SD卡中,Arduino或其他控制器通过通讯发送文件名信息即可播放相应的语音文件。

性能描述

1.电压:+5V

2.工作电流:大于200mA(带负载时)

3.功放输出功率:每路最大3W,可直接接喇叭

4.接口:TTL串口和I2C(通过跳线切换),1个单声道/立体声切换跳线

5.支持格式:.WAV、.MP3、.MIDI 这三种文件格式

6.模块I2C地址:0x35

7.串口通信波特率:19200bps,格式8 N 1

8.模块尺寸:45 X 33mm

9.模块重量:30g

引脚定义

<File:DFRduino> Player_1.jpg

模块通讯协议

串口模式,波特率19200bps,格式8N1;I2C模式,模块地址0x35。

通讯指令使用字符串形式,\r\n表示回车换行符。

使用串口模式时,才会有返回值,返回值为字符串形式;I2C模式无返回值。

功能名称 指令 返回值 备注
暂停播放 \\:p\r\n 成功返回pause\r\n \r\n表示回车换行符
继续播放 \\:s\r\n 成功返回start\r\n \r\n表示回车换行符
下一首 \\:n\\n 成功返回next\r\n 失败返回 false\r\n \r\n表示回车换行符
上一首 \\:u\r\n 成功返回key up\r\n \r\n表示回车换行符
音量设置 \\:vX\r\n 成功返回vol set ok X=0-255,数字越大音量越大
指定文件播放 \\语音文件名称\r\n 成功返回Play ok\r\n 失败返回 Not found\r\n 播放完毕返回 over\r\n 语音文件名称不超过8个英文字母或者4个中文字

模块的使用

先将SD卡格式化为FAT格式,然后新建一个sound文件夹,音频文件放在sound文件夹内。

模块的MODE跳针用于选择串口(UART)或者I2C模式,使用前请先设置模式。

模块的MONO跳针短路就切换为单声道(如果你只使用一个喇叭时,可以将两个声道音频用一个喇叭放音,短路该跳针即可作为单声道输出),当MONO跳针断开时,2根针分别可作为左右声道立体声输出,可直接接有源音箱。

在使用模块时,要保证电源电压为5V,电流最好大于1000毫安,如果电流不够需需要将音量调小或者使用单个喇叭播放。

模块上的指示灯功能,开机后短促闪烁一次说明进入串口模式,闪烁两次进入I2C模式,等待初始化成功后将长亮,如果SD卡未插好或SD是坏的,指示灯将一直闪烁,同时如果是串口模式,串口会输出 Plese check micro SD card\r\n。

I2C通信实验:

使用I2C通信时,先把语音播放器模块的MODE跳线帽插在I2C位置,如图:

<File:DFRduino> Player_2.jpg

再将语音播放器模块的数据线接到Arduino XBEE传感器扩展板的I2C插针上,模块的DI接扩展板SCL上,模块DO接扩展板SDA上,模块+5V接和扩展板的5V,模块GND接扩展板的GND如图:

<File:DFRduino> Player_3.jpg

最后将喇叭接到语音播放器模块的功放输出端,如图:

<File:DFRduino> Player_4.jpg

待连线完毕后,给Arduino通电,建议使用外部供电。将下列程序编译后下载到Arduino中。

Arduino测试代码:

  //I2C接线方式
  //Arduino    MP3
  //模拟口4    DO
  //模拟口5    DI
  //5V         +5V
  //GND        GND

  #include <Wire.h>
  #include <stdlib.h>
  #define ArduinoPlayer_address 0x35  //定义ArduinoPlayer 语音播放模块I2C地址
  void TwiSend(const char  *cmd)  //I2C发送命令函数
  {
    char len = 0;
    len = strlen(cmd); //计算字符串长度
     Wire.beginTransmission(ArduinoPlayer_address); // ArduinoPlayer 语音播放模块I2C地址
     while(len--)
    {
       Wire.send(*(cmd++));
    }
    Wire.endTransmission();    // stop transmitting
  }
  void setup()
  {
    Wire.begin(); // join i2c bus (address optional for master)
    Serial.begin(9600);
    delay(2000);//等待2秒钟播放器初始化完成
    Serial.println("Ready");
    TwiSend("\\:v 255\r\n");    // 音量设置最大  数字 0-255 数字越大音量越大
  }
  //接收串口命令字符,执行相应操作
  void loop()
  {
    int val;
    if(Serial.available() > 0)
    {
     val=Serial.read();
     switch(val)
     {
       case 'p':      // 暂停播放
        TwiSend("\\:p\r\n");
       Serial.println("OK");
       break;
       case 's':     // 继续播放
        TwiSend("\\:s\r\n");
       Serial.println("OK");
       break;
       case  'n':
       TwiSend("\\:n\r\n");  // 播放下一首
        Serial.println("OK");
       break;
       case 'u':
       TwiSend("\\:u\r\n"); // 播放上一首
        Serial.println("OK");
       break;
       case  'm':      //播放名称为yes的音频文件       //注意:必须将音量控制放在播放之前
        TwiSend("\\:v 250\r\n");    // 音量设置250 数字 0-255 数字越大音量越大
        TwiSend("\\yes\r\n");
       Serial.println("OK");
       break;
       default:
       break;
        }
     }
   }

程序功能:通过串口助手发送字母,Arduino串口收到后转换成相应的指令,通过I2C接口控制语音播放模块。

程序下载好以后打开Arduino 0022,点击如图按钮打开串口调试工具。

<File:DFRduino> Player_5.jpg

<File:DFRduino> Player_6.jpg

在Send左边的对话框里输入字母,然后点击Send按钮或按下回车键,下面对话框出现“OK”就表示命令成功。

本程序中字母相对的命令:

p----------暂停播放

s----------继续播放

n----------下一首

u----------上一首

m----------播放名为“yes”的歌曲

串口通信实验

使用串口通信时,先把语音播放器模块的MODE跳线帽插在UART位置,如图:

<File:DFRduino> Player_7.jpg

再将语音播放器模块上的DI,DO分别换到Arduino XBEE传感器扩展板的TXD和RXD上,如图:

<File:DFRduino> Player_8.jpg

再把按钮接到Arduino XBE传感器扩展板的模拟口0上,如图:

<File:DFRduino> Player_9.jpg

待连线完毕后,给Arduino通电,建议使用外部供电。将下列程序编译后下载到Arduino中。

Arduino测试代码:

  int adc_key_val[5] ={50, 200, 400, 600, 800 };
  int NUM_KEYS = 5;
  int adc_key_in;
  int key=-1;
  int oldkey=-1;
  void setup()
  {
    Serial.begin(19200);
    pinMode(10, INPUT);  //D10
    delay(2000);//等待2秒钟播放器初始化完成
    Serial.println("\\:v 250");    // 音量设置最大  数字 0-255 数字越大音量越大
    delay(50);
  }
  //接收串口命令字符,执行相应操作
  void loop()
  {
   int val,i;
   adc_key_in = analogRead(0);    // read the value from the sensor
   key = get_key(adc_key_in);    // convert into key press
   if (key != oldkey)     // if keypress is detected
   {
    delay(50);      // wait for debounce time
    adc_key_in = analogRead(0);    // read the value from the sensor
    key = get_key(adc_key_in);     // convert into key press
    if (key != oldkey)
    {
      oldkey = key;
      if (key >=0){
        switch(key)
        {
           case 0:
                  Serial.println("\\:p");//暂停播放
                  Serial.println("OK");
                  break;
           case 1:
                  Serial.println("\\:s");//继续播放
                  Serial.println("OK");
                  break;
           case 2:
                  Serial.println("\\:n");  // 播放下一首
                  Serial.println("OK");
                  break;
           case 3:
                  Serial.println("\\:u"); // 播放上一首
                  Serial.println("OK");
                  break;
           case 4://播放名称为yes的音频文件
                  //注意:必须将音量控制放在播放之前
                  Serial.println("\\:v 250");    // 音量设置250 数字 0-255 数字越大音量越大
                  //Serial.println("\\yes");
                  Serial.println("OK");
                  break;
        }
      }
    }
  }
  delay(100);
  }
  // Convert ADC value to key number
  int get_key(unsigned int input)
  {
     int k;
     for (k = 0; k < NUM_KEYS; k++)
     {
        if (input < adc_key_val[k])
    {
            return k;
        }
     }
      if (k >= NUM_KEYS)k = -1;  // No valid key pressed
      return k;
  }

下载程序时拔掉Arduino XBEE传感器扩展板,或拔掉Arduino XBEE传感器扩展板上RXD和TXD连线。

ADKeykoar上按键功能

S1-------暂停播放

S2-------继续播放

S3-------上一首

S4-------下一首

S5-------播放名为“yes”的歌曲

<File:nextredirectltr.png>购买 DFRduino Player 语音播放模块(SKU:DFR0112)