Aïe... mauvaise limonade..
J'ai testé différents scripts qui impliquait le Gpio 16 et 17, ca semble normal en utilisation input/output.
Si je fais un montage en mettant une résistance 1K sur ces ports ça devrait éviter de renvoyer du 5V sur l'Esp, non ?
Je relis votre premier message et c'est ce que vous m'aviez indiqué mais que je n'avais pas compris.
D'autre part, je n'avais pas non, plus compris votre message sur "HardwareSerial",
J'ai mappé les ports 18 et 19 (enfin bon, j'ai trouvé un script tout fait) et je n'ai toujours pas de succès.
Un peu marre là...
le nouveau script:
#include "DFRobotDFPlayerMini.h"
HardwareSerial mySoftwareSerial(1);
DFRobotDFPlayerMini myDFPlayer;
void printDetail(uint8_t type, int value);
void setup()
{
mySoftwareSerial.begin(9600, SERIAL_8N1, 18, 19); // speed, type, RX, TX
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, true)) { //Use softwareSerial to communicate with mp3.
Serial.println(myDFPlayer.readType(), HEX);
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.setTimeOut(500); //Set serial communictaion time out 500ms
//----Set volume----
myDFPlayer.volume(10); //Set volume value (0~30).
myDFPlayer.volumeUp(); //Volume Up
myDFPlayer.volumeDown(); //Volume Down
//----Set different EQ----
myDFPlayer.EQ(DFPLAYER_EQ_NORMAL);
//----Set device we use SD as default----
myDFPlayer.outputDevice(DFPLAYER_DEVICE_SD);
int delayms = 100;
//----Mp3 play----
//----Read imformation----
Serial.println(F("readState--------------------"));
Serial.println(myDFPlayer.readState()); //read mp3 state
Serial.println(F("readVolume--------------------"));
Serial.println(myDFPlayer.readVolume()); //read current volume
//Serial.println(F("readEQ--------------------"));
//Serial.println(myDFPlayer.readEQ()); //read EQ setting
Serial.println(F("readFileCounts--------------------"));
Serial.println(myDFPlayer.readFileCounts()); //read all file counts in SD card
Serial.println(F("readCurrentFileNumber--------------------"));
Serial.println(myDFPlayer.readCurrentFileNumber()); //read current play file number
Serial.println(F("readFileCountsInFolder--------------------"));
Serial.println(myDFPlayer.readFileCountsInFolder(3)); //read fill counts in folder SD:/03
Serial.println(F("--------------------"));
Serial.println(F("Primeiro som:"));
delay(1000);
playTrackX(1);
}
void loop()
{
// static unsigned long timer = millis();
if (Serial.available()) {
String inData = "";
inData = Serial.readStringUntil('\n');
if (inData.startsWith("n")) {
Serial.println(F("next--------------------"));
myDFPlayer.next();
Serial.println(myDFPlayer.readCurrentFileNumber()); //read current play file number
} else if (inData.startsWith("p")) {
Serial.println(F("previous--------------------"));
myDFPlayer.previous();
Serial.println(myDFPlayer.readCurrentFileNumber()); //read current play file number
} else if (inData.startsWith("+")) {
Serial.println(F("up--------------------"));
myDFPlayer.volumeUp();
Serial.println(myDFPlayer.readVolume()); //read current volume
} else if (inData.startsWith("-")) {
Serial.println(F("down--------------------"));
myDFPlayer.volumeDown();
Serial.println(myDFPlayer.readVolume()); //read current volume
} else if (inData.startsWith("*")) {
Serial.println(F("pause--------------------"));
myDFPlayer.pause();
} else if (inData.startsWith(">")) {
Serial.println(F("start--------------------"));
myDFPlayer.start();
}
else if (inData.startsWith("f")) {
Serial.println(F("PLAY--------------------"));
playTrackX(5);
}
}
}
// routine to play a specific song
void playTrackX (byte x) {
mySoftwareSerial.write((byte)0x7E);
mySoftwareSerial.write((byte)0xFF);
mySoftwareSerial.write((byte)0x06);
mySoftwareSerial.write((byte)0x03);
mySoftwareSerial.write((byte)0x00);
mySoftwareSerial.write((byte)0x00);
mySoftwareSerial.write((byte)x);
mySoftwareSerial.write((byte)0xEF);
}
Sinon le code poste en #8 utilisait Serial2 directement donc les bonnes pins.
Il faudrait alimenter votre DFPlayer en 5V directement et joignant les masses avec L’ESP et en mettant le pont diviseur de tension au moins entre la broche Tx du DFPlayer et le RX2 de L’ESP. Et tester avec mon code en #8
je prends le fil de discussion en cours de route et n'ai pas de DSPlayer pour tester
il se pourrait que ce type de boucle d'attente de connection du DSPLayer plante et resette l'ESP32 (ce serait à coup sûr le cas pour un ESP8266) :
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)
;
}
Certes le watchdog reboot sur la boucle infinie mais ce n’est que dans le cas où le DFPlayer n’est pas vu. Le message d’erreur devrait avoir le temps de s’afficher sans doute.
Mais effectivement mettre un yield() serait une bonne idée pour vraiment arrêter le code
Une autre bonne idée serait de faire
myDFPlayer.begin(mySoftwareSerial, false);
Le false disant de ne pas attendre l’ACK qui pourrait être problématique sur esp ou alors d’augmenter le timeout avant le begin en faisant
myDFPlayer.setTimeOut ( 1500 ) ;
Donc le code à tester:
#include "DFRobotDFPlayerMini.h"
DFRobotDFPlayerMini myDFPlayer;
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;
}
}
void setup() {
Serial.begin(115200);
Serial2.begin(9600, SERIAL_8N1, 16, 17);
Serial.println();
Serial.println(F("DFRobot DFPlayer Mini Demo"));
Serial.println(F("Initializing DFPlayer ... (May take 3~5 seconds)"));
myDFPlayer.setTimeOut (1500) ;
if (!myDFPlayer.begin(Serial2, FALSE)) {
Serial.println(F("Unable to begin:"));
Serial.println(F("1.Please recheck the connection!"));
Serial.println(F("2.Please insert the SD card!"));
Serial.flush();
while (true) yield();
}
Serial.println(F("DFPlayer Mini online."));
myDFPlayer.volume(10); //Set volume value. From 0 to 30
myDFPlayer.play(1); //Play the first mp3
}
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.
}
}
Il y a des exemples qui montrent que cela a déjà été réalisé avec d’autres types d’esp donc c’est sans doute faisable, mais sur le github ils y a des soucis documentés par exemple lire
A voir aussi
Ici un souci de qualité ➜ testez au multimètre le fait que les pins ne soient pas connectées entre elles
Sur les dépots de plusieurs librairies pour DFPlayer Mini on commence à voir apparaître des problèmes dus à la présence de puces autres que YX5200-24SS sur des DFPlayer Mini
Quelle puce est au dos du module douteux ? YX5200-24SS ou pas ?
EDIT : je viens de mettre la main sur un DFPlayer Mini, l'ai câblé avec une carte LOLIN32 Lite, DFPlayer alimenté ici en 3,3V par la carte LOLIN32 LIte
Pour le code , j'ai fait au plus simple : après installation de la librairie proposée pour ce module par DFRobot j'ai chargé l'exemple AdvancedSettingsViaSerial1 , choisi pout éviter l'usage de SoftSerial sur une carte qui possède 3 UARTS.
Seule modification : Serial1.begin complété de la manière suivante pour adapatation à un ESP32
Serial1.begin(9600, SERIAL_8N1, 16, 17); //Rx,Tx
J'aurais pu tout aussi bien utliser Serial2 , quand aux GPIO le choix est vaste pour un port série matériel sur l'ESP32...
L'exemple tourne sans problème perceptible, l'ESP32 et le DFPlayer dialoguent.
je trouve deux fois plus de montages à problèmes que de montages qui fonctionnent... J'en ai eu pour mon argent , c'est très probablement ces modules qui sont défectueux comme vous l'aviez envisagé.
Quelque part ça me rassure.
J'ai tenté le même montage/code : rien
j'ai modifié les Gpio : nada
j'ai alimenté en 5v : pas mieux
non, c'est une puce marquée: GD3200D 2205315AC7.
Je vais probablement en acheter deux chez Dfrobot.
Tout s'explique, c'est un DFPlayer 'déviant' ! (logiquement non pris en charge par la librairie de DFRobot ..)
Peut être une solution avec cette librairie pour DFPlayer particulière de Makuna qui tente de prendre en charge des DFPlayer dont la puce est autre que YX5200-24SS présente sur les DFPlayers originels de DFRobot, il ya est question de la puce alternative MH2024K-24SS
Hélas.. j'ai essayé avec les Gpio 16 et 17 (en inversant aussi au cas-où) j'ai testé avec les Gpio 25, 26 le tout en 3.3v ou en 5v.
et rien que ce message d'erreur:
ets Jun 8 2016�ets Jun 8 2016 00:22:57
rst:0x1 (POWERON_RESET),boot:0x13 (SPI_FAST_FLASH_BOOT)
configsip: 0, SPIWP:0xee
clk_drv:0x00,q_drv:0x00,d_drv:0x00,cs0_drv:0x00,hd_drv:0x00,wp_drv:0x00
mode:DIO, clock div:1
load:0x3fff0018,len:4
load:0x3fff001c,len:1216
ho 0 tail 12 room 4
load:0x40078000,len:10944
load:0x40080400,len:6388
entry 0x400806b4
ça fait longtemps que j'aurais commandé une MEGA (plusieurs ports séries) ou UNO ou Nano et un vrai DFPlayer pour explorer, et puis ça peut toujours servir
un des soucis pour vous aider c'est que l'on ne connait pas assez les conditions de vos tests, le code utilisé , la démarche pour vous assurer que l'ensemble des éléments pris séparément (jusqu'aux fils DuPont et câble USB) fonctionnent...
tester la voie série sur 16/17 de l'ESP avec un adaptateur Série TTL vers USB
tester que l'ESP fait bien blink
alimenter le DFPlayer séparément en 5V en joignant les GND et mettre un adaptateur de tension sur la voie série entre l'ESP et le DFPlayer
ensuite ne tester qu'avec le code le plus simple fourni dans les exemples d'une des bibliothèques
Mon découragement me fais voir des pannes partout
j'ai édité le code et rajouté " mp3.playTrack(1);" sans effet.
C'est_à_dire que je tente un peu de limiter les frais ...
Mon projet est à faire en double (quelle idée...) et je ne me vois pas mettre 28€ dans deux Dfplayer de chez Dfrobot pour l'instant.
Il est très possible que je commette une erreur quelque part.
J'ai échangé mes câbles, ma source d'alim, l'esp et le dfplayer, même l'emplacement sur la board.
Le code est mon point faible, (je ne comprend peu de ce que je fais) mais logiquement j'aurais du obtenir quelque chose avec tous les codes testés, normalement.
Il vaut mieux que je renonce à la communication série tant qu'un de mes Dfplayer n'aura pas été testé par un électronicien compétent.
Voici mon nouvel axe:
-je peux me contenter de la commande de lecture d'un seul MP3.
-Je peux commander cette lecture simplement en reliant la borne "IO_1" ou "IO_2" du Dfplayer au Gnd. Ca fonctionne.
-Si je peux commander la fermeture de cette connexion par une instruction j'aurais un résultat exploitable et avancer dans mon projet.
Quel serait le moyen le plus élégant pour commander cette connexion ?
Mes recherches de débutants font ressortir les transistors Mosfet..
ou carrément ce genre de truc:
Il faudrait savoir ce qu'il passe sur le fil entre la borne "IO_1" ou "IO_2" du Dfplayer et le Gnd.
A mon avis c'est une mise à la terre de base avec quasiment aucun courant qui ne passe par là - c'est sans doute fait pour mettre un interrupteur qu'on peut relier à la masse et cette pin est en pullup côté DFPlayer
@J-M-L et @al1fch
Merci pour la piste! Je m'y mets et je vous tiendrai au courant.
édition: le tuto sur l'appareil photo est très intéressant.
A sa lecture je me dis que je pourrais peut-être commander également l'alimentation du Dfplayer de la même façon, de manière à éviter qu'il ne consomme en permanence?
Il est possible qu'il prenne un petit instant à s'initialiser mais je ne le constate pas quand je le fais fonctionner en indépendant.
Comme mes Dfplayer fonctionnent mieux en 5v , il me faudrait donc un optocoupleur qui soit commandé par du 3.3 et qui laisse passer jusqu' 5v si j'ai bien compris.
ceci pourrait correspondre ?
PC817 Features and Specifications
Input Diode Forward Voltage: 1.25V
Collector-Emitter Voltage: 80V (max)
Collector Current: 50mA (max)
Cut-off frequency: 80 kHz
Rise Time: 18us
Fall Time: 18us
Available as 4-pin DIP through hole and also as SMT package.
Youhou !
J'ai pu avancer un peu, c'est fou comme ça fait du bien...
En attendant de commander/recevoir des optocoupleurs j'ai pu mettre la main sur
un commutateur Mosfet
et ça fonctionne!
C'est pas élégant, c'est énorme mais j'avance...
Mon code est écrit (pour info, j’établis la connexion de IO_1 vers Gnd pendant 500ms)
J’éteins la lumière et le montage joue mon Mp3.
Je ne mets pas résolu car ce n'est qu'un pis-aller pour l'instant.