ARDUINO UNO简易音乐播放器实现

[复制链接]
2239|5
 楼主 | 2016-12-29 17:02 | 显示全部楼层 |阅读模式
这个项目使用少量的硬件即可用Arduino UNO播放SD卡里面的音频文件,使用简单方便,只要简单几步就可以制作属于自己的简易音乐播放器了。
1、准备SimpleSDAudio库文件,将解压后的文件拷贝到Arduino IDE安装文件夹下的 /libraries (如:D:\Arduino\libraries)文件夹下;

此时打开Arduino IDE 点击文件--->示例,就可以看到刚才添加的库文件了。

2、制作音频文件。
制作所需要的音频文件需要以下工具:
工具使用也很简单,首先将你想要播放的MP3文件使用格式工厂或者类似工具转换.wav格式。
然后打开tools工具,里面有多种支持Arduino 的音频文件格式,我们一般选择第一个就可以了,将wav文件直接拖入第一个工具,当出现如下图:按任意键继续。。。时转换完成。


接下来准备一张SD卡,将其格式化为FAT文件格式,然后将转换完成的音频文件*.AFM拷贝到SD卡的根目录下。
3、SD卡与Arduino UNO板接线。
接下来使用杜邦线将SD卡与Arduino UNO板进行按如下图进行连接,SD的片选接4脚,其他的接Arduino 的SPI接口。




扬声器正极接9脚,负极接GND即可。
4、源程序编译与上传。
源程序如下:
  1. #include <SimpleSDAudio.h>

  2. // Callback target, prints output to serial
  3. void DirCallback(char *buf) {
  4.   Serial.println(buf);
  5. }

  6. char AudioFileName[16];

  7. // Create static buffer
  8. #define BIGBUFSIZE (2*512)      // bigger than 2*512 is often only possible on Arduino megas!
  9. uint8_t bigbuf[BIGBUFSIZE];

  10. // helper function to determine free ram at runtime
  11. int freeRam () {
  12.   extern int __heap_start, *__brkval;
  13.   int v;
  14.   return (int) &v - (__brkval == 0 ? (int) &__heap_start : (int) __brkval);
  15. }

  16. void setup()
  17. {
  18. // Open serial communications and wait for port to open:
  19.   Serial.begin(9600);
  20.    while (!Serial) {
  21.     ; // wait for serial port to connect. Needed for Leonardo only
  22.   }
  23.   
  24.   Serial.print(F("Free Ram: "));
  25.   Serial.println(freeRam());
  26.   
  27.   // Setting the buffer manually for more flexibility
  28.   SdPlay.setWorkBuffer(bigbuf, BIGBUFSIZE);
  29.   
  30.   Serial.print(F("\nInitializing SimpleSDAudio V" SSDA_VERSIONSTRING " ..."));  
  31.   
  32.   // If your SD card CS-Pin is not at Pin 4, enable and adapt the following line:
  33.   //SdPlay.setSDCSPin(10);
  34.   
  35.   // Select between SSDA_MODE_FULLRATE or SSDA_MODE_HALFRATE (62.5kHz or 31.25kHz)
  36.   // and the output modes SSDA_MODE_MONO_BRIDGE, SSDA_MODE_MONO or SSDA_MODE_STEREO
  37.   if (!SdPlay.init(SSDA_MODE_FULLRATE | SSDA_MODE_MONO | SSDA_MODE_AUTOWORKER)) {
  38.     Serial.println(F("initialization failed. Things to check:"));
  39.     Serial.println(F("* is a card is inserted?"));
  40.     Serial.println(F("* Is your wiring correct?"));
  41.     Serial.println(F("* maybe you need to change the chipSelect pin to match your shield or module?"));
  42.     Serial.print(F("Error code: "));
  43.     Serial.println(SdPlay.getLastError());
  44.     while(1);
  45.   } else {
  46.     Serial.println(F("Wiring is correct and a card is present."));
  47.   }
  48.   

  49. }


  50. void loop(void) {
  51.   uint8_t count=0, c, flag;
  52.   
  53.   Serial.println(F("Files on card:"));
  54.   SdPlay.dir(&DirCallback);

  55. ReEnter:
  56.   count = 0;
  57.   Serial.println(F("\r\nEnter filename (send newline after input):"));
  58.   do {
  59.     while(!Serial.available()) ;
  60.     c = Serial.read();
  61.     if(c > ' ') AudioFileName[count++] = c;
  62.   } while((c != 0x0d) && (c != 0x0a) && (count < 14));
  63.   AudioFileName[count++] = 0;
  64.   
  65.   Serial.print(F("Looking for file... "));
  66.   if(!SdPlay.setFile(AudioFileName)) {
  67.     Serial.println(F(" not found on card! Error code: "));
  68.     Serial.println(SdPlay.getLastError());
  69.     goto ReEnter;
  70.   } else {
  71.    Serial.println(F("found."));
  72.   }   

  73.   Serial.println(F("Press s for stop, p for play, h for pause, f to select new file, d for deinit, v to view status."));
  74.   flag = 1;
  75.   
  76.   while(flag) {
  77.     SdPlay.worker();  // You can remove this line if you like - worker is not necessary
  78.     if(Serial.available()) {
  79.       c = Serial.read();
  80.       switch(c) {
  81.          case 's':
  82.            SdPlay.stop();
  83.            Serial.println(F("Stopped."));
  84.            break;
  85.            
  86.          case 'p':
  87.            SdPlay.play();
  88.            Serial.println(F("Play."));
  89.            break;
  90.            
  91.          case 'h':
  92.            SdPlay.pause();
  93.            Serial.println(F("Pause."));
  94.            break;   
  95.    
  96.          case 'd':
  97.            SdPlay.deInit();
  98.            Serial.println(F("SdPlay deinitialized. You can now safely remove card. System halted."));
  99.            while(1) ;
  100.            break;  
  101.             
  102.          case 'f':
  103.            flag = 0;
  104.            break;
  105.      
  106.          case 'v':
  107.            Serial.print(F("Status: isStopped="));
  108.            Serial.print(SdPlay.isStopped());
  109.            Serial.print(F(", isPlaying="));
  110.            Serial.print(SdPlay.isPlaying());
  111.            Serial.print(F(", isPaused="));
  112.            Serial.print(SdPlay.isPaused());
  113.            Serial.print(F(", isUnderrunOccured="));
  114.            Serial.print(SdPlay.isUnderrunOccured());
  115.            Serial.print(F(", getLastError="));
  116.            Serial.println(SdPlay.getLastError());
  117.            Serial.print(F("Free RAM: "));
  118.            Serial.println(freeRam());
  119.            break;      
  120.       }
  121.     }
  122.   }
  123.   
  124.   
  125. }
复制代码

点击编译,并上传。


上传成功后,打开串口监视器查看文件状态,初始化后显示RAM大小和SD卡里面存在的文件;

输入要播放的音频文件名,点击发送后,串口显示已找到文件,并开始播放,输入v可以查看当前的播放状态。


至此这个最简单的MP3播放器就制作完成了,是不是特别简单。


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
| 2016-12-30 22:03 | 显示全部楼层
确实程序看起来很简单的样子,SdPlay这个类也是IDE自带的?
| 2017-1-3 10:28 | 显示全部楼层
谢谢分享!
| 2017-1-11 17:58 | 显示全部楼层
| 2018-5-3 18:40 | 显示全部楼层
您好、我想请教一下用aduino制作简易音频播放器这个老提示找不到卡或者接线错误怎么办呢?我用的是aduino uno r3 板
| 2018-5-3 18:40 | 显示全部楼层

Initializing SimpleSDAudio V1.03 ...initialization failed. Things to check:
* is a card is inserted?
* Is your wiring correct?
* maybe you need to change the chipSelect pin to match your shield or module?
Error code: 1
扫描二维码,随时随地手机跟帖
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复

您需要登录后才可以回帖
登录 | 注册
高级模式
我要创建版块 申请成为版主

论坛热帖

关闭

热门推荐上一条 /6 下一条

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