Riproduttore audio Arduino Due

Ciao a tutti, sono uno studente di seconda (quasi terza) superiore e sono nuovo del forum, perciò scusatemi se ho inserito il post nella sezione sbagliata. Da tempo sto cercando di risolvere un problema riguardo un semplice riproduttore musicale con Arduino Due: sostanzialmente è basato sull'esempio SimpleAudioPlayer incluso nell'IDE 1.5.2.
Carico il file audio in formato WAV nella SD, attacco l'Arduino al pc, scrivo sul terminale la canzone che voglio e la sento bene; però i problemi arrivano quando voglio sentire un'altra canzone senza resettare l'Arduino.
Il file viene riprodotto, però con delle pause, diciamo che "lagga". Cosa può essere?
Ecco il codice:

#include <SD.h>
#include <SPI.h>
#include <Audio.h>
char AudioFileName[16];
File root;
void setup()
{

  Serial.begin(9600);
  while(!Serial){
    ;
  }
  Serial.println();

  Serial.print("Preparazione scheda SD...");
  if (!SD.begin(4)) {
    Serial.println(" fallito!");
    return;
  }
  Serial.println(" fatto.");

  SPI.setClockDivider(4);

 

  Audio.begin(88200, 100);
  
  root = SD.open("/");
  
  printDirectory(root, 0);
  
 
}

//---------------------------------------------------------
  
 void printDirectory(File dir, int numTabs) {
   while(true) {
     
     File entry =  dir.openNextFile();
     if (! entry) {
      
       Serial.println("**Lista completa**");
       break;
     }
     for (uint8_t i=0; i<numTabs; i++) {
       Serial.print('\t');
     }
     Serial.print(entry.name());
     if (entry.isDirectory()) {
       Serial.println("/");
       printDirectory(entry, numTabs+1);
     } else {
      
       Serial.print("\t\t");
       Serial.println(entry.size(), DEC);
     }
     entry.close();
   }
}
  
//---------------------------------------------------------



void loop()
{
  analogReadResolution(10);
  int count=0;
  uint8_t c;
  
  inizio:
 //---------------------------------------------------------
    count = 0;
  Serial.println("\r\nNome della canzone");
  do {
    while(!Serial.available()) ;
    c = Serial.read();
    if(c > ' ') AudioFileName[count++] = c;
  } while((c != 0x0d) && (c != 0x0a) && (count < 14));
  AudioFileName[count++] = 0;
  
  
  //--------------------------------------------------------
  Serial.print("Sto cercando la canzone...");
  Serial.println(AudioFileName);

  File myFile = SD.open(AudioFileName);
  if (!myFile) {

    Serial.print("Errore apertura:");
    Serial.print(AudioFileName);
    Serial.println();
    goto inizio;
  }
  else {
    Serial.println("trovata.");
  }
  const int S=1024; 
  short buffer[S];
  
  Serial.println("In riproduzione");
  Serial.println("(Premi 's' per fermare)");
//--------------------------------------------
  while (myFile.available()) {
    if(Serial.available()>0){ 
     if(Serial.read()=='s'){ 
      Serial.read(); 
       goto inizio;
    } 
    }
 
    myFile.read(buffer, sizeof(buffer));


    int volume = 1024;
    Audio.prepare(buffer, S, volume);

    Audio.write(buffer, S);

 
    count++;
    if (count == 100) {
      Serial.print("*");
      count = 0;
    }
  }
  myFile.close();

  Serial.println("Fine");
  goto inizio;
  
  //--------------------------------------------------------

 
}

Intanto vi ringrazio in anticipo per le risposte.

credo sia colpa della seriale, ti rallenta.

prova a usare un baudrate più alto, o riducendo al minimo l'uso della Seriale in punti "critici" del codice.

edit: e perfavore, fai sparire quei goto

Niente da fare, la prima canzone che riproduce si sente bene, dalla seconda in poi "lagga". La seriale ho provato a metterla a 115200 BAUD, i goto li ho sostituiti con loop(); , a parte l'ultimo che è superfluo e che ho tolto. Il pezzo di codice per stampare "*" l'ho eliminato, senza ottenere risultati. Potrebbe essere che l'IDE non supporti completamente la libreria audio?

uhmm allora, o è un problema di comunicazione o il chip della shield fa le bizze.

Puoi analizzare il flusso dati tra shield e arduino?

Non uso shild, è solo l'arduino due :slight_smile:

AHhhhhh ok, allora credo tu abbia beccato un bug della libreria. Su github trovi il progetto arduino, apri un bug includendo il codice e una buona spiegazione del problema (in inglese), se vuoi posso farlo anche io, ma poi dovremmo rimanere in contatto nel caso facciano delle fix da testare.. quindi meglio se segui te.

Proverò come dici te a scrivere su github. Mi dispiace che ci sia questo problema perchè la libreria audio è ottima, e la qualità è buona. Intanto grazie per il tuo aiuto.

Finalmente il problema è risolto, grazie a theNickO, che mi ha risposto su github. Ecco il codice:

#include <SD.h>
#include <SPI.h>
#include <Audio.h>
char AudioFileName[16];
File root;
void setup()
{

  Serial.begin(9600);
  while(!Serial){
    ;
  }
  Serial.println();

  Serial.print("Preparazione scheda SD...");
  if (!SD.begin(4)) {
    Serial.println(" fallito!");
    return;
  }
  Serial.println(" fatto.");

  SPI.setClockDivider(4);

 

  //Audio.begin(88200, 100);
  
  root = SD.open("/");
  
  printDirectory(root, 0);
  
 
}

//---------------------------------------------------------
  
 void printDirectory(File dir, int numTabs) {
   while(true) {
     
     File entry =  dir.openNextFile();
     if (! entry) {
      
       Serial.println("**Lista completa**");
       break;
     }
     for (uint8_t i=0; i<numTabs; i++) {
       Serial.print('\t');
     }
     Serial.print(entry.name());
     if (entry.isDirectory()) {
       Serial.println("/");
       printDirectory(entry, numTabs+1);
     } else {
      
       Serial.print("\t\t");
       Serial.println(entry.size(), DEC);
     }
     entry.close();
   }
}
  
//---------------------------------------------------------



void loop()
{
  analogReadResolution(10);
  int count=0;
  uint8_t c;
  
  inizio:
 //---------------------------------------------------------
 Audio.begin(88200, 100);
    count = 0;
  Serial.println("\r\nNome della canzone");
  do {
    while(!Serial.available()) ;
    c = Serial.read();
    if(c > ' ') AudioFileName[count++] = c;
  } while((c != 0x0d) && (c != 0x0a) && (count < 14));
  AudioFileName[count++] = 0;
  
  
  //--------------------------------------------------------
  Serial.print("Sto cercando la canzone...");
  Serial.println(AudioFileName);

  File myFile = SD.open(AudioFileName);
  if (!myFile) {

    Serial.print("Errore apertura:");
    Serial.print(AudioFileName);
    Serial.println();
    goto inizio;
  }
  else {
    Serial.println("trovata.");
  }
  const int S=1024; 
  short buffer[S];
  
  Serial.println("In riproduzione");
  Serial.println("(Premi 's' per fermare)");
//--------------------------------------------
  while (myFile.available()) {
    if(Serial.available()>0){ 
     if(Serial.read()=='s'){ 
      Serial.read(); 
       goto inizio;
    } 
    }
 
    myFile.read(buffer, sizeof(buffer));


    int volume = 1024;
    Audio.prepare(buffer, S, volume);

    Audio.write(buffer, S);

 
    count++;
    if (count == 100) {
      Serial.print("*");
      count = 0;
    }
  }
  myFile.close();
  Audio.end();
  Serial.println("Fine");
  goto inizio;
  
  //--------------------------------------------------------

 
}

Ringrazio anche lesto, che mi ha aiutato molto nella ricerca del problema.