Go Down

Topic: DFPLAYER mini et bruit de fond (Read 730 times) previous topic - next topic

hbachetti

Apr 15, 2018, 09:25 am Last Edit: Apr 15, 2018, 10:43 am by hbachetti
Salut à tous

J'ai en cours de réalisation un carillon intelligent.
Je suis en train d'expérimenter le DFPLAYER MINI.
J'utilise la librairie DFROBOT.
Le carillon est équipé d'un détecteur de mouvement HR-SR501 afin de diffuser un premier son (chien) et éventuellement allumer la lumière en cas de visite.
Reste à compléter avec un détecteur de luminosité.
Un amplificateur à base de TDA8932 est branché en sortie du DFPLAYER, car je compte utiliser un haut-parleur de 10cm large-bande de plusieurs dizaines de watts.

J'ai dans un premier temps réglé le volume du DFPLAYER sur 5 afin de limiter la puissance de sortie.

Code: [Select]
  myDFPlayer.volume(5);

La première chose que j'ai remarqué et un bruit important, d'une part un bruit de fond au repos, et d'autre part des bruits numériques très gênants pendant la restitution d'un MP3.
J'ai lu que certains problèmes de bruit pouvaient être réglés par l'ajout de résistances de 1K sur RX TX.
Cela n'apporte rien ou presque.

L'amplificateur est hors de cause car en débranchant son entrée, le bruit de fond disparaît.
Je me suis dit que je pouvais certainement diminuer ces bruits en augmentant le signal de sortie du DFPLAYER.
J'ai donc intercalé un potentiomètre 47K logarithmique entre le DFPLAYER et l'amplificateur.



Et je règle le volume du DFPLAYER au maximum.

Code: [Select]
  myDFPlayer.volume(30);

La solution apporte un gain énorme en terme de rapport signal sur bruit.
Je passe d'une solution à peine utilisable à une solution pleinement satisfaisante.

S'il vous est déjà arrivé d'essayer un DFPLAYER et que vous avez trouvé ça exécrable en terme de bruit, voilà la solution pour le réhabiliter.
Je ne manquerai pas de créer un topic sur le projet complet.

@+



Linux is like a wigwam: no Windows, no Gates, and an Apache inside ...

dfgh

hello
je vais justement attaquer une application comme celle ci
donc inutile de te dire que j'apprécie le partage.

par contre, je constate que tu ne mets pas de résistance en talon.
ne crains tu pas de mettre la sortie en CC par inadvertance?
( par exemple en te trompant de sens de rotation sur le potentiomètre)

hbachetti

#2
Apr 15, 2018, 10:45 am Last Edit: Apr 15, 2018, 10:47 am by hbachetti
Salut

En mettant le curseur à la masse, je court-circuite l'entrée de l'ampli, pas la sortie du DFPLAYER.
J'ai changé l'image pour une image perso plus adaptée.

@+
Linux is like a wigwam: no Windows, no Gates, and an Apache inside ...

dfgh


hbachetti

#4
Apr 15, 2018, 12:55 pm Last Edit: Apr 16, 2018, 04:29 am by hbachetti
J'ai trouvé une photorésistance dans un fond de tiroir. Elle doit bien avoir 40 ans.
J'ai donc un carillon qui fait un bruit de chien quand le détecteur de présence est activé, de la lumière qui s'allume s'il fait nuit, et une sonnerie (chants d'oiseaux) quand on appuie sur le bouton de sonnette.
Un switch permet de changer de mode pour la sonnette (chants d'oiseaux ou animaux divers).

Mon code commence à ressembler  à quelque chose :

Code: [Select]

/*
 * SD CARD is organized as shown below:
 * FOLDER 01
 *    001-dog.mp3
 *    002-crocodile.mp3
 *    003-aligator.mp3
 *    004-gorilla.mp3
 * FOLDER 02
 *    001-cuckoo.mp3
 *    002-finch.mp3
 *    003-raven.mp3
 *    004-crow.mp3
 *    005-magpie.mp3
 */

#include "Arduino.h"
#include "SoftwareSerial.h"
#include "DFRobotDFPlayerMini.h"

#define BUTTON      2   // PullDown
#define PIR         3
#define SWITCH      4
#define LIGHT       7
#define LED         13
#define LUMINOSITY  1

SoftwareSerial mySoftwareSerial(5, 6); // RX, TX
DFRobotDFPlayerMini myDFPlayer;
void printDetail(uint8_t type, int value);

int buttonPressed;
int pirState = LOW;
int lightDuration = 5000;

void ButtonIsr(void)
{
  static int enable;
  static long lastDebounceTime = 0;

  if (lastDebounceTime == 0 || (millis() - lastDebounceTime) > 200) {
    if (enable) {
      Serial.println("ButtonIsr");
      lastDebounceTime = millis();
      buttonPressed++;
    }
    enable = 1;
  }
}

void readPir(void)
{
  int val;
 
  val = digitalRead(PIR);  // read input value
  if (val == HIGH) { // check if the input is HIGH
    digitalWrite(LED, HIGH);  // turn LED ON
    delay(150);
    if (pirState == LOW) {
      Serial.println("Motion detected!");
      pirState = HIGH;
    }
  } else {
    digitalWrite(LED, LOW); // turn LED OFF
    delay(300);
    if (pirState == HIGH){
      Serial.println("Motion ended!");
      pirState = LOW;
    }
  }
}

void play(int folder, int file)
{
  static int playing;

  if (folder == 0 && file == 0) {
    playing = false;
    return;
  }
  if (!playing) {
    Serial.print(F("Play the "));
    Serial.print(folder);
    Serial.print(", ");
    Serial.println(file);
    myDFPlayer.playFolder(folder, file);
    playing = true;
  }
}

int folder = 1;
int file = 1;
int nfile;

void setup()
{
  mySoftwareSerial.begin(9600);
  Serial.begin(115200);
 
  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){
      delay(0); // Code to be compatible with ESP8266 watch dog.
    }
  }
  Serial.println(F("DFPlayer Mini online."));
  myDFPlayer.volume(30);  //Set volume value. From 0 to 30
  attachInterrupt(digitalPinToInterrupt(BUTTON), ButtonIsr, RISING);
  pinMode (BUTTON, INPUT_PULLUP);
  pinMode (LED, OUTPUT);
  digitalWrite(LED, LOW);
  pinMode (LIGHT, OUTPUT);
  digitalWrite(LIGHT, LOW);
  pinMode (PIR, INPUT);
}

void loop()
{
  static int night = 0;
  static long lightStart;

  if (lightStart && lightStart < millis() - lightDuration) {
    digitalWrite(LIGHT, LOW);
  }
  int luminosity = analogRead(LUMINOSITY);
  if (luminosity < 400) {
    if (!night) {
      Serial.println("NIGHT");
    }
    night = true;
  }
  else {
    if (night) {
      Serial.println("DAY");
    }
    night = false;
  }
  readPir();
  if (pirState == HIGH) {
    play(2, 1);
    if (night) {
      lightStart = millis();
      digitalWrite(LIGHT, HIGH);
    }
  }
  if (buttonPressed) {
    Serial.println(F("BUTTON pressed"));
    if (digitalRead(SWITCH) == HIGH) {
      folder = 1;
    }
    else {
      folder = 2;
    }
    nfile = myDFPlayer.readFileCountsInFolder(folder);
    if (file > nfile) {
      file = 1;
    }
    play(0, 0);
    play(folder, file++);
    buttonPressed = 0;
  }
 
  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!"));
      play(0, 0);
      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:
          Serial.println(F("????"));
          break;
      }
      break;
    default:
      break;
  }

}


EDIT : j'ai découvert que les mp3 pouvaient porter des noms plus explicites :
001-dog.mp3 plus sympa que 001.mp3
Linux is like a wigwam: no Windows, no Gates, and an Apache inside ...

dfgh

#5
Apr 15, 2018, 03:52 pm Last Edit: Apr 15, 2018, 03:56 pm by dfgh
moi aussi j'avance sur le sujet et je confirme que la légère ronflette (que je constatais en y prêtant une oreille attentive),  a complètement disparue après l'adjonction d'un potentiomètre de 47 Kohms.
merci Mr Bachetti

hbachetti

Bien
Ne pas oublier de régler le volume du DFPLAYER à 30 et ajuster le niveau de sortie avec le potentiomètre.
Qu'utilises tu comme ampli ?

Linux is like a wigwam: no Windows, no Gates, and an Apache inside ...

dfgh

un truc tout simple en 5 V deux voies

PAM 8403

ICI

hbachetti

Le DFPLAYER est mono. Il est équipé d'un 8002a en sortie, un ampli bridgé de 2W.
Tu branches donc deux HP ?
Linux is like a wigwam: no Windows, no Gates, and an Apache inside ...

dfgh

hello
je n'en avais raccordé qu'un seul, mais avant de te répondre, j'ai raccordé le 2 ème.

c'est ok.

j'ai utilisé des HP de récup qui se trouvaient dans la carcasse d'un moniteur hs que j'ai benné

hbachetti

Juste une remarque.
La sortie du DFPLAYER est bridgée et délivre donc deux signaux en opposition de phase.
Il faut donc brancher les deux entrée du PAM8403 sur la même sortie, sinon le son sera moins puissant, car les ondes sonores ont tendance à s'annuler.

D'autre part en supposant que l'alimentation du DFPLAYER et du PAM8403 soit commune, ne pas relier l'une des deux sorties du DFPLAYER à la masse de l'entrée de l'ampli, cela reviendrait à la mettre en court-circuit.
Le potentiomètre doit donc avoir sa broche gauche à la masse.

Cette remarque est sans objet si les alimentations sont séparées et que les masses ne sont pas reliées entre elles.
Je ne sais pas si l'étage de sortie du DFPLAYER est protégé contre les court-circuits, je n'ai rien vu de tel dans la datasheet du 8002A.

@+
Linux is like a wigwam: no Windows, no Gates, and an Apache inside ...

Go Up