【雕爷学编程】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文件系统。通过简单的串口指令即可完成播放指定的音乐,以及如何播放音乐等功能,无需繁琐的底层操作,使用方便,稳定可靠是此款产品的最大特点。
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
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+、编玩边学)