Soundinstallation mit MP3-Player YX5300; Reset per Taster; GELÖST!

Das zweite Problem ist Folgendes:
Wenn ich meine Sounddatei über mein Setup abspiele (auch mit Stromversorgung der Lautsprecher und des Arduino Uno über die Steckdose) kommt es unregelmäßig zu einem Knacken beim Abspielen. Es ist ein leichtes, erträgliches aber doch ein bisschen nerviges Knacken. Wenn ich die Lautsprecher an meinen Laptop anschließe und die Sounddatei über den PC abspiele, ist das Knacken weg - an der Sounddatei oder den Lautsprechern an sich kann es also nicht liegen.
Woher kommt das Knacken? Lässt sich das Knacken irgendwie beseitigen?

Du hast eine 20Ah (20000mAh) Powerbank und

Arduin Uno: 0,0476 A; 5 V = bei Max Auslastung bei Dir rechne mit 0,02A
Lausprecher: 0,6 A; 5 V auch bei Max Auslastung also rechne mit 0,1 A sonst platzt das Trommelfell bei dem Probaten :wink:
YX5300 MP3 Player: 0,2 A; 5 V

also wir haben ~ 0,32A was bedeutet das die Powerbank geht nach 1 bis 2 min aus
Meine 10 000mAh bei 0,4A schaltet ab, zu geringe Belastung.
8000mAh funktioniert bei mir ab 0,4A
Wen das der Fall wird muste die belasten mit min 1A,
ist eine EU Verordnung um stromsparen :confounded:

Fangen wir mal damit an:
Implementierung aus der .cpp-Datei der Library:

void SerialMP3Player::playSL(byte n){
   // Play single loop n file
   sendCommand(CMD_PLAY_SLOOP, n);
}

Also: mp3.playSL(1); sollte das tun was Du erwartest - so beschreibt es auch Wolle.

Bei der Powerbank bin ich bei fony, die wird wohl wegen mangelnder Last abschalten.
Das Knacken könnte von dem Player-Modul kommen; High-End HiFi ist das ja nun nicht gerade.

Ist es Dir recht, wenn ich Deine loop() -Funktion mal Zeile für Zeile auseinandernehme?

Ich glaube nicht, dass es daran liegt, weil wenn ich nur den Arduino Uno über die Powerbank versorge stürzt er nicht ständig ab und startet dann wieder neu...
Wenn ich jedoch nur die Lautsprecher an die Powerbank anschließe, passiert was Du meintest: Die Powerbank geht nach kurzer Zeit aus und die Stromversorgung ist nicht gewährleistet.

Okay, ich beziehe also diesen void- Teil in meinen Sketch mit ein. Und wende ihn dann als Befehl im void loop()- Teil mit "void SerialMP3- Player::playSL(byte n)"; an?
Für was steht dieses n? Es scheint mir eine Variable zu sein, oder irre ich mich?

Ich probiere morgen ob sich mein Vorhaben mit diesem Befehl im Anfang des void loop()- Teil und bei Drücken des Tasters realisieren lässt.

Ja das ist mir sehr Recht! Gerne!

Ich habe noch die Hoffnung, dass das Knacken bei externer Stromversorgung des YX5300 MP3 Player verschwinden könnte, was meint Ihr?

Falls nicht: Könnt Ihr mir ein besseres, hochwertigeres Player- Modul empfehlen, wo so ein Knacken nicht vorkommt? Gibt es so etwas?

Ich melde mich morgen erst wieder, bin leider raus für heute. Danke für Eure Hilfe!

Am Anfang der loop:

   mp3.play();

Player fängt sofort an zu spielen - ohne Tastendruck (zu Testzwecken vielleicht nützlich).

  if (digitalRead(Taster) == LOW)
  {
    Tasterstatus = true;
    mp3.stop();
  }

Wenn Taster momentan gedrückt ist: Player Stop und "Merker" zurücksetzen.
Das passiert dann bei jedem Durchlauf wieder solange der Taster gedrückt bleibt.

  if (digitalRead(Taster) == HIGH)
  {
    Tasterstatus = false;
  }

Wenn Taster nicht gedrückt ist: "Merker" setzen.
und dann direkt danach dann

  if (Tasterstatus == false)
  {
    mp3.play();
  }

Player fängt an zu spielen - und auch dieser play()-Aufruf findet bei jedem Durchlauf wieder statt.
Da könntest Du das mp3.play auch gleich in den == HIGH-Zweig einbauen - der Effekt ist derselbe.
Der Code arbeitet mit dem momentanen Zustand des Tasters.

Was Du mit dem Code nicht erreichst ist die Erkennung des Übergangs von INAKTIV (HIGH) nach AKTIV (LOW) und umgekehrt.
Das geht im Prinzip so:

  static byte lastBuzzerState = HIGH;             // static: letzter Wert bleibt erhalten solange Spannung anliegt
  byte currentBuzzerState = digitalRead(Taster);  // kein static: wird in jedem loop()-Durchlauf neu erzeugt

  if (currentBuzzerState != lastBuzzerState) 
  {
    // Hier kommen wir nur bei einer Änderung des Tastenzustands vorbei!
    if (currentBuzzerState == LOW)
    {
      // Taster wurde gedrückt (Flanke HIGH -> LOW)
      // Player anhalten
      mp3.stop();
    }
    else
    {
      // Taster wurde losgelassen  (Flanke LOW -> HIGH)
      // Player wieder starten
      // früher: mp3.start();
      mp3.playSL(1);
    }
    // aktuellen Tasterzustand merken
    lastBuzzerState = currentBuzzerState;
  }
  // fertig - wenn sich der Zustand ggü. dem letzten Durchlauf nicht geändert hat, ist nix zu tun.

Gruß von Holle nach Halle!
Walter

Lieber Walter,

Vielen Dank für deine Tipps! Danke, dass Du mir static erklärt hast, das war neu für mich. Danke auch, dass Du meine Frage zu dem Befehl:

beantwortet hast, man muss also einfach

schreiben.
Eine Frage hätte ich hierzu noch: wofür steht die (1)? Ist das der erste und einzige Titel auf meiner SD- Karte?

Ich habe den Sketch jetzt nach Deinen Ratschlägen umgeschrieben. Leider wird nach dem Drücken des Tasters meine .mp3- Datei aber nicht neu abgespielt. Wo liegt der Fehler?

#include <SerialMP3Player.h>

/******************************************************************************
  Simple SerialMP3Player "Hello World" example of YX5300 chip.

  Copy the "hello.mp3" file to an empty SD card
  Connect the Serial MP3 Player to the Arduino board
    GND → GND
    VCC → 5V
    TX → pin 10
    RX → pin 11

  After compile and upload the code you must hear “Hello world” over and over.


  This example code is in the public domain.

  https://github.com/salvadorrueda/ArduinoSerialMP3Player

  by Salvador Rueda
 *******************************************************************************/

#include "SerialMP3Player.h" // Einbinden der "SerialMP3Player.h- Bibliothek

const byte Taster = 6;
static byte lastBuzzerState = HIGH;             // static: letzter Wert bleibt erhalten solange Spannung anliegt
byte currentBuzzerState = digitalRead(Taster);  // kein static: wird in jedem loop()-Durchlauf neu erzeugt
#define TX 10               // TX wird als Pin 11 definiert // die Pins auf dem MP3 Player- Modul schein vertauscht zu sein, denn TX de YX5300 Moduls liegt an Pin 10 an...
#define RX 8               // RX wird als Pin 10 definiert //...und RX des YX5300- Moduls liegt an Pin 11 an

SerialMP3Player mp3(RX, TX);

void setup() {
  pinMode (Taster, INPUT_PULLUP);
  Serial.begin(9600);     // starte die serielle Schnittstelle
  mp3.begin(9600);        // starte die mp3-Kommunikation
  delay(500);             // Wartezeit für den Anfang

  mp3.sendCommand(CMD_SEL_DEV, 0, 2);   //Auswählen der sd-card
  delay(500);             // Wartezeit für den Anfang
}

// the loop function runs over and over again forever
void loop()
{
  mp3.play();
  if (currentBuzzerState != lastBuzzerState)
  {
    // wenn der aktuelle Buzzerzustand ungleich dem letzten Buzzerzustand ist
    // Hier kommen wir also nur bei einer Änderung des Tastenzustands vorbei
    if (currentBuzzerState == LOW) // Taster wurde gedrückt (Flanke HIGH -> LOW)
    {
      mp3.stop();  // Player anhalten
    }
    else // Taster wurde losgelassen, der aktuelle Buzzerzustand ist also gleich dem letzten Buzzerzustand  (Flanke LOW -> HIGH)
    {
      mp3.playSL(1); // Player wieder starten...das war früher: mp3.start();
    }
    lastBuzzerState = currentBuzzerState;  // aktuellen Tasterzustand merken
  }
  // fertig - wenn sich der Zustand ggü. dem letzten Durchlauf nicht geändert hat, ist nix zu tun.
}





Nur schnell vom Mobilcomputer:
Die beiden Zeilen mit last/currentBuzzerState hinter dem #include gehören in die loop-Funktion - das digitalRead soll ja laufend ausgeführt werden.

Danke, ich habe die beiden Zeilen in die loop- Funktion verschoben. Ich musste aber die mp3.play()- Zeile herausnehmen, damit alles fehlerfrei funktioniert. Mit der mp3.play()- Zeile startete die Audiodatei anfangs 2x direkt hintereinander und wenn man lange auf den Taster gedrückt hat, startete die Datei immer wieder neu und beim Loslassen des Tasters nochmals neu. Ich habe die mp3-play()- Zeile also rausgenommen. Jetzt startet der Loop anfangs nicht automatisch, sondern erst nach einmaligem Drücken des Tasters. Aber das ist in Ordnung so!

Bezüglich des Problemes mit dem Knacken:

  • Wolle hat gemeint, dass vielleicht eine Stabilisierung der Stromversorgung mit einem Kondensator gegen das Knacken helfen könnte. Kann mir bitte jemand erklären, wo und in welche Richtung der Kondensator ins Setup eingebaut werden muss und vor allem was für ein Kondensator? Das würde ich nämlich gerne mal ausprobieren.

  • Ein Freund von mir meinte, dass man mal die Lautstärke des YX5300- Moduls reduzieren könnte um das Knacken zu beseitigen, das probiere ich später auch mal aus. Ich hoffe ich bekomme die Lautstärkereduzierung auf Anhieb im Sketch hin, falls nicht melde ich mich nochmal:).

  • Die externe Stromversorgung des YX5300 probiere ich zur Knack- Beseitigung später ebenfalls aus.

Falls jmd. noch eine andere mögliche Lösung für das Problem einfällt, sagt bitte Bescheid!

P.S.: Ich habe eben ein anderes YX5300- Modul ins Setup eingebaut. Das Knacken ist geblieben. Ein Defekt des Bauteils, der das Knacken erzeugt kann also ausgeschlossen werden.

Ich wollte gerade meiner Freundin das leichte Knacken zeigen und sie fragen ob es sie stört, oder ob man das so lassen kann. Davor hatte ich den neuen Sketch, bei dem Du mir geholfen hast, lieber Walter, auf den Arduino Uno geladen. Als ich es ihr zeigen wollte, war das Knacken plötzlich weg. Dann habe ich mich gefragt, warum das auf einmal so ist.

Erklärung:

Dieser Teil meines Sketches in #37 hat das Knacken verursacht. Das ständige neue Ausführen von "mp3.play();" spielt die Audio-Datei zwar nicht immer wieder neu ab aber sie verursacht definitiv das Knacken. Das hat sich durch Rumprobieren am Sketch herausgestellt.

Na, das ist doch mal eine gute Nachricht, danke für die Rückmeldung!

Das ist halt die loop() - kommt viel öfter dran als wir alle denken :wink:

Das Problem was ich in #39 beschrieben habe, hat sich jetzt auch geklärt. Tatsächlich scheint das YX5300- Modul zu viel Strom vom Arduino Uno gezogen zu haben und muss ihn dadurch zum abstürzen gebracht haben. Ich habe das YX5300- Modul jetzt extern mit Strom versorgt und alles läuft einwandfrei...auch kein automatisches Abschalten der Powerbank. Hier ist der neue Schaltplan (nur die USB- Versorgung des Arduino über USB von der Powerbank konnte ich bei Fritzing nicht abbilden, die muss man sich dazu denken).

Tatsächlich habe ich einfach die externe Stromversorgung des YX5300- Moduls von dem USB- Kabel des Arduino- Uno, das an die Powerbank angesteckt ist, abgezweigt.
So sieht es tatsächlich aus (im Unterschied zum Fritzing- Schaltpan):

Das Projekt ist damit vorerst abgeschlossen! Danke an alle die mir geholfen haben, vor allem an wno158 und my_xy_projekt! Wenn die ganz grobe Hardware der Soundinstallation (Friseurhaube an Gestänge und Grund- Metallplatte und Sitz) abgeschlossen ist, lade ich hier Fotos davon hoch!

Hier ist abschließend der finale Sketch, mit dem das Setup einwandfrei läuft:

#include <SerialMP3Player.h>

/******************************************************************************


  Einfacher Serial MP3- Player mit dem YX5300- Modul, der nach Tastendruck die erste Datei im Root-Verzeichnis der SD-Karte in Dauerschleife abspielt.
  Basierend auf dem: "Simple SerialMP3Player "Hello World" example of YX5300 chip." von Savador Rueda https://github.com/salvadorrueda/ArduinoSerialMP3Player

  - Kopiere eine mp3- Datei auf eine leere SD- Karte
  - Verbinde den Serial MP3- Player mit einem Arduino- Board
    GND → GND
    VCC → 5V
    TX → pin 8
    RX → pin 10
  - Verbinde den Taster mit pin 6 und GND des Arduino- Board


 *******************************************************************************/

#include "SerialMP3Player.h" // Einbinden der "SerialMP3Player.h- Bibliothek

const byte Taster = 6;
#define TX 10               // TX wird als Pin 11 definiert // die Pins auf dem MP3 Player- Modul schein vertauscht zu sein, denn TX de YX5300 Moduls liegt an Pin 10 an...
#define RX 8               // RX wird als Pin 10 definiert //...und RX des YX5300- Moduls liegt an Pin 11 an

SerialMP3Player mp3(RX, TX);

void setup() {
  pinMode (Taster, INPUT_PULLUP);
  Serial.begin(9600);     // starte die serielle Schnittstelle
  mp3.begin(9600);        // starte die mp3-Kommunikation
  delay(500);             // Wartezeit für den Anfang

  mp3.sendCommand(CMD_SEL_DEV, 0, 2);   //Auswählen der sd-card
  delay(500);             // Wartezeit für den Anfang
}

// the loop function runs over and over again forever
void loop()
{
  static byte lastBuzzerState = HIGH;             // static: letzter Wert bleibt erhalten solange Spannung anliegt
byte currentBuzzerState = digitalRead(Taster);  // kein static: wird in jedem loop()-Durchlauf neu erzeugt
 
  if (currentBuzzerState != lastBuzzerState)
  {
    // wenn der aktuelle Buzzerzustand ungleich dem letzten Buzzerzustand ist
    // Hier kommen wir also nur bei einer Änderung des Tastenzustands vorbei
    if (currentBuzzerState == LOW) // Taster wurde gedrückt (Flanke HIGH -> LOW)
    {
      mp3.stop();  // Player anhalten
    }
    else // Taster wurde losgelassen, der aktuelle Buzzerzustand ist also gleich dem letzten Buzzerzustand  (Flanke LOW -> HIGH)
    {
      mp3.playSL(1); // Player wieder starten...das war früher: mp3.start();
    }
    lastBuzzerState = currentBuzzerState;  // aktuellen Tasterzustand merken
  }
  // fertig - wenn sich der Zustand ggü. dem letzten Durchlauf nicht geändert hat, ist nix zu tun.
}

Bis bald und LG Leonardo

Hallo Leonardo,
ich würde gerne noch ein klein wenig mäkeln (ist so meine Art) - aber vielleicht hilft es Dir bei weiteren Projekten.

Bei der Wahl von Kabel- und Schrumpfschlauchfarbe für die Stromversorgung ist die künstlerische Freiheit mit Dir durchgegangen. Bei mir gilt: Rot ist Plus und Schwarz ist Masse/Minus/GND. Immer.
Na ja, den Elektronen ist die Farbe egal, aber ein System, dass Du durchgängig anwendest, hilft bei umfangreicheren Installationen sehr. Dass die Farben für die Spannungsversorgung nicht für Datenleitungen verwendet werden sollten, hast Du ja offensichtlich beachtet.

Im Sketch würde ich den Kommentar am Anfang noch editieren. Das ist mindestens wegen des Tasters schon nicht mehr der Beispielsketch vom Salvador. Wenigstens eine kurze Angabe, was er jetzt tut (nämlich nach Tastendruck die erste Datei im Root-Verzeichnis der SD-Karte in Dauerschleife abspielen) und die Ergänzung "based on..." wäre hilfreich falls sich den mal jemand rauskopiert.

Ansonsten viel Erfolg mit Deinem Vorhaben!

Ja das stimmt. Leider hatte ich keine roten und schwarzen Jumper- Kabel mehr, deshalb die Improvisation. Ich bestelle mir gleich mal neue.

Den finalen Sketch, den ich in #53 hochgeladen habe, habe ich nach Deinen Ratschlägen bearbeitet und in # 53 aktualisiert!
Danke für Deine Kritik!

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