Hi!
Für ein kleines Projekt brauche ich eine Audioausgabe. Generell kann man
einen µC nehmen oder mit z.B. dem Raspberry arbeiten. Nachteil hiervon
ist die Tatsache, das die erst booten müssen und das passt nicht in mein
Projekt. Daher bin ich mal zum Arduino übergegangen und von diesem Video
[1] überzeugt worden, die TMRpcm Bibliothek zu verwenden ([2]). Die
Qualität ist recht gut und genau das was ich suche. Also habe ich mal
eine Demo aufgebaut, denkbar einfach: SD-Karte an den Arduino,
Demo-Sketch drauf und an Pin 9 ist der PWM Output, der nach Plan [3] an
die Kopfhörer (in meinem Fall ersetzen die den Lautsprecher, der noch
nicht bestellt ist) angeschlossen ist (R1 = 100 Ohm).
Das Ergebnis ist aber (gar)nicht gut: man kann zwar deutlich im
Hintergrund den eigentlichen Sound hören aber es gibt so ein komisches
Klirren. Hier:
https://www.dropbox.com/s/gbr8xua5r8okme3/beispiele.zip?dl=0 habe ich
mal folgende Dateien in einem ZIP-Archiv hochgeladen:
* sample2.wav: Demo-Sound, 32 kHz, 8-bit unsigned PCM, Mono
(einwandfreie Qualität) - den bekommt der Arduino
* sample2_ausgabe.wav: Ausgegebener Sound, aufgenommen (daher etwas
blechern im Klang, das komische Klirren ist aber gut zu hören).
Habe Ihr da eine Idee, was ich machen kann?
Mich verwirrt nur, dass bei den Meisten das einfach so klappt (z.B. im
Video) und bei mir komisch verklirrt ist.
Viele Grüße!
[1] https://www.youtube.com/watch?v=LbqPgJe3Qd4
[2] https://github.com/TMRh20/TMRpcm/wiki
[3] https://bryanduxbury.files.wordpress.com/2012/01/amplified2.png
Lass dir nicht gleich zwanzig verschiedene Ausweich-Varianten einreden.
Ich finde es eine ziemlich blöde Angewohnheit mancher Forumsteinehmer,
obwohl man einen bestimmten Rahmen vorgibt, einem sofort etwas völlig
anderes einreden zu wollen. Probleme sind dazu da, dass man sie löst!
Ich hoffe jetzt mal, du programmierst mit einem gewissen Bewusstsein und
lädst nicht einfach nur fremde Sketche, ohne zu wissen, das diese
eigentlich tun ...
Also - zum Arduino: Stelle sicher, dass die Frequenz der PWM-Ausgabe
hochgestellt ist, mindestens 30kHz oder mehr. Wie das geht, steht z.B.
hier: http://playground.arduino.cc/Code/PwmFrequency
Da dies Hardware-basiert geschieht, belastet das den Arduino quasi
überhaupt nicht. Nun musst du nur noch die Bytes im richtigen Tempo
(Samplingrate! max. halb so hoch wie PWM-Frequenz, z.B. 22kHz)
nacheinander 'rausschieben.
Am Besten, du erstellst dir mit einer geeigneten Software (z.B.
Audacity) passende unkomprimierte (!) Mono (!) -Wave-Dateien mit 8 Bit
Auflösung und passender Samplingrate.
Ich habe sie seinerzeit nicht vom Datenträger gelesen, sondern per UDP
zum Arduio gestreamt und der Sound war glasklar. Wenn du Stereo
brauchst, versetzt du einfach zwei Pins in den PWM-Mode und schiebst je
ein Byte nach Links und eines nach Rechts ...
Frank E. schrieb:> Lass dir nicht gleich zwanzig verschiedene Ausweich-Varianten einreden.> Ich finde es eine ziemlich blöde Angewohnheit mancher Forumsteinehmer,> obwohl man einen bestimmten Rahmen vorgibt, einem sofort etwas völlig> anderes einreden zu wollen. Probleme sind dazu da, dass man sie löst!
ACK - da stimme ich voll zu!
> Ich hoffe jetzt mal, du programmierst mit einem gewissen Bewusstsein und> lädst nicht einfach nur fremde Sketche, ohne zu wissen, das diese> eigentlich tun ...
Was ich gemacht habe, ist erstmal zu verstehen wie das in etwa geht.
Dazu kann man sich z.B. diesen Artikel [1] anschauen. Im Grunde mache
ich einen (für Mono) PWM Kanal auf und schreibe 1/32kHz mal pro Sekunde
den unsigned 8-bit Wert auf dem PWM Kanal - wenn meine Abtastrate 32kHz
ist. Leider bekomme ich [1] nicht zum laufen auf einem ATMega328p und da
habe ich für den Arduino eine fertige Lib gesucht, nur um zu sehen, ob
das überhaupt geht mit dem Sound.
> Also - zum Arduino: Stelle sicher, dass die Frequenz der PWM-Ausgabe> hochgestellt ist, mindestens 30kHz oder mehr. Wie das geht, steht z.B.> hier: http://playground.arduino.cc/Code/PwmFrequency
Aber sollte das nicht diese TMRpcm Bibliothek schon machen? Es ging mir
ja darum, dass im Showcase YT Video (siehe Link oben) die Soundausgabe
quasi störfrei ist und bei mir verrauscht - aber ich habe das genau das
Setup wie angegeben.
> Ich habe sie seinerzeit nicht vom Datenträger gelesen, sondern per UDP> zum Arduino gestreamt und der Sound war glasklar.
Und wie sah die Hardwareschaltung aus? Lautsprecher direkt an den Pin?
Viele Grüße!
[1]
http://avrpcm.blogspot.de/2010/11/playing-8-bit-pcm-using-any-avr.html
Max schrieb:> Leider bekomme ich [1] nicht zum laufen auf einem ATMega328p
[1] habe ich mir nicht angesehen, da ich nicht jeden Link verfolge,
zumal man auch hier Anhänge hochladen kann.
Zum ATMega328P kann ich nur sagen, dass er ohne Probleme Sound ausgeben
kann. Bei mir werkeln Arduino-Mini-Pro-Klons (aus China) in
verschiedenen Sound-Spielereien. Dazu wird ein 8-Bit-Timer auf
Hardware-PWM mit Vorteiler 1:1 gestellt und das Soundbyte in
regelmäßigen Abständen in das Compare-Register des Timers geschrieben.
Die PWM-Frequenz beträgt bei 16MHz-Quarz 62,5 kHz, die Ausgaberate
(Samplerate, Frequenz des Beschreiben des Compare-Registers) liegt
zwischen 8 kHz und 16 kHz. Ich nutze allerdings keine Arduino-Sketches,
auch kein C, sondern mache das direkt in Assembler. Hier ein Beispiel
mit einem (Arduino-Klon-) Mini-Pro-Modul, das neben der Sounderzeugung
noch 5 Kanäle eines RC-Empfängers ausliest und 4 DC-Motore per
Software-PWM ansteuert. Das Modell ist inzwischen auch karosseriemäßig
(blaue Bude) fertig:
https://www.youtube.com/watch?v=CJMwHpboJTs
Der gelbe Kran ist übrigens auch mit dieser Steuerung ausgestattet, hat
allerdings andere Sounds.
...
PWM Frequenz deutlich höher wählen als grade so über hörbar! Class-D
findet üblicherweise bei 100-150kHz statt damit das Ausgangsfilter nicht
zu schmalbandig ausfallen muss.
Wegen dem Klirr kann man mal systematische Fehlersuche betreiben.
Bau mal nen RC Tiefpass mit fg=20kHz und das gibst du auf den ADC. Den
lässt du mit ADLAR und 1MHz Takt laufen.
Was aus dem ADC kommt, schiebst du in der ADC-Fertig ISR aufs OCR1A/B.
Wenn du da jetzt Musik ausm MP3-Player dran anschließt, sollte das in
erträglicher bis guter Qualität aus dem angeschlossenen Lautsprecher
kommen.
Wenn ja: Irgendwas an der PCM Software ist faul.
Wenn nicht: Der ganze Rest, die Schaltung selbst zum Beispiel.
Ein Oszi ist bei sowas Gold wert.
Sascha schrieb:> PWM Frequenz deutlich höher wählen als grade so über hörbar!
Falls Du mich meinst, mehr als 62,5 kHz gibt der AVR bei 16 MHz Quarz
aber nicht her.
> Class-D> findet üblicherweise bei 100-150kHz statt damit das Ausgangsfilter nicht> zu schmalbandig ausfallen muss.
Danke für diese Info. Ich habe die AVR-PWM mit 1k/100nF (nicht
berechnet, nur probiert und für akzeptabel befunden) ausgefiltert und
über ein Poti 10k auf den Eingang eines Class-D-Moduls mit PAM8403
geführt, von dem nur 1 Kanal benutzt wird.
...
Max schrieb:>> Ich habe sie seinerzeit nicht vom Datenträger gelesen, sondern per UDP>> zum Arduino gestreamt und der Sound war glasklar.>> Und wie sah die Hardwareschaltung aus? Lautsprecher direkt an den Pin?
Nicht ganz, aber fast. Ich habe nach einem RC-Glied 1k/10nF einen LM386
nachgschaltet.
Per UDP habe ich immer 1024 Bytes gesendet und den richtigen Rhytmus zum
Senden des jeweils nächsten Datagrammes in einer Mac-Anwendung einfach
ausprobiert ...
Frank E. schrieb:> Lass dir nicht gleich zwanzig verschiedene Ausweich-Varianten> einreden. Ich finde es eine ziemlich blöde Angewohnheit mancher> Forumsteinehmer, obwohl man einen bestimmten Rahmen vorgibt, einem> sofort etwas völlig anderes einreden zu wollen. Probleme sind dazu da,> dass man sie löst!
Hast du ein Problem damit, wenn andere User hier Vorschläge machen.
Damit wir dir keiner was einreden, auch kein schlechtes Gewissen.