Forum: Mikrocontroller und Digitale Elektronik Mp3 Player mit Arduino


von Cornelius F. (firlefranz)


Lesenswert?

Hallo zusammen,

ich bastele gerade an einem MP3 Player auf Basis des ASA1 Shields von 
ELV. Dieser greift auf eine VS1011 Bibliothek zu. Gesteuert wird das 
Ganze über ein Tastenpad mit 11 Knöpfen. Diese sind alle über einen 
analogen Anschluss am Arduino, welcher entsprechend der anliegenden 
Spannung den Wert "Button" auf eine Zahl zwischen 1 und 11 setzt, bzw. 
auf 99, solange keine Taste gedrückt wird.

Jetzt würde ich es gerne so einrichten, dass pro Taste genau ein Lied 
(von mir aus Taste 1 = MP3 001.mp3) abgespielt wird. Ich scheitere 
derzeit aber schon daran, die Wiedergabe eines laufenden Stückes zu 
unterbrechen, sobald eine Taste gedrückt wird, da er offensichtlich den 
Button-Wert während des MP3 pufferns nicht abfragt.

Könnt ihr mir hier weiter helfen? Anbei der Code:

#include <SD.h>
#include <SPI.h>
#include <AudioShield.h>

//Variable für Dateinamen anlegen
char filename[13] = "001.mp3";

//Zähler für Dateien
unsigned char filenumber = 1;

int Button=99;
int Volume;

void setup() {
   Serial.begin(9600);
   Serial.println("Los geht's");

   Volume = analogRead(A4);

   //SD-Karte initialisieren
   //SD_CS als parameter übergeben, da hier ChipSelect anders belegt
   if( SD.begin( SD_CS ) == false )
   {
     Serial.println("Karte fehlt oder ist fehlerhaft");
     // Programm beenden, da keine SD-Karte vorhanden
     return;
   }
   Serial.println("Karte initialisiert.");

   //MP3-Decoder initialisieren
   VS1011.begin();
}

void loop() {
 Button = Keypad();
  //Puffer für MP3-Decoder anlegen
  //MP3-Decoder erwartet Daten immer in 32 Byte Blöcken
  unsigned char buffer[32];

  //Datei öffnen und abspielen
  if( File SoundFile = SD.open( filename ) )
  {
    //Verstärker einschalten
    VS1011.UnsetMute();

    //Datei bis zum Ende abspielen
    while( (SoundFile.available()) && (Button = 99))
    {
      //Puffer mit Daten aus der Datei füllen
      SoundFile.read( buffer, sizeof(buffer) );
      //Daten aus Puffer an MP3-Decoder senden
      VS1011.Send32( buffer );
      Volume = analogRead(A4);
      Volume = map(Volume, 0, 1023, 0, 255);
      VS1011.SetVolume(Volume,Volume);
    }

    //Internen Datenpuffer vom MP3-Decoder mit Nullen füllen
    //damit sicher alles im Puffer abgespielt wird und Puffer leer ist
    //MP3-Decoder besitzt 2048 Byte großen Datenpuffer
    VS1011.Send2048Zeros();

    //Verstärker deaktivieren
    VS1011.SetMute();

  }
  else
  {
  }

  //Dateizähler auf 100 begrenzen und zurücksetzen
  if( filenumber >= 100 )
  {
    filenumber = 0;
  }

  //nächste Datei auswählen
  sprintf(filename, "%03d.mp3", ++filenumber);

  //Wartezeit zwischen Durchläufen 500ms
  delay( 500 );

}


int Keypad(){
  int Button = 0;
  int Tastenwert = 470;
  Tastenwert = analogRead(A5);
 if (Tastenwert>870) {
   Button=4;
  }
 else if (Tastenwert>700) {
   Button=5;
 }
 else if (Tastenwert>670) {
   Button=6;
 }
 else if (Tastenwert>610) {
   Button=1;
 }
 else if (Tastenwert>550) {
   Button=2;
 }
 else if (Tastenwert>500) {
   Button=3;
 }
 else if (Tastenwert>460) {
   Button=99;
 }
  else if (Tastenwert>410) {
   Button=9;
 }
 else if (Tastenwert>360) {
   Button=8;
 }
 else if (Tastenwert>300) {
   Button=7;
 }
 else if (Tastenwert>200) {
   Button=11;
 }
  else if (Tastenwert>120) {
   Button=10;
 }
return Button;
}

von Mw E. (Firma: fritzler-avr.de) (fritzler)


Lesenswert?

Bei dem Murkscode wundert dich das?
Wenn die Keypad() in der whileschleife nicht aufgerufen wird, kann das 
auch ned klappen.

Hier kannste dir ne inspiration holen:
http://www.fritzler-avr.de/HP/soundm.php

von Tobias (Gast)


Lesenswert?

Es ist zwar schon etwas älter, aber ich frage trozdem mal:

Welche Hardware verwendest du? Und wie hast du die Taster angeschlossen? 
Ich habe hier einen Arduino Uno und auch das ASA1. Aber wenn ich das 
ASA1 auf den Uno gesetzt habe, habe ich garkein Platz mehr für Eingänge, 
oder?

von Stefan (Gast)


Lesenswert?

Er hat einen analogen Eingang verwendet, daran Taster mit 
unterschiedlichen Spannungsteilern.

von Vitali (Gast)


Lesenswert?

Hallo Cornelius,

ich bin auf dein kannst du mir die Firmware für Hörbert Nachbau 
schicken?
vitalitr gmail.com
Danke dir im Voraus
Gruß
Vitali

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.