• 【雕爷学编程】Arduino动手做(82)---Mini MP3 Player播放器


    37款传感器与执行器的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是不止这37种的。鉴于本人手头积累了一些传感器和执行器模块,依照实践出真知(一定要动手做)的理念,以学习和交流为目的,这里准备逐一动手尝试系列实验,不管成功(程序走通)与否,都会记录下来---小小的进步或是搞不掂的问题,希望能够抛砖引玉。

    【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)

    实验八十二:MP3播放器 开源 Mini MP3 Player 播放器 SD卡 音乐DFPlayer模块(YX5200-24SS芯片)

    YX5200-24SS

    是一个提供串口的MP3芯片,完美的集成了MP3、WMV的硬解码。同时软件支持TF卡驱动和USB驱动,以及外挂FLASH。支持FAT16、FAT32文件系统。通过简单的串口指令即可完成播放指定的音乐,以及如何播放音乐等功能,无需繁琐的底层操作,使用方便,稳定可靠是此款产品的最大特点。

    YX5200-24SS串口语音芯片参数
    MP3文件格式:支持所有比特率11172-3和ISO13813-3layer音频解1码,采样支持(KHZ):8/11.025/12/16/22.05/24/32/44.1/48,支持Normal、Lazz、Classic、Pop、ROCK等
    USB接口:2.0标准
    UART接口:标准串口,TTL电平,波特率可设
    输入电压:3.3-5V
    额定电流:15ma(不带U盘)
    尺寸:8.4*8mm
    封装:SSOP24封装
    工作温度:-40度—80度
    湿度:5%-95%。
     
    特色功能
    1、支持采样率(KHz):8/11.025/12/16/22.05/24/32/44.1/48
    2、24位DAC输出,动态范围支持90dB,信噪比支持85dB
    3、完全支持FAT16、FAT32文件系统,最大支持32G的TF卡和U盘
    4、多种控制模式,并口控制模式、串口模式、按键控制模式
    5、广播语插播功能,可以暂停正在播放的背景音乐
    6、音频数据按文件夹排序,最多支持100个文件夹,每隔文件夹可以分配1000首歌曲
    7、支持line in功能
    8、支持mic扩音喊话功能
    9、支持声卡功能,也支持线控耳机功能
    10、30级音量可调,10种EQ可调
    11、支持外扩NORFLASH和NANDFLASH.板载默认支持NORFLASH
    YX5200-24SS电原理图
    应用领域
    1.汽车导航语音播报
    2.公路运输检查员,收费站语音提示
    3.火车,公交车安全检查语音提示
    4.电力,通讯,财务手术室语音提示
    5.车辆进出通道以验证语音提示
    6.边境频道语音提示
    7.多声道语音报警或语音导航设备操作
    8.带语音通知的电动观光巴士安全
    9.机电设备故障报警
    10.火警语音提示
    11.自动播放设备,定期播放

    Mini MP3 Player播放器模块

    是一款小巧且价格低廉的MP3模块,可以直接接驳扬声器。模块配合供电电池、扬声器、按键可以单独使用,也可以通过串口控制,作为UNO或者是任何有串口的单片机的一个模块。模块本身完美的集成了MP3、WAV、WMA的硬解码。同时软件支持TF卡驱动,支持FAT16、FAT32文件系统。通过简单的串口指令即可完成播放指定的音乐,以及如何播放音乐等功能,无需繁琐的底层操作,使用方便,稳定可靠。

    模块管脚图
    管脚号        管脚名称        功能描述        备注
    1        BUSY        播放时输出高电平,停止为低        忙信号
    2        RX        UART异步串口数据输入        3.3V的TTL电平
    3        TX        UART异步串口数据输出        3.3V的TTL电平
    4        DACR        DAC右声道输出        可外接功放、耳机
    5        DACL        DAC左声道输出        可外接功放、耳机
    6        SPK1        外接单声道喇叭        接3W/4Ω或2W/8Ω无源喇叭
    7        SPK2        外接单声道喇叭        接3W/4Ω或2W/8Ω无源喇叭
    8        VCC        电源正极        3.6-5V
    9        IO5        触发输入口5        接地触发
    10        IO4        触发输入口4        接地触发
    11        IO3        触发输入口3        接地触发
    12        IO2        触发输入口2        接地触发
    13        IO1        触发输入口1        接地触发
    14        GND        电源负极        系统地
    15        DP        USB数据线        读U盘或用USB数据线连接电脑更换TF卡内容
    16        DM        USB数据线

    模块应用图

    模块工作模式

    1)串口模式

    模块支持异步串口通讯模式,通过串口接受控制命令

    串口指令格式

    串口控制指令

    串口查询指令

    2)AD按键模式

    模块还支持AD按键控制方式,取代了传统了矩阵键盘的接法,这样做的好处是充分利用了MCU越来越强大的AD功能。设计简约而不简单,我们模块默认配置2个AD口,20个按键的阻值分配。按键使用示意原理图

    3)IO模式
    本模块也支持简单的IO模式

    实验开源代码

    /*
    
    【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
    
    实验八十二:开源 Mini MP3 Player TF卡播放器模块(YX5200-24SS)
    
    程序之一,循环播放TF卡内0003.MP3(MP3文件夹内),音量20
    
    Arduino-------dfplayer
    
    5V-------------VCC
    
    GND-----------GND
    
    D2-----------TXD
    
    D3-----------RXD
    
    */
    
    
    
    #include "SoftwareSerial.h"
    
    #include "DFRobotDFPlayerMini.h"
    
    SoftwareSerial mySoftwareSerial(2, 3); 
    
    DFRobotDFPlayerMini myDFPlayer;
    
    
    
    void setup()
    
    {
    
    mySoftwareSerial.begin(9600);
    
    myDFPlayer.begin(mySoftwareSerial);
    
    myDFPlayer.volume(20);
    
    myDFPlayer.loop(3);  
    
    }
    
    
    
    void loop()
    
    {
    
    }
    

      实验场景图

    收集整理的使用<DFRobotDFPlayerMini>库的控制语句汇总

    //收集整理的使用<DFRobotDFPlayerMini>库的控制语句汇总
    
      myDFPlayer.start();  //播放mp3
    
      myDFPlayer.pause();  //暂停mp3
    
      myDFPlayer.next();  //播放下一个mp3
    
      myDFPlayer.enableLoop();  //启用循环
    
      myDFPlayer.disableLoop();  //禁用循环
    
      myDFPlayer.stopAdvertise(); //停止做广告
    
      mp3Player.volume(10); //音量为10(0-30)
    
      myDFPlayer.previous();  //播放上一个的mp3
    
      myDFPlayer.randomAll(); //随机播放所有mp3
    
      myDFPlayer.enableLoopAll(); //循环所有mp3文件
    
      myDFPlayer.disableLoopAll(); //停止循环所有mp3文件
    
      myDFPlayer.play(1);  //播放文件夹里名为0001.mp3的音乐
    
      myDFPlayer.loop(1);  //循环文件夹里名为0001.mp3的音乐
    
      myDFPlayer.loopFolder(5); //循环文件夹SD:/ 05中的所有mp3文件
    
      myDFPlayer.playMp3Folder(4); //在SD中播放特定的mp3:/MP3/0004.mp3;文件名(0~65535)
    
      myDFPlayer.advertise(3); //在SD中宣传特定的mp3广告:/ADVERT/0003.mp3;文件名(0~65535)
    
      myDFPlayer.playFolder(15, 4);  //在SD中播放特定的mp3:/ 15/004.mp3;文件夹名称(1~99);文件名(1~255)
    
      myDFPlayer.playLargeFolder(2, 999); //在SD中播放特定的mp3:/ 02/004.mp3;文件夹名称(1~10);文件名(1~1000)
    

      

    使用模块的几点注意事项

    1、DFPlayer Mini 可以读取MP3 & WAV 档案格式,但试过档案长度1秒以下无法播放。

    2、所有音乐档案一定要放在/mp3 资料夹里

    3、音乐档案名称一定要使用4 个字,如0001.mp3, 0002.mp3…..0255.mp3

    4、音乐档案超过4个字后则无限制,像是0001_Bruno_Mars_Count_On Me.mp3 是没问题的。

    5、如果你从SD 卡上删掉某个档案,DFPlayer Mini 还是有办法把它播出来,好怪!后来我从新格式化SD 卡才成功播放我要的音乐档案。

    6、Delay(sec); 这个指是是告诉Arduino 你要播放音乐的长度,如果你给的秒数不足,而下个指令又是要播另一首,则Arduino 就会把目前播放中断,而继续播下一首。

    7、mp3_play (74); 这个指令是播放0074.mp3 这个音乐档。

    8、不要直接把Arduino的5V给DFPlayer Mini使用,一定要分别供给DFPlayer Mini电源,不然喇叭会发出很大的杂音。

    9、测试时平均电流150ma左右,模块发烫,可能要注意控制电流。

    10、偶然发现这个模块使用不同的库,相关的控制语句完全不相同。

    /*
    
    【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
    
    实验八十二:开源 Mini MP3 Player TF卡播放器模块(YX5200-24SS)
    
    程序之二,每3秒切换到下一首歌曲,音量20(速播TF卡内所有MP3歌曲)
    
    可以打印来自dfplayer的详细信息以处理不同的错误和状态。
    
    Arduino-------dfplayer
    
    5V-------------VCC
    
    GND-----------GND
    
    D10-----------TXD
    
    D11-----------RXD
    
    */
    
    
    
    #include "Arduino.h"
    
    #include "SoftwareSerial.h"
    
    #include "DFRobotDFPlayerMini.h"
    
    SoftwareSerial mySoftwareSerial(10, 11); 
    
    DFRobotDFPlayerMini myDFPlayer;
    
    void printDetail(uint8_t type, int value);
    
    
    
    void setup(){
    
     mySoftwareSerial.begin(9600);
    
     Serial.begin(115200);
    
     Serial.println();
    
     Serial.println(F("DFRobot DFPlayer Mini Demo"));
    
     Serial.println(F("Initializing DFPlayer ... (May take 3~5 seconds)"));
    
     if (!myDFPlayer.begin(mySoftwareSerial)) {  
    
      Serial.println(F("Unable to begin:"));
    
      Serial.println(F("1.Please recheck the connection!"));
    
      Serial.println(F("2.Please insert the SD card!"));
    
      while(true);
    
     }
    
     Serial.println(F("DFPlayer Mini online."));
    
     myDFPlayer.volume(20);  
    
     myDFPlayer.play(3);  
    
    }
    
    
    
    void loop(){
    
     static unsigned long timer = millis();
    
     if (millis() - timer > 3000) {
    
      timer = millis();
    
      myDFPlayer.next();  
    
     }
    
     if (myDFPlayer.available()) {
    
      printDetail(myDFPlayer.readType(), myDFPlayer.read()); 
    
     }
    
    }
    
    void printDetail(uint8_t type, int value){
    
     switch (type) {
    
      case TimeOut:
    
       Serial.println(F("Time Out!"));
    
       break;
    
      case WrongStack:
    
       Serial.println(F("Stack Wrong!"));
    
       break;
    
      case DFPlayerCardInserted:
    
       Serial.println(F("Card Inserted!"));
    
       break;
    
      case DFPlayerCardRemoved:
    
       Serial.println(F("Card Removed!"));
    
       break;
    
      case DFPlayerCardOnline:
    
       Serial.println(F("Card Online!"));
    
       break;
    
      case DFPlayerPlayFinished:
    
       Serial.print(F("Number:"));
    
       Serial.print(value);
    
       Serial.println(F(" Play Finished!"));
    
       break;
    
      case DFPlayerError:
    
       Serial.print(F("DFPlayerError:"));
    
       switch (value) {
    
        case Busy:
    
         Serial.println(F("Card not found"));
    
         break;
    
        case Sleeping:
    
         Serial.println(F("Sleeping"));
    
         break;
    
        case SerialWrongStack:
    
         Serial.println(F("Get Wrong Stack"));
    
         break;
    
        case CheckSumNotMatch:
    
         Serial.println(F("Check Sum Not Match"));
    
         break;
    
        case FileIndexOut:
    
         Serial.println(F("File Index Out of Bound"));
    
         break;
    
        case FileMismatch:
    
         Serial.println(F("Cannot Find File"));
    
         break;
    
        case Advertise:
    
         Serial.println(F("In Advertise"));
    
         break;
    
        default:
    
         break;
    
       }
    
       break;
    
      default:
    
       break;
    
     }
    
    }
    

      实验串口返回情况

    实验开源仿真编程(Linkboy V4.2)

    实验开源图形编程(Mixly、Mind+、编玩边学)

  • 相关阅读:
    MyEclipse控制台输出tomcat红字
    struts标签bean:define
    字节流转换为对象的方法
    C#将jpg格式图片合成到bmp格式图片中
    [置顶]C#中Socket服务端代码分享
    [置顶] C#中Socket服务端代码分享
    [置顶] 使用Joson的格式字符串在Socket中通讯时数据格式的转换
    [置顶] AMF序列化为对象和AMF序列化为二进制字节流
    用C#获取CPU编号、硬盘编号等系统有关环境、属性
    别把紧张情绪带回家 下班后的10个最佳放松法
  • 原文地址:https://www.cnblogs.com/eagler8/p/14741484.html
Copyright © 2020-2023  润新知