Dfrobotdfplayermini

Salve gente, sono nuovo nell' uso di arduino e nello specifico di questa scheda da cui il nome del mio nuovo argomento.

/***************************************************
DFPlayer - A Mini MP3 Player For Arduino
 <https://www.dfrobot.com/index.php?route=product/product&product_id=1121>
  
 ***************************************************
 This example shows the basic function of library for DFPlayer.
  
 Created 2016-12-07
 By [Angelo qiao](Angelo.qiao@dfrobot.com)
  
 GNU Lesser General Public License.
 See <http://www.gnu.org/licenses/> for details.
 All above must be included in any redistribution
 ****************************************************/
 
/***********Notice and Trouble shooting***************
 1.Connection and Diagram can be found here
 <https://www.dfrobot.com/wiki/index.php/DFPlayer_Mini_SKU:DFR0299#Connection_Diagram>
 2.This code is tested on Arduino Uno, Leonardo, Mega boards.
 ****************************************************/
 
#include "Arduino.h"
#include "SoftwareSerial.h"
#include "DFRobotDFPlayerMini.h"
 
SoftwareSerial mySoftwareSerial(11, 10); // RX, TX il 2 del df è il tx che va collegato al 3 dell' rx
DFRobotDFPlayerMini myDFPlayer;
void printDetail(uint8_t type, int value);
 
void setup()
{
  pinMode(2,OUTPUT);
  mySoftwareSerial.begin(9600);
  Serial.begin(9600);
   
  Serial.println();
  Serial.println(F("DFRobot DFPlayer Mini Demo"));
  Serial.println(F("Initializing DFPlayer ... (May take 3~5 seconds)"));
   
  if (!myDFPlayer.begin(mySoftwareSerial)) {  //Use softwareSerial to communicate with mp3.
    Serial.println(F("Unable to begin:"));
    Serial.println(F("1.Please recheck the connection!"));
    Serial.println(F("2.Please insert the SD card!"));
    while(true);
  }
  Serial.println(F("DFPlayer Mini online."));
   
  myDFPlayer.volume(10);  //Set volume value. From 0 to 30
  myDFPlayer.play(1);  //Play the first mp3
  digitalWrite(2,HIGH);
}
 
void loop()
{
  
  static unsigned long timer = millis();
   
  /*if (millis() - timer > 3000) {
    timer = millis();
    myDFPlayer.next();  //Play next mp3 every 3 second.
  }*/
   
  if (myDFPlayer.available()) {
    printDetail(myDFPlayer.readType(), myDFPlayer.read()); //Print the detail message from DFPlayer to handle different errors and states.
  }
}
 
void printDetail(uint8_t type, int value){
  switch (type) {
    case TimeOut:
      Serial.println(F("Time Out!"));
      break;
    case WrongStack:
      Serial.println(F("Stack Wrong!"));
      break;
    case DFPlayerCardInserted:
      Serial.println(F("Card Inserted!"));
      break;
    case DFPlayerCardRemoved:
      Serial.println(F("Card Removed!"));
      break;
    case DFPlayerCardOnline:
      Serial.println(F("Card Online!"));
      break;
    case DFPlayerPlayFinished:
      Serial.print(F("Number:"));
      Serial.print(value);
      Serial.println(F(" Play Finished!"));
      break;
    case DFPlayerError:
      Serial.print(F("DFPlayerError:"));
      switch (value) {
        case Busy:
          Serial.println(F("Card not found"));
          break;
        case Sleeping:
          Serial.println(F("Sleeping"));
          break;
        case SerialWrongStack:
          Serial.println(F("Get Wrong Stack"));
          break;
        case CheckSumNotMatch:
          Serial.println(F("Check Sum Not Match"));
          break;
        case FileIndexOut:
          Serial.println(F("File Index Out of Bound"));
          break;
        case FileMismatch:
          Serial.println(F("Cannot Find File"));
          break;
        case Advertise:
          Serial.println(F("In Advertise"));
          break;
        default:
          break;
      }
      break;
    default:
      break;
  }
}

'''
A fronte di questo codice della libreria propria DFRobot DFPlayer, non riesco a suonare la canzone che ho inserito nella scheda sd. Nello specifico, la scheda sd ha una canzone in una cartella, ma in un modo a me sconosciuto ha suonato una volta, per poi non essere più stato in grado di rifarlo.
Inoltre, una volta lanciato il codice, l' autoparlante emette un brevissimo suono, ma non viene scritto nulla in seriale, e la scheda non mostra la luce blu di funzionamento.
Allego lo schema, ma lo ho realizzato in fisico. Grazie già in anticipo

Buongiorno e benvenuto nella sezione Italiana del forum, :slight_smile:

cortesemente, come prima cosa, leggi attentamente il REGOLAMENTO di detta sezione, (... e, per evitare future possibili discussioni/incomprensioni, prestando molta attenzione al punto 15), dopo di che, come da suddetto regolamento (punto 16.7), fai la tua presentazione NELL'APPOSITA DISCUSSIONE (... quello che vedi in blu è un link, fai click su di esso per raggiungere la discussione) spiegando bene quali esperienze hai in elettronica e programmazione, affinché noi possiamo conoscere la tua esperienza ed esprimerci con termini adeguati.

Grazie,

Guglielmo

P.S.: Ti ricordo che, purtroppo, fino a quando non sarà fatta la presentazione nell’apposita discussione, nel rispetto del succitato regolamento nessuno ti risponderà (eventuali risposte o tuoi ulteriori post, verrebbero temporaneamente nascosti), quindi ti consiglio di farla al più presto. :wink:

Ciao.
Usi lanciare il Tuo file in SETUP, che viene richiamata solo allo start_up, e quindi esegue il comando solo una volta...vedi ...

myDFPlayer.play(1);  //Play the first mp3

Nel mio progetto uso una cartella (folder) di nome MP3 e altre numeriche dalla 1 alla 16 ed ognuna contiene da 50 a 254 file ! E funziona molto bene per un totale di ++1900 files, ma con qualche trucco che pero' non serve con pochi file e poche folder.

io uso i seguenti comandi:

 myDFPlayer.playFolder(15, 4);  //play specific mp3 in SD:/15/004.mp3; Folder Name(1~99); File Name(1~255)

che vuol dire; nome Folder = 15 e nome del file audio = 004.mp3
oppure

myDFPlayer.playMp3Folder(4); //play specific mp3 in SD:/MP3/0004.mp3; File Name(0~65535)

che vuol dire; nome Folder = MP3 e nome del file audio = 0004.mp3

la regola delle numerazioni progressive dei file sulla SD e' obbligatoria.
attento che dopo ogni comando il DF_RobotMP3 necessita quasi sempre di un dely(100) perche' non e' velocissimo a rispondere ai comandi, cosi' come impiega circa 4/5 secondi a rispondere all'avio iniziale della seriale.

la resistenza da 1 kilo ohm e' valida ma limita la corrente e non la tensione sulla scheda, io utilizzo un partitore con una resitenza da 1.2kilo ohm al posto della Tua da 1 kilo e tra il pin Rx del DF0299 e massa una da 2.2kilo Ohm cosi' da ottenere una caduta di tensione a circa 3 volt.

Mai usato il comando myDFPlayer.play(1).
Vedo che il software fa parte della libreria, allora il problema potrebbe essere la seriale verso il DF0299 e la sua risposta.
inoltre..

delay(100);
myDFPlayer.volume(25);                  // internal Volume (between 0 to 30)
delay(500);

poi esegui il myDFPlayer.play(1);
notare i delay() prima/dopo ogni comando.

Divertiti...
PS: io ho risposto, poi mitico Guglielmo la renderà fruibile quando e SE ti presenterai !! :wink:

Presentazione fatta. Lei mi consiglia di riscrivere la mia domanda?

No, no, si prosegue qui ... guarda la risposta poco sopra.

Guglielmo

Ciao Christianlots.

Se vuoi puoi "ascoltare" i suggerimenti di Paolo Aliverti su Youtube; può essere molto utile. Cerca su internet. Titolo è il seguente:

Utilizzare correttamente il modulo DFPlayerMini per gli mp3 con Arduino - Video 593

nota: il suo esempio hardware utilizza le uscite DAC per amplificatore esterno.

Mauro.

Grazie per la nozione. Alcune domande per rendermi più chiare le idee:
-Vedo che il software fa parte della libreria, allora il problema potrebbe essere la seriale verso il DF0299 e la sua risposta.
Questa parte qui come posso risolverla?
-Quindi secondo le tue conoscenze mi converrebbe creare una cartella mp3 e all' interno numerare del tipo 001 i file?
-Riguardo Paolo Aliverti, ho già visionato questo suo video, ho seguito le sue indicazioni, e i problemi che ti ho descritto nascevano proprio da lì. Proverò a rivedere il video. Grazie per i consigli. Sggiornerò tale sezione in caso di ulteriori problemi o soluzione efficace.

@christianlots: Ma hai letto le specifiche di quel modulo? Hai letto, con un altoparlante
esterno quanto arriva ad assorbire? La corrente che il pin5V di Arduino può fornire, se poco poco alzi il volume, è del tutto insufficiente ... tienne conto e pensa poi ad un alimentatore separato.

Guglielmo

Ne terrò conto e aggiornerò. Ciò che mi lascia perplesso è che come ho detto precedentemente sono riuscito una sola volta a riprodurre un mp3, ecco perchè ora come ora che non trovo più il modo sono in difficoltà, proverò tutte le modifiche da voi suggeritomi. Grazie.

Ho generato una tensione di 3.3 V e sembra funzionare. Ciò che non riesco a capire perchè non mi scriva i messaggi di allarme in seriale. Inoltre

void loop()
{
  
  //static unsigned long timer = millis();
  //delay(100);
  //delay(500);
  
  //delay(500); 
  /*if (millis() - timer > 3000) {
    timer = millis();
    myDFPlayer.next();  //Play next mp3 every 3 second.
  }*/
  delay(500);
  myDFPlayer.volume(25);                  // internal Volume (between 0 to 30)
  delay(500);
  myDFPlayer.play(1);
  delay(1000);
  if (myDFPlayer.available()) {
    printDetail(myDFPlayer.readType(), myDFPlayer.read()); //Print the detail message from DFPlayer to handle different errors and states.
  }
}

Con questo loop la canzone viene riprodotta per solo un secondo(delay(1000)). Come faccio per riprodurla nella sua interezza?`

2 secondi, forse, dopo i quali ricomincia il loop e ricomincia la riproduzione!

Ho provato a lanciare dfPlayer.PLAY(1) esclusivamente e la canzone veniva riprodotta per un niente. L' unica soluzione che ho pensato è mettere un delay con la durata della canzone ma non mi sembra un metodo consono e tantomeno efficace. Qualcuno sa darmi consigli a riguardo?

delay(500);
  myDFPlayer.volume(25);                  // internal Volume (between 0 to 30)
  delay(500);
  myDFPlayer.play(1);

Inoltre, dal sito del produttore vedo che con i pin IO1 e IO2, ADKEY1 E ADKEY2 si può regolare volume e saltare canzone/stoppare/ricominciare. E' possibile farlo senza codice? Io ci ho provato ma senza successo. Ho collegato un pulsante(sempre fisicamente non su un ambiente online) e nello specifico i suoi pin inferiori: quello di sinistra al pin 9(IO1) e quello di destra a gnd. Dovrei inserirci una resistenza? Non dà i frutti sperati.
https://www.youtube.com/watch?v=18QqMNa6Eq0&ab_channel=ZinTechIdeas.
Ho seguito i passaggi di questo video.

Ciao Christianlots.

Ok, posso dirti che sulle riviste ElettronicaIN ci sono stati articoli al riguardo, sia con software (Arduino) che hardware a tasti, e dovresti recuperare le informazioni da li iscrivendoti e acquistando la rivista (cartacea e/o digitale).
Comunque dal lato software prova quanto qui sotto.
Devi pero' collegare un altro "filo" dal pin di BUSY del DF0299 ad Arduino e impostarlo come input.
Ricordati sempre un delay da 100/200 ms DOPO ogni comando.
vedi di seguito, dovrebbe funzionare. Facci sapere ... :wink:

// define input pin where connect the BUSY signal from DF0299
#define DF_Busy 6   // DF0299 is in play=0/pause=1

void setup() {
  //
  pinMode(DF_Busy, INPUT);                // if DF0299 not in play = 1

// HERE MUST activate the serial communication to DF0299 ...>

  // choose Your volume level
  myDFPlayer.volume(15);                  // internal Volume (between 0 to 30)
  delay(100);                             // give time to DF0299 to perform the request
}

void loop() {

// if DF0299 is NOT in play, start command for play song-track #1
// after wait a time (2S) for avoid recursive play command (if DF0299 respond)
// This will be repeated till power off, play always song #1 indefinetely
 if(digitalRead(DF_Busy) == HIGH     // player is NOT in run
  {
    delay(2000);
    myDFPlayer.play(1);
    delay(2000);                     // give time DF0299 respond with "play song"
  }
  if(digitalRead(DF_Busy) == LOW 
  {
   // here You can do other task. while sing the song    
  }
  
}
/* Altri comandi da provare... ;)
 *  
 * myDFPlayer.next();
 * myDFPlayer.previous();
 * myDFPlayer.pause();
 * myDFPlayer.start(); // after pause
 * myDFPlayer.stop();
 */

Salve, ho preso dei giorni per valutare le vostre modifiche e attuarne delle altre.
https://youtu.be/18QqMNa6Eq0?si=BVPBjQ1NYON53Sdv.
Seguendo questo video, sono riuscito a usare i pulsante collegati ai pin IO1,IO2, e adKEY1, che rispettivamente permettono di andare alla canzone successiva/alzare il volume, canzone precedente/ridurre il volume, e poi far ricominciare la canzone. Il pin adkey2, che secondo il video dovrebbe permettermi di interrompere la canzone, falla incominciare, non produce gli effetti sperati. Sto valutando di usare i pulsanti universali, come suggerisce la libreria ufficiale, stanno arrivando. Nel contempo; con questo codice:

DFPlayer - A Mini MP3 Player For Arduino
 <https://www.dfrobot.com/index.php?route=product/product&product_id=1121>
  
 ***************************************************
 This example shows the basic function of library for DFPlayer.
  
 Created 2016-12-07
 By [Angelo qiao](Angelo.qiao@dfrobot.com)
  
 GNU Lesser General Public License.
 See <http://www.gnu.org/licenses/> for details.
 All above must be included in any redistribution
 ****************************************************/
 
/***********Notice and Trouble shooting***************
 1.Connection and Diagram can be found here
 <https://www.dfrobot.com/wiki/index.php/DFPlayer_Mini_SKU:DFR0299#Connection_Diagram>
 2.This code is tested on Arduino Uno, Leonardo, Mega boards.
 ****************************************************/
 
#include "Arduino.h"
#include "SoftwareSerial.h"
#include "DFRobotDFPlayerMini.h"
 
SoftwareSerial mySoftwareSerial(11, 10); // RX, TX il 2 del df è il tx che va collegato al 3 dell' rx
DFRobotDFPlayerMini myDFPlayer;
void printDetail(uint8_t type, int value);
 #define DF_Busy 6
 #define bottone_pausa 2
void setup()
{
  pinMode(bottone_pausa,INPUT);
  pinMode(DF_Busy, INPUT);  
  //mySoftwareSerial.begin(9600);
  //Serial.begin(115200);
  Serial.println();
  Serial.println(F("DFRobot DFPlayer Mini Demo"));
  Serial.println(F("Initializing DFPlayer ... (May take 3~5 seconds)"));
   
  if (!myDFPlayer.begin(mySoftwareSerial)) {  //Use softwareSerial to communicate with mp3.
    Serial.println(F("Unable to begin:"));
    Serial.println(F("1.Please recheck the connection!"));
    Serial.println(F("2.Please insert the SD card!"));
    while(true);
  }
  Serial.println(F("DFPlayer Mini online."));
  myDFPlayer.volume(25); 
  myDFPlayer.play(1);
}
 
void loop()
{

  const int debounceDelay = 500; // Tempo di debounce in millisecondi
  unsigned long lastButtonPress = 0; // Memorizza il tempo dell'ultima pressione del pulsante
  int buttonState = digitalRead(bottone_pausa); // Leggere lo stato del pulsante
  unsigned long currentMillis = millis(); // Ottenere il tempo corrente in millisecondi
  if (buttonState == HIGH) { // Se il pulsante viene premuto
    if (currentMillis - lastButtonPress > debounceDelay) { // Controllare il debounce
      lastButtonPress = currentMillis; // Aggiornare il tempo dell'ultima pressione del pulsante
      if(digitalRead(DF_Busy) == HIGH     // player is NOT in run
      {
        delay(2000);
        myDFPlayer.start();
        delay(2000);                     // give time DF0299 respond with "play song"
      }
      if(digitalRead(DF_Busy) == LOW 
      {
        delay(2000);
        myDFPlayer.pause();
        delay(2000); 
      }
    }
  }

}

  
  


  
 
  
  
  
}
 
void printDetail(uint8_t type, int value){
  switch (type) {
    case TimeOut:
      Serial.println(F("Time Out!"));
      break;
    case WrongStack:
      Serial.println(F("Stack Wrong!"));
      break;
    case DFPlayerCardInserted:
      Serial.println(F("Card Inserted!"));
      break;
    case DFPlayerCardRemoved:
      Serial.println(F("Card Removed!"));
      break;
    case DFPlayerCardOnline:
      Serial.println(F("Card Online!"));
      break;
    case DFPlayerPlayFinished:
      Serial.print(F("Number:"));
      Serial.print(value);
      Serial.println(F(" Play Finished!"));
      break;
    case DFPlayerError:
      Serial.print(F("DFPlayerError:"));
      switch (value) {
        case Busy:
          Serial.println(F("Card not found"));
          break;
        case Sleeping:
          Serial.println(F("Sleeping"));
          break;
        case SerialWrongStack:
          Serial.println(F("Get Wrong Stack"));
          break;
        case CheckSumNotMatch:
          Serial.println(F("Check Sum Not Match"));
          break;
        case FileIndexOut:
          Serial.println(F("File Index Out of Bound"));
          break;
        case FileMismatch:
          Serial.println(F("Cannot Find File"));
          break;
        case Advertise:
          Serial.println(F("In Advertise"));
          break;
        default:
          break;
      }
      break;
    default:
      break;
  }
}

collegando il pulsante opportunamente, ma quando viene riprodotto il comando pause, ho sempre lo stesso problema, ossia la canzone ricomincia dall' inizio, e si spegne la luce della scheda. Avete suggerimenti? Inoltre, con l' uso del delay, la canzone viene riprodotta sempre e solo per il tempo indicato lì...

Ciao christianlots.
Spero il DFR0299 sia della DF Robot, e non un clone dei cloni...
Comunque ti mando questa idea, con 1 pulsante fai play,pause,restart ma sempre della stessa canzone....e comincia a vedere se funziona.

# define bottone_pausa 2
# define DF_Busy 6
bool DF_Pause = false;
//
void setup() {

  pinMode(bottone_pausa,INPUT);  // NOTA: pulsante con resistenza verso massa..
  pinMode(DF_Busy, INPUT);  
// qui ...il Tuo setup SENZA myDFPlayer.play(1);
}
//
void loop() {
//
// qui .... la Tua lettura del pulsante  
//
if(buttonState) {
 
 if(digitalRead(DF_Busy) == LOW)    // sta suonando quindi POSSO mettere in PAUSA
 {
    myDFPlayer.pause();
    delay(100);
    DF_Pause = true;      // memoria che ci troviamo in PAUSA
    delay(1000);          // togli il dito dal pulsante !
 }
//
 else                     // non suona.. quindi ...
 {
    if(DF_Pause)          // non suona DOPO che siamo andati in PAUSA
    {
      myDFPlayer.start(); // riparti
      delay(100);
      DF_Pause = false;  // reset memoria che ci troviamo in PAUSA
      delay(1000);        // togli il dito dal pulsante !
    }
    else                  // non suona e NON siamo in PAUSA, quindi parte la canzone
    {
      myDFPlayer.play(1);
      delay(1000);        // togli il dito dal pulsante ! 
    }
 }
}

}

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.