Forum: Mikrocontroller und Digitale Elektronik Soundausgabe auf dem AVR


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von Christian (dragony)


Lesenswert?

Hallo zusammen,

ich möchte gerne Sounds auf einem AVR ausgeben. Der Standard dazu ist 
anscheinend I2S. Natürlich können das die 8-Bitter wiedermal nicht 
native, deshalb muss man mal gucken....

Man könnte es via SPI machen, aber da wird das Timing anspruchsvoll. 
Ggf. müsste man zwei Timer synchronisieren. Tricky.

Da habe ich mich gefragt, ob das nicht auch einfacher geht. Gibts sowas 
wie eine SPI to I2S Bridge? Würde mich auch nicht stören, wenn man da 
direkt WAVs oder sogar MP3s hinschicken kann.

Kennt jemand was?

von Gerhard H. (hauptmann)


Lesenswert?

Christian schrieb:
> Der Standard dazu ist anscheinend I2S.

Die erste Frage ist eigentlich, welches Ausgabeformat brauchst Du ?

von Bernd S. (bernds1)


Lesenswert?

Christian schrieb:
> Natürlich können das die 8-Bitter wiedermal nicht
> native, deshalb muss man mal gucken....

Zum Beispiel hier:
https://www.az-delivery.de/blogs/azdelivery-blog-fur-arduino-und-raspberry-pi/max98357-was-ist-eigentlich-i2s

Vielleicht hilft es dir

von Ob S. (Firma: 1984now) (observer)


Lesenswert?

Christian schrieb:

> ich möchte gerne Sounds auf einem AVR ausgeben.

Das kommt vor.

> Der Standard dazu ist
> anscheinend I2S.

Das ist ein Standard, nicht der Standard. Es kommt darauf an wo der 
Sound letztlich landen soll. Generell sind die AVR8 aber schlicht zu 
langsam, um den Durchsatz zu schaffen, den eine I2S-Schnittstelle 
erfordert. Ja, es gibt auch welche, die historische Kinkerlitzchen 
unterstützen, die auch ein AVR8 noch schaffen könnte. Aber dann hast du 
am anderen Ende der I2S-Strecke ein Problem. Was dort hängt, muß dann 
diese historischen Sachen auch unterstützen. Und da wird heute das Bein 
doch schnell dicke...

> Natürlich können das die 8-Bitter wiedermal nicht
> native

Eben weil schon den Entwicklern klar war, dass das einigermaßen sinnlos 
wäre.

> Da habe ich mich gefragt, ob das nicht auch einfacher geht.

Geht es. Aber dazu musst du erstmal sagen, wo der Sound letztlich landen 
soll und welche "Qualität" dir vorschwebt. Qualität ist: Bits/Sample mal 
Bitrate mal Anzahl Kanäle.

Nenne Zahlen, dann können wir dir sagen ob es geht und wie es geht.

von Harald K. (kirnbichler)


Lesenswert?

Alternative: mp3 und externen Decoder wie VS1053 verwenden.

https://hartmut-waller.info/arduinoblog/mp3-player-mp3-shield/

von Harald A. (embedded)


Lesenswert?

Wenn ihr Files auch extern gespeichert werden dürfen: JQ6500

z.B. https://de.aliexpress.com/item/1005005200252591.html

von Björn W. (bwieck)


Lesenswert?

Christian schrieb:
> Kennt jemand was?

DF-Player Modul dranhängen?
Oder wolltest Du die Sounds vorher noch selbst erzeugen?

von Rick (rick)


Lesenswert?

Christian schrieb:
> ich möchte gerne Sounds auf einem AVR ausgeben.
Du kannst ja erstmal mit einem Sinus anfangen:
http://www.technoblogy.com/show?22HF

von Michael B. (laberkopp)


Lesenswert?

Christian schrieb:
> ich möchte gerne Sounds auf einem AVR ausgeben

Dazu ist der ungefähr genau so gut geeignet wie ein Apple ][.

Was ist fur dich Sound ? Musik, Rechtecktöne ?

Wo ist der Speicher für die Daten ?

von 900ss (900ss)


Lesenswert?

Christian schrieb:
> Da habe ich mich gefragt, ob das nicht auch einfacher geht

Wenn du nicht unbedingt auf den AVR festgenagelt bist, dann würde auch 
ein Raspberry Pi Pico funktionieren. Mit den PIOs kann man ein I2S 
Interface realisieren.
Klar gibt noch mehr ucs, ein ESP32 hat sogar I2S native an Board.
Mit AVR wird es aber wohl eher eng.
Ein Teensy 3.x oder 4.x haben auch native I2S. Es gibt passend ein 
Audioboard dazu.

von Frank K. (fchk)


Lesenswert?

Christian schrieb:

> ich möchte gerne Sounds auf einem AVR ausgeben. Der Standard dazu ist
> anscheinend I2S. Natürlich können das die 8-Bitter wiedermal nicht
> native, deshalb muss man mal gucken....

Wenn Du auch für andere Sachen offen bist:
https://www.microchip.com/en-us/product/dsPIC33FJ128MC804

Der hat einen 14 Bit Stereo DAC. Audio Daten holst Du Dir dann aus einem 
SPI-Flash. Gibts auch als ...MC802 mit 28 Pins statt 44.

fchk

von Motopick (motopick)


Lesenswert?

Einem 8 Bit AVR waere wohl ein 8 Bit R/2R-DAC an z.B. einem HC595
Schieberegister angemessen. Mehr an Qualitaet lohnt da nicht.

> Wenn Du auch für andere Sachen offen bist:
> https://www.microchip.com/en-us/product/dsPIC33FJ128MC804
> Der hat einen 14 Bit Stereo DAC.

Interessanter Tip. :)

von Peter D. (peda)


Lesenswert?

Ich habe mal vor langer Zeit ein 8kHz WAV mit dem AT89C2051 über R2R-DAC 
von einem AT24C512 ausgegeben. Mit dem Komparator habe ich noch einen 
ADC programmiert, um die Geschwindigkeit zu variieren (Lok-Sound).
Das C-Programm und den Schaltplan könnte ich noch irgendwo haben.

von Peter H. (hardwaredoc)


Lesenswert?

Für einfache Töne kann man den Sound befehl ( Bascom Basic Compiler für 
AVR )
benutzen.

Wenn es etwas anspruchsvoller sein sollte gabs da schon mal was, siehe 
link:

http://elm-chan.org/works/sd8p/report.html

Gruß
Peter

von Axel S. (a-za-z0-9)


Lesenswert?

Christian schrieb:

> ich möchte gerne Sounds auf einem AVR ausgeben.

"Sounds"? Audio-Ausgabe ist ein weites Feld. Früher hat uns ja BEEP 
gereicht. Du hast anscheinend etwas mehr vor. Was?

> Der Standard dazu ist anscheinend I2S.

Nein. I²S ist eine Standard Schnittstelle zur Anbindung von Audio-DAC. 
Ansonsten brauchst du einfach eine Schnittstelle passend zum gewählten 
DAC. Im einfachsten Fall ist das ein 8-Bit IO-Port, an dem ein R-2R 
Netzwerk hängt.

> Natürlich können das die 8-Bitter wiedermal nicht
> native, deshalb muss man mal gucken....

Natürlich können sie das nicht (bzw. sehr selten). Genauso wenig wie die 
Datenmengen (192KB für 1s in CD-Qualität) oder auch nur die Datenrate. 
Letzteres zumindest nicht, wenn sie gleichzeitig die Daten von einem 
Massenspeicher lesen müssen oder gar noch was anderes tun.

Du wirst also Abstriche bei der Samplingrate und Bitbreite machen 
müssen. Zwischen CD (44.1kHz, 16 Bit, stereo) und Telefon (8kHz, 8 Bit, 
mono) wirst du dir was aussuchen müssen.

Natürlich gibt es Experten, die den µC voll ausreizen und es doch 
irgendwie schaffen. Z.B. http://elm-chan.org/works/sd8p/report.html. Das 
ist zugegebenermaßen beeindruckend. Aber da macht der µC nichts anderes 
mehr. Und ohne Assembler geht da auch nichts.

> Da habe ich mich gefragt, ob das nicht auch einfacher geht. Gibts sowas
> wie eine SPI to I2S Bridge? Würde mich auch nicht stören, wenn man da
> direkt WAVs oder sogar MP3s hinschicken kann.

Für MP3 gibt (gab?) es den VS1001. WAV ist im wesentlichen ein Container 
für die Samples. Wenn man sich sowieso auf eine Bitrate beschränkt, kann 
man den Header auch weglassen und nur die rohen Samples speichern. 
Ansonsten siehe ELM.

Auch zum Thema MP3 hat sich ELM ausgelassen. Allerdings kann man MP3 
heutzutage auch in einem größeren Cortex-M direkt decodieren.

Schließlich beinhaltet "Sounds" auch synthetisch erzeugte Klänge. Du 
kannst also auch einen z.B. Wavetable Synthesizer auf dem AVR 
implementieren. Oder einen Klassiker wie den C64 SID.

: Bearbeitet durch User
von Christian (dragony)


Lesenswert?

Hm ja, ich wollte es nicht zu kompliziert aufschreiben, aber habe es 
dann wiedermal zu einfach aufgeschrieben.

Es geht um Klingeltöne in CD-Qualität, also 44.1 kHz / 16 Bit, 5-30s 
aber Mono. Den ganzen Kram packe ich passend formatiert via USB auf 
einen SPI-Flash von Winbond. Der AVR soll dann die Daten holen und auf 
einem kleinen 3W Speaker ausgeben.

Man könnte es ggf. sogar so clever lösen, dass die Daten gar nicht durch 
den AVR laufen, indem man den SPI-Flash mit dem I2S-DAC verbindet und 
einfach die CLK laufen lässt. Bei I2S muss man dabei aber dieses LRCLK 
mitsynchronisieren. Tricky, aber möglich. Falls es nicht geht, muss man 
das ganze durch den AVR pipen, d.h. man muss zwei USARTS parallel laufen 
lassen.

Da ich in AVR Assembler ganz fit bin, sehe ich da kein Problem. Ich habe 
da schon wilderes gemacht.

Ich kämpfe aber noch mit dem Teil "auf einem kleinen 3W Speaker 
ausgeben"... Da fehlt mir einfach die Erfahrung im analogen Bereich. Ich 
habe mir jetzt einfach mal den TFA9879 ausgesucht. Der nimmt I2S 
entgegen und kümmert sich um den Rest. I2S muss dann wohl einfach 
irgendwie gehen.

Es gab jedoch wesentlich mehr Auswahl an Class-D Verstärker mit analogen 
Eingängen, also wollte ich mich da schlau machen, wie ich so einen 
ansteuern könnte. Aber da kam ich nicht weiter. Alle Monoverstärker 
haben zwei Eingangspins, wollen also differentiellen Input haben. 
Differentielle DACs habe ich aber gar nicht gefunden (von ein paar 
überteuerten Ausnahmen für irgendwelche exotischen Anwendungen mal 
abgesehen).

Teilweise werden die wohl auch single-ended angeschlossen, also der IN- 
einfach gegrounded. Dabei geht aber die halbe Dynamik flöten und man 
muss seriell mit Kerkos DC blocken.

Wie man es richtig macht, ist mir immernoch nicht klar :(

Bin für jede Hilfe dankbar :)

von Christian (dragony)


Lesenswert?

Axel S. schrieb:
> Natürlich gibt es Experten, die den µC voll ausreizen und es doch
> irgendwie schaffen. Z.B. http://elm-chan.org/works/sd8p/report.html. Das
> ist zugegebenermaßen beeindruckend. Aber da macht der µC nichts anderes
> mehr. Und ohne Assembler geht da auch nichts.

Uff, das Teil ist heftig. Direkt via PWM einen Class-D Verstärker 
aufgebaut. Hmmmm ja wäre definitiv eine Möglichkeit. 3W sind so aber 
nicht drin. Ich denke für meinen Fall wäre ein 3W class-d verstärker IC 
schon das richtige. Ich muss nur noch wissen, wie ich die Dinger richtig 
differentiell ansteuern kann.

von Rick (rick)


Lesenswert?

Christian schrieb:
> Ich muss nur noch wissen, wie ich die Dinger richtig
> differentiell ansteuern kann.
Ein Stichwort wäre: "Single-Ended-to-Differential Amplifier"

Christian schrieb:
> 3W sind so aber nicht drin.
Ich hätte ja für den Anfang einen LM386 vorgeschlagen, aber der wird nur 
mit 0,7 W beworben...

von Frank K. (fchk)


Lesenswert?

Christian schrieb:

> Es gab jedoch wesentlich mehr Auswahl an Class-D Verstärker mit analogen
> Eingängen, also wollte ich mich da schlau machen, wie ich so einen
> ansteuern könnte. Aber da kam ich nicht weiter. Alle Monoverstärker
> haben zwei Eingangspins, wollen also differentiellen Input haben.
> Differentielle DACs habe ich aber gar nicht gefunden (von ein paar
> überteuerten Ausnahmen für irgendwelche exotischen Anwendungen mal
> abgesehen).

Siehst Du. Unpassende Hardware halt. Die von mir vorgeschlagenen dsPIC33 
haben das eingebaut. Einfach so. Nichtinvertierender Ausgang, 
invertierender Ausgang und Midpoint. Für den linken und den rechten 
Kanal. Mit FIFOs und DMA-Support.

Lies das:
https://ww1.microchip.com/downloads/en/DeviceDoc/70211B.pdf

Ach ja, I2S haben diese Teile auch noch. Heißen dort DCI Data Conversion 
Interface. Lies das:
https://ww1.microchip.com/downloads/en/DeviceDoc/70288C.pdf

fchk

von Gerhard H. (hauptmann)


Lesenswert?

Christian schrieb:
> Da ich in AVR Assembler ganz fit bin, sehe ich da kein Problem. Ich habe
> da schon wilderes gemacht.

Beitrag "Westminster Soundgenerator mit ATtiny85"

von Max D. (max_d)


Lesenswert?

Wenn du eh einen Dataflash hast wäre wsl der rp2040 (aka pi pico) der 
beste Kandidat. Der lädt davon nämlich auch gleich seinen Programmcode.
Einzig die grottigen Energiesparmodi können etwas stören, aber von 
Batteriebetrieb hab ich bis jetzt noch nichts hier gelesen.

von Christoph M. (mchris)


Lesenswert?

>Es geht um Klingeltöne in CD-Qualität, also 44.1 kHz / 16 Bit, 5-30s
>aber Mono. Den ganzen Kram packe ich passend formatiert via USB auf
>einen SPI-Flash von Winbond. Der AVR soll dann die Daten holen und auf
>einem kleinen 3W Speaker ausgeben.

Ein AVR ist für diese Ansprüche ans Soundqualität nicht geeignet.
Nimm einen ESP32 und diesen Verstärker:
https://www.adafruit.com/product/3006

von H. H. (Gast)


Lesenswert?

Christian schrieb:
> Es geht um Klingeltöne in CD-Qualität, also 44.1 kHz / 16 Bit, 5-30s
> aber Mono. Den ganzen Kram packe ich passend formatiert via USB auf
> einen SPI-Flash von Winbond. Der AVR soll dann die Daten holen und auf
> einem kleinen 3W Speaker ausgeben.

http://elm-chan.org/works/sd8p/report.html

von Georg M. (g_m)


Lesenswert?


von Ob S. (Firma: 1984now) (observer)


Lesenswert?

Christoph M. schrieb:

> Ein AVR ist für diese Ansprüche ans Soundqualität nicht geeignet.

Das würde ich unterschreiben. Es ist zwar durchaus möglich, den nötigen 
Durchsatz von rund 176kByte/s zu schaffen, aber es ist Sackstand.

Es gibt weder was für eine effiziente Eingabe vom Speichermedium noch 
was für eine effiziente Ausgabe des Sounds, d.h.: nahezu alles muß die 
MCU erledigen. Genug Buffer-RAM, um kurze "Hänger" ausgleichen zu 
können, gibt's auch nicht.

Machbar, aber ziemlich sinnlos, wenn man einen Pi Pico mit unendlich 
viel besserer Hardware für ~6€ zu kaufen bekommt.

Eine Alternative wäre, sich bei den Qualitätsanforderungen zu 
bescheiden. Was nützt eine Soundkette in CD-Qualität, wenn am Ende der 
Kette ein 3W-Brüllwürfel hängt?

von Veit D. (devil-elec)


Lesenswert?

Georg M. schrieb:
> ATtiny412 をってみた
>
> https://www.youtube.com/watch?v=1uYvAH7fsBA

Genau sowas.

https://wolles-elektronikkiste.de/dfplayer-mini-ansteuerung-mit-dem-arduino

Reichelt Artikel-Nr.: ARD DFPAYER MINI

Dann wird der µC zum steuern dessen verwendet.

von Bernd G. (Gast)


Lesenswert?

Christian schrieb:
> ich möchte gerne Sounds auf einem AVR ausgeben.

Vlt erst definieren , was mit "sounds" gemeint ist? Ein Tuten geht mit 
einfachem Rechteck. Mit 2 Pins geht ein PSEUDO-Sinus wie wir ihn von 
Sinus-Generatoren kennen.

von Klaus (feelfree)


Lesenswert?

🐻 Bernie - Bär schrieb:
> Vlt erst definieren , was mit "sounds" gemeint ist?

Oder erst den Thread lesen, bevor man sich im Kreis dreht.

Christian schrieb:
> Es geht um Klingeltöne in CD-Qualität, also 44.1 kHz / 16 Bit, 5-30s
> aber Mono.

von Jens G. (jensig)


Lesenswert?

Klaus schrieb:
> Oder erst den Thread lesen, bevor man sich im Kreis dreht.

Geht nicht. Er ist in einem anderen Thread zu sehr mit seinem Bären 
beschäftigt ...

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.