#include <SPI.h> #include <Adafruit_VS1053.h> #include <SD.h> #define SHIELD_CS 7 // VS1053 chip select pin (output) #define SHIELD_DCS 6 // VS1053 Data/command select pin (output) #define DREQ 3 // VS1053 Data request, ideally an Interrupt pin #define CARDCS 4 // Card chip select pin Adafruit_VS1053_FilePlayer musicPlayer = Adafruit_VS1053_FilePlayer(SHIELD_CS, SHIELD_DCS, DREQ, CARDCS);
In der setup() Methode werden musicPlayer und SD-Karte initialisiert.
// initialise the music player if (!musicPlayer.begin()) { Serial.println("VS1053 not found"); while (1); // don't do anything more } // initialise the SD card SD.begin(CARDCS);
Damit das Abspielen der MP3-Dateien im Hintergrund ablaufen kann, wird Interrupt verwendet.
// If DREQ is on an interrupt pin (on uno, #2 or #3) we can do background // audio playing musicPlayer.useInterrupt(VS1053_FILEPLAYER_PIN_INT); // DREQ int
Um zu überprüfen, dass das MP3 Shield erfolgreich initialisiert worden ist, wird ein Ton ausgegeben.
musicPlayer.sineTest(0x44, 100); // Make a tone to indicate VS1053 is working
Als nächstes wird analysiert wie viele MP3s in welchen Ordnern abgelegt sind. Die Anzahl der Dateien wird in einem Array abgelegt. Jeder Eintrag im Array entspricht einem Ordner auf der SD-Karte.
unsigned int numberOfFiles[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
Es wird davon ausgegangen, dass auf der SD-Karte 10 Ordner angelegt sind, die von 0 bis 9 durchnummeriert sind. In den Ordnern 1 bis 9 liegen jeweils beliebig viele MP3-Dateien. Diese sind ebenfalls durchnummeriert (1.mp3, 2.mp3, 3.mp3, ...). Im Ordner 0 sind Konfigurationsdateien abgelegt. Es wird durch alle Ordner durchiteriert
// read the number of tracks in each folder for (byte i = 0; i < 10; i++) { String temp = "/"; temp.concat(i); char filename[3]; temp.toCharArray(filename, sizeof(filename)); numberOfFiles[i] = countFiles(SD.open(filename)); Serial.print(filename); Serial.print(": "); Serial.println(numberOfFiles[i]); }
und die Anzahl der Dateien im Ordner bestimmt.
// counts the number of files in directory unsigned int countFiles(File dir) { unsigned int counter = 0; while (true) { File entry = dir.openNextFile(); if (!entry) { // no more files break; } counter++; entry.close(); } dir.close(); return counter; }
Damit nach einem erneuten Einschalten der zuletzt gespielte Titel gespielt wird, wird dieser aus einer Datei ausgelesen. Aktueller Ordner und aktuelle Datei werden abgespeichert. Als aktuelle Datei wird der Vorgänger abgespeichert, da beim Start der nächste Track abgespielt wird.
char currentTrackFileName[] = "/0/current.txt";
byte currentFolder = 1; unsigned int currentFile = 0;
// read remembered track if (SD.exists(currentTrackFileName)) { File file = SD.open(currentTrackFileName, FILE_READ); if (file) { currentFolder = file.readStringUntil('\n').toInt(); currentFile = file.readStringUntil('\n').toInt() - 1; } file.close(); }
Nachdem jetzt die setup() Methode abgehandelt worden ist, schauen wir uns als nächstes die loop() Methode an.
Weitere Blogeinträge
- Auswahl der Komponenten
- Das Entwicklungsbrett
- Das erste Einschalten
- Die Entwicklungsumgebung
- Knöpfe (digital)
- Mehrere Knöpfe (digital)
- Mehrere Knöpfe (analog)
- Potentiometer
- Das MP3 Shield
- Auswahl der Komponenten 2
- Auswahl der Komponenten (Zusammenfassung)
- Punkt-Streifenrasterplatine und Knöpfe
- Punkt-Streifenrasterplatine und weitere Komponenten
- Das Gehäuse
- Sketch 1 (setup-Methode)
- Sketch 2 (loop-Methode)
- Sketch 3 (Der komplette Code)
- PC-Software
Hallo,
ReplyDeletedein Blog ist echt Super und ich bin ernsthaft am Überlegen den mp3-Player nachzubauen.
Da ich erst seit kurzem mit Arduino angefangen habe, bin ich bei der Programmierung noch nicht so sicher.
Hast du vor den kompletten Quellcode auf deinem Blog zu veröffentlichen?
Wann ist in etwa damit zu rechnen bzw. würdest du den Code vorab mir zusenden?
Bei der Auswahl des mp3-Shield hast du dich für das von Adafruit entschieden.
Hängt es mit der größeren Ausgangsleistung bei den Boxen zusammen oder hat es einen anderen Hintergrund?
Das Adafruit kostet ja etwa das doppelte zum ELV.
Hast du eigentlich vor nach Fertigstellung deiner Punkte den Aufbau zu „optimieren“ und z.B. das Arduino-Bord gegen eine AtMega – Chip zu tauschen.
Würde mich über eine Antwort freuen.
Gruß
Christoph
Mailadresse:feuerchaos ( at ) web ( Punkt ) de
Vielen Dank, freut mich, dass dir mein Blog gefällt.
DeleteIch bin gerade dabei den zweiten Teil des (Sketch 2 (loop-Methode)) aufzubereiten. Ich hoffe in den nächsten Tagen damit fertig zu sein. Dann wäre auch der gesamte Quellcode veröffentlicht.
Die Entscheidung für das MP3-Shield von Adafruit beruht auf mehreren Faktoren. Zum einen habe ich mir eine bessere Klangqualität versprochen. Zum anderen ist das Shield besser dokumentiert und weiterverbreitet. Auch dass das Shield weitere GPIOs zur Verfügung stellt, ist ein Pluspunkt. Die mitgelieferte Bibliothek ist außerdem umfangreicher. Eventuell kann man aber die Bibliothek von Adafruit auch mit dem ASA1 von ELV verwenden. Dadurch würde der Vorteil der Bibliothek wegfallen. Man müsste es halt mal ausprobieren und gegebenenfalls Anpassungen vornehmen. Für das ASA1 spricht vor allem der Preis und dass die Buchsen (Header) bereits drangelötet sind.
Bisher sind weitere Optimierungen nicht vorgesehen.
Viele Grüße
Hallo,
Deleteich habe mir beide Shields zugelegt, finde aber das Adafruit Shield stabiler. Das ELV shield hat sporadische Probleme beim Booten der SD-Card. Sicher ein Softwareproblem, es scheinen da mehrere Leute Probleme zu haben. Meiner Meinung nach lohnt es sich ein wenig mehr auszugeben und anschließend auf ausgereiftere Hard/Software zugreifen zu können..
Viele Grüße
Dirk