|
大家好,欢迎来到本教程。在本篇文章中,我们将使用Arduino开发板和DFPlayer mini MP3模块制作一个mp3播放器。
DF Player mini是一款低成本的小型mp3模块,具有简化的音频输出,可以直接连接到扬声器或耳机插孔。该模块可以用作一款独立模块,只需附带足电池、扬声器和按钮,也可以与微控制器或开发板(如Arduino)结合使用,支持RX / TX(串行)通信,因此我们可以通过简单的串行命令可以播放音乐并执行其他功能,例如播放下一首和上一首歌曲、随机播放、暂停当前正在播放的歌曲等。该模块带有SD卡插槽,并且支持FAT16、FAT32文件系统。
DF Player mini的一些功能包括: √ 支持8KHz、11.025KHz、12KHz、16KHz、22.05KHz的采样率,最高48KHz √ 24位DAC输出,动态范围支持90dB,SNR支持85dB √ 支持FAT16、FAT32文件系统,最大支持32GB TF卡 √ 多种控制模式,串行模式、AD键控制模式 √ 具有广播语音点播功能,可以暂停正在播放的背景音乐 √ 内置3W放大器 √ 音频数据按文件夹排序;支持多达100个文件夹,每个文件夹最多可分配1000首歌曲 √ 30级音量可调,10级EQ可调
本文的目的是演示如何将此模块与Arduino配合使用,并使用按钮指示Arduino向模块发送串行命令并控制mp3。我们将使用三个按钮来实现此目的。第一个按钮将用作“上一个”按钮,使我们能够播放上一首歌曲。第二个按钮将“播放/暂停”当前正在播放的文件,第三个按钮将用于播放下一个文件。
所需的组件 构建该项目需要以下组件: ● DFPlayer Mini模块 ● Arduino Uno开发板 ● 面包板 ● 按键 ● 扬声器 ● 连接导线
原理图 这个项目的原理图非常简单
如上所示,Arduino和DFplayer mini模块之间的连接非常简单,因为我们只需要在VCC和GND旁边连接两个引脚即可。应该注意的是,在模块的Rx引脚和Arduino之间添加了1k电阻以减少噪声,但是如果您的模块设置在Rx线上没有伴随噪声,则没有必要。 请再次确认连接,以确保一切都正常。我们的开关是有意连接的,没有上拉(或下拉)电阻,因为我们将启用Arduino内部上拉电阻。
代码 要将命令从Arduino发送到DFplayer mini,我们将使用Arduino软件串口库。虽然我们可以使用硬件串口将命令从Arduino发送到DFplayermini,但是Arduino硬件串行引脚(0和1)与Arduino用于与计算机通信的引脚相同,如果连接,可能会阻止代码顺利上传到任何其他设备。因此,为了轻松通信,我们将使用软件串口库。本教程的代码很简单,而DFPlayer mini包含一个库,其中包含用于控制mp3播放器的不同功能,我们将编写我们自己的功能很有趣,并且可以帮助您演示模块的实际工作方式。
与往常一样,我们在代码中所做的第一件事是包括将要使用的库,在本文中,该库是软件串口库,用于创建声明Rx和Tx引脚(分别为10和11)时的库对象。 - /// MP3 PLAYER PROJECT
- /// http://educ8s.tv/arduino-mp3-player/
- //////////////////////////////////////////
- #include "SoftwareSerial.h"
- SoftwareSerial mySerial(10, 11);
复制代码接下来,我们定义一些用于指定十六进制值的命令。 - # define Start_Byte 0x7E
- # define Version_Byte 0xFF
- # define Command_Length 0x06
- # define End_Byte 0xEF
- # define Acknowledge 0x00 //Returns info with command 0x41 [0x01: info, 0x00: no info]
复制代码接下来,我们声明按钮连接到的Arduino的引脚。 - int buttonNext = 2;
- int buttonPause = 3;
- int buttonPrevious = 4;
复制代码
接下来,我们转到void setup()函数,在其中设置按钮所连接的引脚的引脚模式,并将这些引脚设置为“高”。完成此操作后,我们以9600的波特率开始软件串行通信。 - void setup () {
- pinMode(buttonPause, INPUT);
- digitalWrite(buttonPause,HIGH);
- pinMode(buttonNext, INPUT);
- digitalWrite(buttonNext,HIGH);
- pinMode(buttonPrevious, INPUT);
- digitalWrite(buttonPrevious,HIGH);
- mySerial.begin (9600);
复制代码接下来,我们使用playfirst()函数播放存储设备上的第一首歌曲,并将isPlaying变量设置为true以指示其中一个文件正在播放。 - delay(1000);
- playFirst();
- isPlaying = true;
复制代码
转到void loop()函数,此函数主要检查按钮是否按下,并将相应的命令发送到DFPlayer mini,然后播放(取决于“ isplay”变量的值)或暂停当前歌曲,或转到下一首或上一首歌。 - void loop () {
- if (digitalRead(buttonPause) == ACTIVATED)
- {
- if(isPlaying)
- {
- pause();
- isPlaying = false;
- }else
- {
- isPlaying = true;
- play();
- }
- }
- if (digitalRead(buttonNext) == ACTIVATED)
- {
- if(isPlaying)
- {
- playNext();
- }
- }
- if (digitalRead(buttonPrevious) == ACTIVATED)
- {
- if(isPlaying)
- {
- playPrevious();
- }
- }
- }
复制代码
该项目的完整代码在下面提供。 - /// MP3 PLAYER PROJECT
- /// http://educ8s.tv/arduino-mp3-player/
- //////////////////////////////////////////
- #include "SoftwareSerial.h"
- SoftwareSerial mySerial(10, 11);
- # define Start_Byte 0x7E
- # define Version_Byte 0xFF
- # define Command_Length 0x06
- # define End_Byte 0xEF
- # define Acknowledge 0x00 //Returns info with command 0x41 [0x01: info, 0x00: no info]
- # define ACTIVATED LOW
- int buttonNext = 2;
- int buttonPause = 3;
- int buttonPrevious = 4;
- boolean isPlaying = false;
- void setup () {
- pinMode(buttonPause, INPUT);
- digitalWrite(buttonPause,HIGH);
- pinMode(buttonNext, INPUT);
- digitalWrite(buttonNext,HIGH);
- pinMode(buttonPrevious, INPUT);
- digitalWrite(buttonPrevious,HIGH);
- mySerial.begin (9600);
- delay(1000);
- playFirst();
- isPlaying = true;
- }
- void loop () {
- if (digitalRead(buttonPause) == ACTIVATED)
- {
- if(isPlaying)
- {
- pause();
- isPlaying = false;
- }else
- {
- isPlaying = true;
- play();
- }
- }
- if (digitalRead(buttonNext) == ACTIVATED)
- {
- if(isPlaying)
- {
- playNext();
- }
- }
- if (digitalRead(buttonPrevious) == ACTIVATED)
- {
- if(isPlaying)
- {
- playPrevious();
- }
- }
- }
- void playFirst()
- {
- execute_CMD(0x3F, 0, 0);
- delay(500);
- setVolume(20);
- delay(500);
- execute_CMD(0x11,0,1);
- delay(500);
- }
- void pause()
- {
- execute_CMD(0x0E,0,0);
- delay(500);
- }
- void play()
- {
- execute_CMD(0x0D,0,1);
- delay(500);
- }
- void playNext()
- {
- execute_CMD(0x01,0,1);
- delay(500);
- }
- void playPrevious()
- {
- execute_CMD(0x02,0,1);
- delay(500);
- }
- void setVolume(int volume)
- {
- execute_CMD(0x06, 0, volume); // Set the volume (0x00~0x30)
- delay(2000);
- }
- void execute_CMD(byte CMD, byte Par1, byte Par2)
- // Excecute the command and parameters
- {
- // Calculate the checksum (2 bytes)
- word checksum = -(Version_Byte + Command_Length + CMD + Acknowledge + Par1 + Par2);
- // Build the command line
- byte Command_line[10] = { Start_Byte, Version_Byte, Command_Length, CMD, Acknowledge,
- Par1, Par2, highByte(checksum), lowByte(checksum), End_Byte};
- //Send the command line to the module
- for (byte k=0; k<10; k++)
- {
- mySerial.write( Command_line[k]);
- }
- }
复制代码
演示 加载带有歌曲的SD卡并插入DFplayer mini,然后将代码上传到Arduino,并将扬声器的电线连接到DFPlayer mini的扬声器引脚。 您应该会听到歌曲从连接的扬声器中开始流出。 最终设置应如下图所示。
下面列出了本文可以使用的一些应用场合,希望它给您启发以构建一些非常酷的东西。 > 火警语音提示 > 收费站语音提示 > 电力、通讯、金融营业厅语音提示 > 多通道语音报警或设备操作指导语音
以上就是本文的所有内容,感谢您的关注。 |