Probleme mit TMRpcm

Hallo,

ich habe mir ein kleines Projekt zu Halloween ausgedacht für das ich gerne eine oder mehrere Sounddateien von einer SD Card über einen kleinen Lautsprecher am Arduino ausgeben möchte.

Es ist eigentlich alles soweit fertig bis auf die Wiedergabe der Sounddateien welche noch Probleme macht.

Ich verwende einen Arduino UNO an den ich von AZ-Delivery einen MicroSD-Card Adapter angeschlossen habe.

Da mein Code nicht lief habe ich den Beispielcode von der TMRpcm libarie genommen aber auch mit diesem werden meine Dateien nicht abgespielt.

Die Dateien habe ich wie auf Github im Wiki zu der TMRpcm libarie beschrieben zu Wave Dateien konvertiert und auf einer 1 GB MicroSD-card und einer 2 GB MicroSD-card gespeichert welche ich zuvor in Fat16 formatiert habe.

Als Fehlerquellen habe ich bis jetzt den Code ausgeschlossen, da dieser ein Beispielsketch der libarie war und auch die MicroSD-cards und den MicroSD-card Adapter habe ich ausgeschlossen, da ich beides ausgetauscht habe und der Fehler trotzdem auftritt.

Ich versuche schon seit zwei Wochen den Fehler durch googlen zu beheben und bin jetzt mit meinen Ideen am Ende.

Vielleicht hat schoneinmal jemand die TMRpcm libarie verwendet und kann mir weiterhelfen.

Der Beispiel Sketch ist dieser hier in dem ich nur die Dateinamen verändert habe.

#include <SD.h>                      // need to include the SD library
//#define SD_ChipSelectPin 53  //example uses hardware SS pin 53 on Mega2560
#define SD_ChipSelectPin 4  //using digital pin 4 on arduino nano 328, can use other pins
#include <TMRpcm.h>           //  also need to include this library...
#include <SPI.h>

TMRpcm tmrpcm;   // create an object for use in this sketch


void setup(){

  tmrpcm.speakerPin = 9; //5,6,11 or 46 on Mega, 9 on Uno, Nano, etc

  Serial.begin(9600);
  if (!SD.begin(SD_ChipSelectPin)) {  // see if the card is present and can be initialized:
    Serial.println("SD fail");  
    return;   // don't do anything more if not
  }
  tmrpcm.play("spielen.wav"); //the sound file "music" will play each time the arduino powers up, or is reset
}



void loop(){  

  if(Serial.available()){    
    if(Serial.read() == 'p'){ //send the letter p over the serial monitor to start playback
      tmrpcm.play("spielen.wav");
    }
  }

}

Vielen Dank schon einmal für die Hilfe die da kommen mag.

Ich mache jetzt erst einmal Schluss für heute.

Grüße
w0lf_001

Und warum verwendest du keinen MP3-Player ?
Z.B. DFPlayer mini ?

Damit hast du weniger Problem und einen besseren Klang.
Allerdings kannst über beide Lösungen nur eine Datei zur Zeit abspielen.

Ich habe die TMRpcm-Library ein paar Mal genutzt, es hat immer auf Anhieb funktioniert.
Allerdings gibt es mehrere kleine Stolperfallen, zum Beispiel Hardware (richtige Verkabelung), SD-Karte (richtige Formatierung), Audio-File-Format, Software...
Ich würde versuchen den Fehler einzugrenzen.

Funktioniert es mit den Beispiel-Musikstücken (und dem Beispiel-Sketch)?
Bei der TMRpcm-Library sind ja auch 2 Musikdateien dabei. Sie befinden sich im Ordner der Library unter "audio_samples". Dort gibt es 2 Unterordner. Die Musikstücke heißen jeweils "music" (ohne Extension).
Hast du es mit einem davon probiert?

Verkabelung im Allgemeinen - richtigt?
Und speziell: CS-Pin richtig?
An welchen Pin ist der CS-Pin des Micro SD-Card Moduls angeschlossen?
Im Beispielsketch ist es Pin 4.
Ist das in deinem Aufbau auch so?

Was ist am "Speaker-Pin" angeschlossen?
An einem UNO muss der "Lautsprecher" an Pin 9 angeschlossen sein.
Aber du kannst einen "normalen" Lautsprecher nicht direkt an einen Arduino-Pin anschließen, der ist viel zu niederohmig und der Arduino kann deshalb kaputt gehen.
Was du aber zum Beispiel verwenden kannst:

  • Einen "hochohmigen" Kopfhörer (z.B. 250 Ohm oder mehr).
  • Einen "normalen" Kopfhörer oder Lautsprecher (von dem du nicht weißt wieviel Ohm er hat) mit einem Widerstand (mind. 150 Ohm) davor.
  • Eine Aktivbox
    Achtung: Die Lautstärke könnte ziemlich hoch sein.

Weil gerade zufällig ein SD-Karten-Modul auf meinem Tisch liegt, habe ich schnell einen Probeaufbau gemacht:

  • Beispielsketch ("basic") der Library auf einen Arduino UNO geladen
  • die Beispielmusik ("music") in das Hauptverzeichnis einer 2GB SD-Karte kopiert
  • SD-Karten-Modul angeschlossen (SD-Modul --> Arduino UNO):
    CS --> 4
    SCK --> 13
    MOSI --> 11
    MISO --> 12
    VCC --> 5V
    GND --> GND
  • Hochohmigen Kopfhörer (nur einen Kanal): auf 9 und GND

Resultat: Spielt. Der Kopfhörer ist ziemlich laut, die Tonqualität ist, wie zu erwarten, eher "mittel" (jedenfalls kein HiFi), aber das Beispiel-Musikstück ist eindeutig erkennbar.

Hallo und Danke für die Antworten.

HotSystems:
Und warum verwendest du keinen MP3-Player ?
Z.B. DFPlayer mini ?

Ich hatte nach einer Lösung gesucht um eine Musik Datei abzuspielen und als erstes die TMRpcm gefunden. Und nun da ich alles für den Aufbau da habe und seit mehreren Wochen versuche die TMRpcm zum laufen zu bringen wollte ich ungerne einfach aufgeben und einen anderen Ansatz versuchen.

HotSystems:
Damit hast du weniger Problem und einen besseren Klang.
Allerdings kannst über beide Lösungen nur eine Datei zur Zeit abspielen.

Die Klangqualität ist bei dem Projekt erstmal nebensächlich da es in erster Linie um Geräuche wie Donner für ein Gewitter geht.

Geplant ist auch nur eine Datei zur gleichen Zeit abzuspielen. Die zweite SD-Card war nur zum gegentesten um sicher zu stellen, dass diese nicht der Fehler ist.

uxomm:
Funktioniert es mit den Beispiel-Musikstücken (und dem Beispiel-Sketch)?
Bei der TMRpcm-Library sind ja auch 2 Musikdateien dabei. Sie befinden sich im Ordner der Library unter "audio_samples". Dort gibt es 2 Unterordner. Die Musikstücke heißen jeweils "music" (ohne Extension).
Hast du es mit einem davon probiert?

Die beiden Beispiel Musikstücke habe ich schon ausprobiert. Sowohl mit der Dateiendung .wav als auch ohne.

uxomm:
Verkabelung im Allgemeinen - richtigt?
Und speziell: CS-Pin richtig?
An welchen Pin ist der CS-Pin des Micro SD-Card Moduls angeschlossen?
Im Beispielsketch ist es Pin 4.
Ist das in deinem Aufbau auch so?

Die Verkabelung habe ich überprüft und auch jedes Kabel einzeln abgezogen und den Sketch neu laufen lassen und dabei dann über den Seriellen Monitor "SD fail" ausgegeben bekommen, wenn alles verkabelt ist bekomme ich die Fehlermeldung nicht.

uxomm:
Was ist am "Speaker-Pin" angeschlossen?
An einem UNO muss der "Lautsprecher" an Pin 9 angeschlossen sein.
Aber du kannst einen "normalen" Lautsprecher nicht direkt an einen Arduino-Pin anschließen, der ist viel zu niederohmig und der Arduino kann deshalb kaputt gehen.

Als Speaker-Pin nehme ich Pin 9 und habe dort einen Lautsprecher aus einem alten Telefon angeschlossen, diesen habe ich gerade durchgemessen und mein Multimeter sagt mir er hat 21,8 Ohm. Habe direkt den Pin mit einer LED und einem Blink Sketch getestet und er scheint noch zu funktionieren.
Habe jetzt einen anderen Lautsprecher mit 220 Ohm direkt angeschlossen aber keine Änderung.
Wenn ich zwischen den 21,8 Ohm Lautsprecher und dem Pin 9 einen 220 Ohm Widerstand hänge bekomme ich aber immerhin ein "Knacken" wenn der Sketch startet.
Das scheint nun zumindest schon einmal zu funktionieren.

uxomm:
Weil gerade zufällig ein SD-Karten-Modul auf meinem Tisch liegt, habe ich schnell einen Probeaufbau gemacht

Vielen Dank dafür.
Das ist merkwürdig da ich den gleichen Aufbau mit einem anderen Ergebnis habe.

Ich habe in der Datei pcmConfig.h unter "General User Defines" #define debug aktiviert und bekomme dann über den Seriellen Monitor "WAV ERROR" ausgegeben, diese Ausgabe konnte ich nun der TMRpcm.cpp zuordnen wo sie zweimal vorkommt. Ich habe die Serielle Ausgabe einmal umbenannt und herausgefunden das es scheinbar in diesem Abschnitt hängen bleibt.

void TMRpcm::play(char* filename){
	play(filename,0);
	
}


void TMRpcm::play(char* filename, unsigned long seekPoint){

  if(speakerPin != lastSpeakPin){
	  #if !defined (MODE2)
	  	setPin();
	  #else
	    setPins();
	  #endif
	  lastSpeakPin=speakerPin;

   }
  stopPlayback();
  if(!wavInfo(filename)){
  	#if defined (debug)
  		Serial.println("WAV ERROR");
  	#endif
  return;
  }//verify its a valid wav file

Aktuell verwende ich das Beispiel Musikstück.

Aufgeben ist immer schlecht.
Du hattest im Eingangspost etwas von mehreren Dateien geschrieben, das habe ich dann falsch verstanden.

HotSystems:
Du hattest im Eingangspost etwas von mehreren Dateien geschrieben, das habe ich dann falsch verstanden.

Ja das stimmt das hab ich schlecht formuliert.
Geplant ist später noch andere Dateien (eventuell zufällig durcheinander) alle paar Minuten abzuspielen.
Aber vorerst reicht es mir wenn es donnert oder wenigstens die Beispiel Musik wiedergegeben werden kann.

Denke aber dran, bis Helloween ists nicht mehr lange hin.
Rechtzeitig an Alternativen denken.
Der DFPlayer hat einen integrierten Verstärker, da kannst du einen Lautsprecher direkt anschließen.

Ich werde mir den DFPlayer mal als Alternative anschauen.

Aber ich würde trotzdem gerne (auch für eventuelle andere Projekte) die TMRpcm libarie zum laufen bekommen.

Ich hoffe ja noch das ich einfach ein Brett vor dem Kopf habe und einfach etwas übersehe.

w0lf_001:
Die beiden Beispiel Musikstücke habe ich schon ausprobiert. Sowohl mit der Dateiendung .wav als auch ohne.

Bist du sicher, dass du wirklich diese Library benutzt?
Es gibt nämlich in keinem der Ordner in audio_samples eine Datei mit WAV-Endung.
Dort gibt es Audiodateien mit Endug "mp3", diese können nicht mit TMRpcm funktionieren und es gibt welche mit Endung "ogg", diese können ebenfalls nicht funktionieren, bzw. liefern nur "heftiges Rauschen".
Nur die beiden Dateien mit Namen "music" (ohne Dateiendung) sind abspielbar.

Wenn es bei dir nicht funktioniert, dann ist wohl etwas falsch. :slight_smile:
Es ist wohl eher nicht die Software (in Form der Library mit dem Beispiel-Sketch), bleiben noch: SD-Karte und Hardware/Verkabelung.

SD-Karte
Hast du eine andere, vielleicht sogar eine andere Marke?
Probiere diese. Mit der Datei "music" im Hauptverzeichnis.
Wie hast du die Karte formatiert?
Am sichersten funktioniert das mit

Hardware/Verkabelung
Kannst du ein scharfes Foto von deinem Aufbau machen, wo alle Komponenten und Kabelverbindungen zu erkennen sind?

uxomm:
Bist du sicher, dass du wirklich diese Library benutzt?
Es gibt nämlich in keinem der Ordner in audio_samples eine Datei mit WAV-Endung.

Ja diese libarie verwende ich.
Ich habe sie auch gerade noch einmal neu heruntergeladenen und alles nochmal versucht aber ich bekomme den gleichen Fehler. (WAV error)
Ich habe die Datei "music" genommen und direkt auf die Karte gepackt und weil das nicht funktioniert hat habe ich an die Datei die Dateiendung .wav angehangen, da ich dachte, dass das eventuell hilft.

Muss ich die Datei auf der SD-Card mit .wav abspeichern oder komplett ohne Dateiendung?
Und wie rufe ich diese dann im Code auf? mit oder ohne .wav?

uxomm:
SD-Karte
Hast du eine andere, vielleicht sogar eine andere Marke?
Probiere diese. Mit der Datei "music" im Hauptverzeichnis.
Wie hast du die Karte formatiert?

Ich habe mehrere 1 und 2 GB MicroSD-Karten ausprobiert aber immer den gleichen Fehler bekommen und auch den Kartenadapter habe ich schon ausgetauscht.
Die Karten habe ich mit Windows eigenen Mitteln auf FAT16 formatiert. Wenn ich die Karten (Versuchsweise) auf FAT32 formatiere bekomme ich wie erwartet "SD fail" angezeigt weswegen ich denke das ich bei der Formatierung nichts falsch gemacht habe.

uxomm:
Hardware/Verkabelung
Kannst du ein scharfes Foto von deinem Aufbau machen, wo alle Komponenten und Kabelverbindungen zu erkennen sind?

Die Verkabelung der SD-Karten Adapters ist definitiv richtig. Die habe ich mehrfach überprüft und so angeschlossen wie du es beschrieben hattest. Sobald ich ein Kabel entferne bekomme ich auch direkt wieder "SD fail".
Und der Lautsprecher ist dank deiner Ratschläge jetzt auch richtig angeschlossen.

Leider kann ich gerade kein Foto aufnehmen und hochladen auf dem man alles gut erkennt.

w0lf_001:
Muss ich die Datei auf der SD-Card mit .wav abspeichern oder komplett ohne Dateiendung?
Und wie rufe ich diese dann im Code auf? mit oder ohne .wav?

Der Name der Datei ist prinzipiell egal, auch ob er eine Extension hat oder nicht ist egal. Der Name darf nur nicht zu lange sein (max. 8 Zeichen + 3 Zeichen Extension) und er muss mit dem Namen im Arduino-Sketch übereinstimmen.

Mit der Datei "music" aus dem Ordner "audio_samples" sollte es mit dem Beispiel-Sketch funktionieren. Diesen kannst du so öffnen:
In der Arduino-IDE wähle
Menü Datei / Beispiele / TMRpcm / basic

Die Beispiele, die bei einer Library dabei sind sollten funktionieren. Und bei mir tun sie das auch, ohne irgendetwas zu ändern.
Wenn du alles genau so wie beschrieben machst und es trotzdem nicht funktioniert, dann bin ich leider mit meinem Latein am Ende. :confused:

Die Formatierung mit Window-Bordmitteln funktioniert manchmal nicht richtig. Aber da habe ich ja schon auf ein Tool hingewiesen.

Ich habe die library noch einmal komplett neu heruntergeladen und den Beispiel-Sketch auf das Board geladen.
Die SD-Karte habe ich jetzt auch mit dem von dir empfohlenen Tool neu formatiert (overwrite format) und die Beispiel Musikdatei ohne Dateiendung auf die Karte kopiert.
Aber es funktioniert nicht. Ich bekomme von dem Lautsprecher nur ein Knacken und dann leises Rauschen.

Kannst du den jetzigen Lautsprecher vielleicht durch einen kleinen Aktivlautsprecher ersetzen (z.B. so etwas wie in diesem Video)?
Achtung, den Lautsprecher zuerst nur sehr leise aufdrehen, das Signal das vom Arduino kommen sollte ist sehr "laut".

Habe ich gerade mal ausprobiert. Der Lautsprecher brummt beim aufdrehen bevor die Kabel verbunden sind, sobald ich die Kabel mit GND und PIN 9 verbinde hört er auf zu brummen aber gibt mir keinen weitern Ton aus.

w0lf_001:
Habe ich gerade mal ausprobiert. Der Lautsprecher brummt beim aufdrehen bevor die Kabel verbunden sind, sobald ich die Kabel mit GND und PIN 9 verbinde hört er auf zu brummen aber gibt mir keinen weitern Ton aus.

Das Brummen ist nicht ungewöhnlich und kommt durch den offenen Eingang und weil du das Kabel (auch die Isolierung) berührst.

Da fällt mir fast nichts mehr ein. :confused:

Nur noch "Kurioses":
Vielleicht ist das kein Arduino(-Nachbau), sondern etwas anderes?
Vielleicht sind die Pins falsch beschriftet?
Auf einem Foto könnte man das eventuell erkennen.
Schade, dass du kein Foto von deinem Aufbau machen kannst.

Vielleicht ist Pin 9 defekt?
Kannst du eine LED (mit Widerstand) an Pin 9 anschließen und sie zum Blinken bringen?
Funktioniert das dimmen einer LED an Pin 9 - versuche das Beispiel in der Arduino IDE:
Menü Datei / Beispiele / 01.Basics / Fade

Hm...

HotSystems:
Das Brummen ist nicht ungewöhnlich und kommt durch den offenen Eingang und weil du das Kabel (auch die Isolierung) berührst.

Aber da das Brummen verschwindet sobald ich die Kabel verbinde gehe ich davon aus das vom Arduino irgendein Signal an den Lautsprecher raus geht.

uxomm:
Vielleicht ist Pin 9 defekt?
Kannst du eine LED (mit Widerstand) an Pin 9 anschließen und sie zum Blinken bringen?
Funktioniert das dimmen einer LED an Pin 9 - versuche das Beispiel in der Arduino IDE:
Menü Datei / Beispiele / 01.Basics / Fade

Habe den Pin 9 jetzt mit einer LED probiert mit dem Sketch Fade und das hat funktioniert.

Ich habe den Aufbau noch einmal neu gemacht damit ich ein gescheites Foto aufnehmen kann.

w0lf_001:
Aber da das Brummen verschwindet sobald ich die Kabel verbinde gehe ich davon aus das vom Arduino irgendein Signal an den Lautsprecher raus geht.

Ja klar, dann ist der Signaleingang auch nicht mehr Offen und kann nicht mehr als Antenne arbeiten.
Das sagt aber nichts darüber aus, dass aus dem Arduino was raus kommt. Das müsstest du dann ja hören.

w0lf_001:
... und bekomme dann über den Seriellen Monitor "WAV ERROR" ausgegeben, ...

In der Bibliothek finde ich "check for the string WAVE starting at 8th bit in header of file" bei dieser Meldung.

Meine Datei fängt so an:

RIFFã¥z WAVEfmt       }   }    data

Das scheint bei Dir anders zu sein, warum auch immer. Oder das Lesen schlägt fehl, also mal eine Textdatei probieren.

agmue:
In der Bibliothek finde ich "check for the string WAVE starting at 8th bit in header of file" bei dieser Meldung.

Meine Datei fängt so an:

RIFFã¥z WAVEfmt       }   }    data

Das scheint bei Dir anders zu sein, warum auch immer. Oder das Lesen schlägt fehl, also mal eine Textdatei probieren.

Die Beispiel Musik Datei fängt bei mir so an:

RIFFO¢ WAVEfmt       }   }    dataû¢

Das WAVEfmt startet an der gleichen stelle.

Es gibt in der Bibliothek aber noch einen WAV ERROR in der selben Datei und der ist es dann auch der mir ausgegeben wird.