So i started on my project of mp3 player a few weeks back.
Libraries
All the libraries i could find were designed for Arduino 1.0.1 and the current is 1.5.
I spent some time trying to make it compile and at some point i had it working, once…
As my setup was using the default settings, arduino was installed in program files, and windows was making it difficult to edit files in there.
I gave up, and went back to Arduino 1.0. I used 1.0.4 instead of 1.0.1 as it should be close enough. With Arduino 1.0, one has to install the USB driver manually as there is no installer, just a zip file.
There are basically two options as far as the library is concerned, listed at http://www.elecfreaks.com/wiki/index.php?title=Freaduino_MP3_Music_Shield.
As the shield is based around the VS1053b, there are probably other libraries that will be compatible like http://www.seeedstudio.com/wiki/Music_Shield or http://learn.adafruit.com/adafruit-vs1053-mp3-aac-ogg-midi-wav-play-and-record-codec-tutorial/simple-audio-player-wiring
One set allows to play all tracks and have control over next, previous track, the other allows to play track by name or randomly.
I tried both and with the 1.0.4 sdk it works reasonably well out of the box.
Hardware
Now i wanted to use the RFID reader at the same time. the mp3 shield is not using the pin 3 on the arduino, however there is no header left to connect to. I ended up soldering directly on the back of the mp3 shield. I only need 3 wires: ground, +5 V and rx from the rfid reader.
Another option would be to replace the headers on the shield with male/female headers like this: http://www.adafruit.com/products/706 or to use a stackable protoshield like this: http://www.adafruit.com/products/51
Software
For the software side, it’s not yet clear to me how i will handle folders.
For now , i just won’t. the card is formatted in FAT16 format, so i can have 512 entries in the root (using 8.3 format)
I will encode each audio file with nnnnxmm.mp3 with nnnn being the album number and mm the track number, for example 0001×01.mp3
For now i will hard code everything, but the plan is to have a table of content toc.txt which will match the cards id with the album number; for example
2B00B53A0FAB 0001 12 (there are twelve tracks on album 0001 whose id is 2B00B53A0FAB.
first script
// File MusicPlayWithName.ino
// Demo code for playing any existing music file on Micro SD card by file name
// For more details about the product please check http://www.seeedstudio.com/depot/
// Copyright (c) 2010 seeed technology inc.
// Author: Icing Chang
// Version: 1.0
// Time: Oct 21, 2010
// Changing records:
//
// This library is free software; you can redistribute it and/or
// modify it under the terms of the GNU Lesser General Public
// License as published by the Free Software Foundation; either
// version 2.1 of the License, or (at your option) any later version.
//
// This library is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
// Lesser General Public License for more details.
//
// You should have received a copy of the GNU Lesser General Public
// License along with this library; if not, write to the Free Software
// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
/**************************Note*******************************************
To make this demo code run sucessfully, you need to download the fat16lib
into your Arduino library at the following address:
http://code.google.com/p/fat16lib/downloads/detail?name=fat16lib20101009.zip&can=2&q=
**************************************************************************/
#include <Arduino.h>
#include <avr/io.h>
#include "config.h"
#include "player.h"
#include "vs10xx.h"
#include <Fat16.h>
#include <Fat16Util.h>
#include "newSDLib.h"
#include <SoftwareSerial.h>
SoftwareSerial RFID = SoftwareSerial(2,3);
char character;
String Card_id;
void setup()
{
Serial.begin(9600);
RFID.begin(9600);
InitSPI();
InitIOForVs10xx();
InitIOForKeys();
InitIOForLEDs();
Mp3Reset();
if (!initialSDCard())
return;
RED_LED_ON();//light red LED
// Serial.println("opening toc.txt");
// if (file.open("toc.txt", O_READ)) {
// Serial.println("toc opened");
// int16_t c;
// String id="";
// while ((c = file.read()) != ' '){
// id+=(char)c;
// }
// String foldername="";
// while ((c = file.read()) != '\n'){
// foldername+=(char)c;
// }
// Serial.println(foldername);
// file.close();
}
}
void loop()
{
Serial.println("loop!");
Serial.println("begin play!");
while(RFID.available() >0){
character = RFID.read();
Card_id+=character;
}
if (Card_id.length()>10){
Card_id = Card_id.substring(1,13);
}
Serial.println(Card_id);
if (Card_id.length()>0){
if (Card_id.equals("2B00B53A0FAB")){
playFile("0001x01.mp3");
}else{
playFile("0002x01.mp3");
}
Card_id= "";
}
delay(200);
}
It works!
Left to do:
-1- figure out how to get it to run outside of usb with serial monitor with a 9 V power supply.
-2-buttons for control volume up and down work, but next/previous track do not when playing by name. however this works when using play all example. i need to see how it’s done so i allow navigation inside an album.
-3- case. i think i will use a 50 blank CD spool case. buttons for volume up/down, track next/previous play/pause and reset will be moved outside the box as well as popwer connector and audio jack.
-4-using folders to store files.