风筝
发表于: 2020-10-15 17:24:59 | 显示全部楼层

大家好,欢迎来到本教程。在本篇文章中,我们将使用Arduino开发板和DFPlayer mini MP3模块制作一个mp3播放器。


DF Player mini是一款低成本的小型mp3模块,具有简化的音频输出,可以直接连接到扬声器或耳机插孔。该模块可以用作一款独立模块,只需附带足电池、扬声器和按钮,也可以与微控制器或开发板(如Arduino)结合使用,支持RX / TX(串行)通信,因此我们可以通过简单的串行命令可以播放音乐并执行其他功能,例如播放下一首和上一首歌曲、随机播放、暂停当前正在播放的歌曲等。该模块带有SD卡插槽,并且支持FAT16、FAT32文件系统。

mp3-player-module-dfplayer-mini.jpg


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开发板

●    面包板

●    按键

●    扬声器

●    连接导线


原理图

这个项目的原理图非常简单

mp3-player.png


如上所示,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)时的库对象。

  1. ///              MP3 PLAYER PROJECT
  2. /// http://educ8s.tv/arduino-mp3-player/
  3. //////////////////////////////////////////


  4. #include "SoftwareSerial.h"
  5. SoftwareSerial mySerial(10, 11);
复制代码

接下来,我们定义一些用于指定十六进制值的命令。

  1. # define Start_Byte 0x7E
  2. # define Version_Byte 0xFF
  3. # define Command_Length 0x06
  4. # define End_Byte 0xEF
  5. # define Acknowledge 0x00 //Returns info with command 0x41 [0x01: info, 0x00: no info]
复制代码

接下来,我们声明按钮连接到的Arduino的引脚。

  1. int buttonNext = 2;
  2. int buttonPause = 3;
  3. int buttonPrevious = 4;
复制代码

接下来,我们转到void setup()函数,在其中设置按钮所连接的引脚的引脚模式,并将这些引脚设置为“高”。完成此操作后,我们以9600的波特率开始软件串行通信。

  1. void setup () {

  2. pinMode(buttonPause, INPUT);
  3. digitalWrite(buttonPause,HIGH);
  4. pinMode(buttonNext, INPUT);
  5. digitalWrite(buttonNext,HIGH);
  6. pinMode(buttonPrevious, INPUT);
  7. digitalWrite(buttonPrevious,HIGH);

  8. mySerial.begin (9600);
复制代码

接下来,我们使用playfirst()函数播放存储设备上的第一首歌曲,并将isPlaying变量设置为true以指示其中一个文件正在播放。

  1. delay(1000);
  2. playFirst();
  3. isPlaying = true;
复制代码

转到void loop()函数,此函数主要检查按钮是否按下,并将相应的命令发送到DFPlayer mini,然后播放(取决于“ isplay”变量的值)或暂停当前歌曲,或转到下一首或上一首歌。

  1. void loop () {

  2. if (digitalRead(buttonPause) == ACTIVATED)
  3.   {
  4.     if(isPlaying)
  5.     {
  6.       pause();
  7.       isPlaying = false;
  8.     }else
  9.     {
  10.       isPlaying = true;
  11.       play();
  12.     }
  13.   }


  14. if (digitalRead(buttonNext) == ACTIVATED)
  15.   {
  16.     if(isPlaying)
  17.     {
  18.       playNext();
  19.     }
  20.   }

  21.    if (digitalRead(buttonPrevious) == ACTIVATED)
  22.   {
  23.     if(isPlaying)
  24.     {
  25.       playPrevious();
  26.     }
  27.   }
  28. }
复制代码

该项目的完整代码在下面提供。

  1. ///              MP3 PLAYER PROJECT
  2. /// http://educ8s.tv/arduino-mp3-player/
  3. //////////////////////////////////////////


  4. #include "SoftwareSerial.h"
  5. SoftwareSerial mySerial(10, 11);
  6. # define Start_Byte 0x7E
  7. # define Version_Byte 0xFF
  8. # define Command_Length 0x06
  9. # define End_Byte 0xEF
  10. # define Acknowledge 0x00 //Returns info with command 0x41 [0x01: info, 0x00: no info]

  11. # define ACTIVATED LOW

  12. int buttonNext = 2;
  13. int buttonPause = 3;
  14. int buttonPrevious = 4;
  15. boolean isPlaying = false;



  16. void setup () {

  17. pinMode(buttonPause, INPUT);
  18. digitalWrite(buttonPause,HIGH);
  19. pinMode(buttonNext, INPUT);
  20. digitalWrite(buttonNext,HIGH);
  21. pinMode(buttonPrevious, INPUT);
  22. digitalWrite(buttonPrevious,HIGH);

  23. mySerial.begin (9600);
  24. delay(1000);
  25. playFirst();
  26. isPlaying = true;


  27. }



  28. void loop () {

  29. if (digitalRead(buttonPause) == ACTIVATED)
  30.   {
  31.     if(isPlaying)
  32.     {
  33.       pause();
  34.       isPlaying = false;
  35.     }else
  36.     {
  37.       isPlaying = true;
  38.       play();
  39.     }
  40.   }


  41. if (digitalRead(buttonNext) == ACTIVATED)
  42.   {
  43.     if(isPlaying)
  44.     {
  45.       playNext();
  46.     }
  47.   }

  48.    if (digitalRead(buttonPrevious) == ACTIVATED)
  49.   {
  50.     if(isPlaying)
  51.     {
  52.       playPrevious();
  53.     }
  54.   }
  55. }

  56. void playFirst()
  57. {
  58.   execute_CMD(0x3F, 0, 0);
  59.   delay(500);
  60.   setVolume(20);
  61.   delay(500);
  62.   execute_CMD(0x11,0,1);
  63.   delay(500);
  64. }

  65. void pause()
  66. {
  67.   execute_CMD(0x0E,0,0);
  68.   delay(500);
  69. }

  70. void play()
  71. {
  72.   execute_CMD(0x0D,0,1);
  73.   delay(500);
  74. }

  75. void playNext()
  76. {
  77.   execute_CMD(0x01,0,1);
  78.   delay(500);
  79. }

  80. void playPrevious()
  81. {
  82.   execute_CMD(0x02,0,1);
  83.   delay(500);
  84. }

  85. void setVolume(int volume)
  86. {
  87.   execute_CMD(0x06, 0, volume); // Set the volume (0x00~0x30)
  88.   delay(2000);
  89. }

  90. void execute_CMD(byte CMD, byte Par1, byte Par2)
  91. // Excecute the command and parameters
  92. {
  93. // Calculate the checksum (2 bytes)
  94. word checksum = -(Version_Byte + Command_Length + CMD + Acknowledge + Par1 + Par2);
  95. // Build the command line
  96. byte Command_line[10] = { Start_Byte, Version_Byte, Command_Length, CMD, Acknowledge,
  97. Par1, Par2, highByte(checksum), lowByte(checksum), End_Byte};
  98. //Send the command line to the module
  99. for (byte k=0; k<10; k++)
  100. {
  101. mySerial.write( Command_line[k]);
  102. }
  103. }
复制代码

演示

加载带有歌曲的SD卡并插入DFplayer mini,然后将代码上传到Arduino,并将扬声器的电线连接到DFPlayer mini的扬声器引脚。 您应该会听到歌曲从连接的扬声器中开始流出。 最终设置应如下图所示。

Demo.jpg


下面列出了本文可以使用的一些应用场合,希望它给您启发以构建一些非常酷的东西。

>  火警语音提示

>  收费站语音提示

>  电力、通讯、金融营业厅语音提示

>  多通道语音报警或设备操作指导语音


以上就是本文的所有内容,感谢您的关注。

跳转到指定楼层
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题 705 | 回复: 1492



手机版|

GMT+8, 2024-11-21 19:00 , Processed in 0.047146 second(s), 8 queries , Gzip On, MemCache On. Powered by Discuz! X3.5

YiBoard一板网 © 2015-2022 地址:河北省石家庄市长安区高营大街 ( 冀ICP备18020117号 )

快速回复 返回顶部 返回列表