一次带孩子去商场,他对一个用木盒做的、LCD显示的音乐盒非常感兴趣,玩了半天,久久不肯离去,看着儿子喜欢、专注把玩的眼神,作为一个父亲真想直接买下,但是我不能!作为一名创客一个怀旧的魔兽世界老玩家,我肩负着激发孩子学习兴趣的历史使命,于是便励志亲自给儿子做一个音乐盒。
最简单的方案当然是买个mp3模块,插上存有音乐的U盘或SD卡,接上喇叭和电源
(可以参考我之前发的音乐盒视频)。但这样弄的话一般不能外接LCD液晶显示歌曲信息,对孩子(初学者)来说也教育意义比较少。经过多次方案对比和调研,最终采用arduino的PCM方案实现音乐盒。
简单起见,我直接使用库函数里的参考滤波电路,将PWM波滤出比较好听的音频信号。下边是我认认真真画的原理图(移动电源和开关没画)给您参考:

首先需要验证一下功能,将SD卡读卡器,音频接口与arduino连接。音乐播放功能测试实物图:

使用10元买的USB音箱测试一下,妥妥的没有问题,音效也还可以。
我们要做音乐盒,当然要先找一个盒子,根据原理图和需求,得找个大小差不多的,正好朋友送了我一个星球大战魔兽世界玩具的盒子,纸板很厚,很结实。整体结构是两个纸盒插在一起,刚好方便安装,上边还带个把手,可以提着

先把音箱的孔和LCD的孔搞出来,打印出样式后贴在盒子上,然后电钻打孔

固定主要配件:胶枪伺候,把主板和喇叭什么的固定一下,考虑有可能会往SD卡里存音乐,所以把SD卡模块放外边,在后盖上开个孔,防止蹭到。在LCD下边打一个孔放个按键用于切换歌曲。

把家里吃灰的移动电源利用起来,这货好像比较老了,实际电量特别低,用在这个音乐盒上正好,因为音乐不是很费电,在后盖上再打个孔安装纽子开关。

大功告成,来个整体照片

根据库函数要求需要将mp3转换成8位的wav文件,按照下边的参数转换就ok,妥妥的。

在电脑上用读卡器将wav音频文件存入SD卡。
• 程序结构:
• 待改进:
......
程序是自解释的,因为它们具有注释行。但是,我还在下面解释了TMRpcm库的功能。
播放音频文件:
您可以使用下面的行在SD卡模块中播放以Wav格式存储的任何音频。
music.play(“ 3.wav”);
// object name.play(“ FileName.wav”);
您可以在要触发音频的地方使用此行
暂停音频文件:
要暂停音频文件,您只需拨打以下电话即可。
music.pause();
//objectname.pause();
转发/倒带音频:
没有直接方法可以快进或快退音频文件,但是您可以使用下面的代码在特定时间播放歌曲。可以通过一些其他编程来前进/后退。
music.play(“ 2.wav”,33); //从第33秒开始播放歌曲
//objectname.play(“Filename.wav”,以秒为单位的时间);
设置音频质量:
该库为我们提供了两种播放音乐的特质,一种是正常播放,另一种是2倍过采样。
music.quality(0); //正常模式
music.quality(1); // 2X过采样模式
设置音频音量:
是的,您可以通过软件控制音频的音量。您只需使用下面的行即可设置音量。较高的音乐音量会影响音频质量,因此请尽可能使用硬件控制。
music.setVolume(5); //以第5卷播放歌曲
//objectname.setVolume(音量级别);
Arduino音乐播放器的工作原理:
对Arduino进行编程后,只需按连接到引脚2的按钮,您的Arduino就会为您播放第一首歌曲(保存为1.wav)。现在,您可以再次按下按钮,将曲目更改为播放2.wav的下一首歌曲。同样,您可以浏览所有四首歌曲。
您也可以通过按连接到引脚3的按钮来播放/暂停歌曲。按一次以暂停歌曲,然后再次按从停止处播放。观看下面的**视频,**了解完整的工作原理(或者放松一下自己的歌)。

希望您喜欢这个项目。现在,在项目中使用它们取决于您的创造力。您可以制作口语时钟,语音助手,会说话的机器人,语音警报安全系统等等。让我知道您打算如何通过评论部分来使用它,并且如果在使该功能正常工作时遇到任何问题,可以通过下面的论坛或评论部分与我联系。
/*
Arduino Based Music Player
This example shows how to play three songs from SD card by pressing a push button
The circuit:
* Push Button on pin 2 and 3
* Audio Out - pin 9
* SD card attached to SPI bus as follows:
** MOSI - pin 11
** MISO - pin 12
** CLK - pin 13
** CS - pin 4
created 25 Jun 2017
by Aswinth Raj
This example code was created for CircuitDigest.com
*/
#include "SD.h" //Lib to read SD card
#include "TMRpcm.h" //Lib to play auido
#include "SPI.h" //SPI lib for SD card
#define SD_ChipSelectPin 4 //Chip select is pin number 4
TMRpcm music; //Lib object is named "music"
int song_number=0;
boolean debounce1=true;
boolean debounce2=true;
boolean play_pause;
void setup(){
music.speakerPin = 9; //Auido out on pin 9
Serial.begin(9600); //Serial Com for debugging
if (!SD.begin(SD_ChipSelectPin)) {
Serial.println("SD fail");
return;
}
pinMode(2, INPUT_PULLUP); //Button 1 with internal pull up to chage track
pinMode(3, INPUT_PULLUP); //Button 2 with internal pull up to play/pause
pinMode(3, INPUT_PULLUP); //Button 2 with internal pull up to fast forward
music.setVolume(5); // 0 to 7. Set volume level
music.quality(1); // Set 1 for 2x oversampling Set 0 for normal
//music.volume(0); // 1(up) or 0(down) to control volume
//music.play("filename",30); plays a file starting at 30 seconds into the track
}
void loop()
{
if (digitalRead(2)==LOW && debounce1 == true) //Button 1 Pressed
{
song_number++;
if (song_number==5)
{song_number=1;}
debounce1=false;
Serial.println("KEY PRESSED");
Serial.print("song_number=");
Serial.println(song_number);
if (song_number ==1)
{music.play("1.wav",10);} //Play song 1 from 10th second
if (song_number ==2)
{music.play("2.wav",33);} //Play song 2 from 33rd second
if (song_number ==3)
{music.play("3.wav");} //Play song 3 from start
if (song_number ==4)
{music.play("4.wav",25);} //Play song 4 from 25th second
if (digitalRead(3)==LOW && debounce2 == true) //Button 2 Pressed
{
music.pause(); Serial.println("PLAY / PAUSE");
debounce2=false;
}
if (digitalRead(2)==HIGH) //Avoid debounce
debounce1=true;
if (digitalRead(3)==HIGH)//Avoid debounce
debounce2=true;
}
}

