Wednesday, February 25, 2015

Audino - Arduino MP3-Player (15) - Sketch 1 (setup-Methode)

Um das MP3 Shield ansteuern zu können wird die zur Verfügung gestellte Bibliothek verwendet. Der Beispielcode, der hier (Das MP3 Shield) zum Laufen gebracht worden ist, ist ein erster Startpunkt. Die benötigten Bibliotheken werden hinzugefügt und ein Adafruit_VS1053_FilePlayer-Objekt angelegt.

#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_CSSHIELD_DCSDREQCARDCS);

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

  1. Auswahl der Komponenten
  2. Das Entwicklungsbrett
  3. Das erste Einschalten
  4. Die Entwicklungsumgebung
  5. Knöpfe (digital)
  6. Mehrere Knöpfe (digital)
  7. Mehrere Knöpfe (analog)
  8. Potentiometer
  9. Das MP3 Shield
  10. Auswahl der Komponenten 2
  11. Auswahl der Komponenten (Zusammenfassung) 
  12. Punkt-Streifenrasterplatine und Knöpfe
  13. Punkt-Streifenrasterplatine und weitere Komponenten
  14. Das Gehäuse
  15. Sketch 1 (setup-Methode)
  16. Sketch 2 (loop-Methode)
  17. Sketch 3 (Der komplette Code)
  18. PC-Software

3 comments:

  1. Hallo,

    dein 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

    ReplyDelete
    Replies
    1. Vielen Dank, freut mich, dass dir mein Blog gefällt.

      Ich 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

      Delete
    2. Hallo,
      ich 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

      Delete