Kein Schreibfehler, nicht I2C (bzw. I²C = Inter-Integrated Circuit), sondern tatsächlich I2S (bzw. I²S = Inter-IC Sound).
Dabei handelt es sich um eine ebenfalls von Fa. Philips entwickelte serielle Schnittstelle, jedoch nur für die Übertragung von digitalen Audiodaten.
Auf der Suche nach möglichen neuen Produkten für das Sortiment von AZ-Delivery war ich auf ein kleines Breakout-Board mit Namen „MAX98357 Amplifier Breakout Interface I2S Class D Module for ESP32 Raspberry Pi“ gestoßen.
Inzwischen sind die Teile (bis auf den Raspberry Pi, der produktionsbedingt nicht geliefert werden kann) im Sortiment von AZ-Delivery verfügbar. Deshalb hier die Liste mit der verwendeten Hardware:
1 |
Raspberry Pi, z.B. 3 B+ |
2 |
|
2 |
|
1 |
(Mini)-Breadboard, Jumperkabel |
Zurück zu den ersten Versuchen. Wie immer bei Bestellungen aus Fernost habe ich mich auf eine mehrwöchige Lieferzeit eingestellt und weitere Unterstützung wie Schaltplan, Programm-Bibliothek und Demo-Programm an anderer Stelle im Internet gesucht. Und gefunden: wie so oft bei den Kollegen der US-amerikanischen Fa. Adafruit, die ein baugleiches Board verkaufen.
Auf der Adafruit-Seite finde ich u.a. die Erklärung, warum bei dem Produktnamen des MAX98357 Boards nur ESP32 und Raspberry Pi stehen: die Mikrocontroller mit ATMega328 haben keine I2S-Schnittstelle. Ich entscheide mich für die ersten Versuche für den Raspberry Pi und folge der Anleitung von Lady Ada und ihrem Team, die leider nicht mehr ganz aktuell ist, aber mir dennoch gut weiterhilft.
Auf dem kleinen Breakout-Board werden zunächst der Terminal-Block für die Lautsprecheranschlüsse, sowie eine siebenpolige Pinleiste angelötet.
Wichtiger Hinweis: Ausgang nicht auf einen Verstärkereingang schalten! Anschluss nur für Lautsprecher mit 4 bis 8 Ohm, Ausgangsleistung beträgt ca. 3 Watt.
Anschluss an den Raspberry Pi mit 2x20 J6 Header wie folgt:
Vin an Pin 2 (5V) für maximale Ausgangsleistung
GND an Pin 6
DIN an GPIO 21 (Pin 40)
BCLK an GPIO 18 (Pin 12)
LRC an GPIO 19 (Pin 35)
Die Anschlüsse für GAIN und SD bleiben zunächst unbelegt. Die default-Einstellungen sind dann GAIN = 9 dB, Lautsprecherausgang hat (L+R)/2, also beide Stereo-Kanäle als Mono-Ausgang.
Um die I2S-Schnittstelle zu aktivieren, müssen wir einige Ergänzungen und Änderungen am Raspberry Pi OS vornehmen. Es gibt keine Wahlmöglichkeit im Konfigurationsmenü wie für die anderen Schnittstellen. Stattdessen wird im Unterverzeichnis /boot/ die Datei config.txt bearbeitet, selbstverständlich mit SuperUser-Rechten.
sudo nano /boot/config.txt
In diesem Editor kann man nicht mit Mausklick arbeiten, bei mir hat aber das Scroll-Rad funktioniert. Ansonsten mit den Cursor-Tasten klicken bis zu der Zeile mit
dtparam=audio-on
Diese Zeile wird auskommentiert. Danach ergänzen wir
#dtparam=audio-on
dtoverlay=hifiberry-dac
dtoverlay=i2s-mmap
Mit Strg + O und Enter speichern wir die Datei config.txt, mit Strg + X beenden wir den Editor.
Danach muss der Raspberry Pi neu gestartet werden, z.B. mit
sudo reboot
Wenn wir dann mit der rechten Maustaste auf das Lautsprechersymbol klicken, werden die Auswahlmöglichkeiten für die Tonausgabe angezeigt, vor den Änderungen HDMI und AV Jack, nach den Änderungen HDMI und snd_rpi_hifiberry_dac. Wenn wir den hifiberry auswählen, kommt die Musik aus dem Lautsprecher am Breakout-Bord MAX98357A, wenn alles richtig angeschlossen ist.
Hier noch zwei ScreenShots vom Raspberry Pi, das erste das neu gestaltete Konfigurationsmenü für die Schnittstellen - I2S ist nicht dabei. Anschließend der Text-Editor nano mit der Datei config.txt.
Nun steht dem ersten Test mit einem MAX98357A und Mono-Ausgabe nichts mehr im Wege. Und – heureka – es hat auf Anhieb geklappt. Dabei haben wir uns noch gar nicht im Detail mit den I2S-Signalen beschäftigt.
Hier ein Bild von meinem Versuchsaufbau mit einem alten PC-Lautsprecher, die neuen 3W-Lautsprecher von AZ-Delivery waren zu dem Zeitpunkt leider noch nicht angekommen. Über den Quantensprung in der Sound-Qualität mit den neuen 3W-Lautsprechern werden ich am Ende berichten.
Bislang hatten wir zwei Anschlüsse nicht benutzt, sondern die dann verfügbaren Voreinstellungen (default) genutzt. Im Falle GAIN war dies eine Verstärkung von 9 dB. Die anderen Möglichkeiten von 3 dB bis 15 dB erreicht man, indem man den GAIN-Anschluss direkt oder über einen 100 kOhm-Widerstand mit GND oder mit Vin verbindet. Im Einzelnen:
- 15dB mit 100K Widerstand zwischen GAIN und GND
- 12dB mit GAIN direkt an GND
- 9dB, wenn GAIN nicht verbunden ist (default)
- 6dB mit GAIN direkt an Vin
- 3dB mit 100K Widerstand zwischen GAIN und Vin
Diese Einstellungen habe ich nicht ausprobiert, weil mich der andere Anschluss viel mehr gereizt hat:
Beschriftet mit SD handelt es sich eher um eine Auswahl des MODE, bei einer Spannung unter 0,16 V (also z.B. mit GND verbunden) befindet sich der Chip/der Verstärker in shutdown (daher das SD), bei Spannungen zwischen 0,16 und 0,77 V werden beide Kanäle (Left + Right)/2 ausgegeben. Dies ist die Voreinstellung, da der eingebaute Pull-down-Widerstand von 100 kOhm mit dem auf dem Breakout-Board gut sichtbaren SMD-Widerstand von 1 MOhm eine Spannung in diesem Bereich ergibt.
Bei einer Spannung an SD zwischen 0,77 V und 1,4 V wird der rechte Stereo-Kanal ausgegeben, bei Spannungen über 1,4 V der linke Stereo-Kanal. Dann benötigt man selbstverständlich zwei MAX98357A-Module.
Aber woher bekommt man die richtige Spannung an SD?
Für die Untersuchung beginnen wir bei den beiden eingebauten Widerständen:
Bei Vin = 5 V ergibt der Spannungsteiler eine Spannung von ca. 0,45 V an SD; das liegt in dem Bereich für (L+R)/2, also Mono-Ausgabe beider Stereo-Kanäle.
Grundsätzlich kann der Spannungsteiler nur durch einen parallelen Widerstand zwischen SD und GND bzw. zwischen SD und Vin verändert werden. Eine Reihenschaltung mit den eingebauten Widerständen ist nicht möglich.
Um den Shutdown-Modus zu erhalten, genügt eine direkte Verbindung von SD mit GND.
Wer seine Musik in Stereo hören möchte, benötigt zunächst zwei MAX98357A, bei denen die im ersten Teil verwendeten Anschlüsse parallelgeschaltet werden. Dann schalten wir Widerstände zwischen SD und Vin, also parallel zum SMD-Widerstand mit 1 MOhm. Damit z.B. an SD ca. 1 V anliegt, benötigt man für das Modul mit dem rechten Kanal ca. 400 kOhm, für den linken Kanal würde sich ein Widerstand von ca. 150 kOhm eignen, damit an SD ca. 2 V anliegen. Nach dieser Überschlagsrechnung suche ich in meinem Sortiment nach geeigneten Widerständen.
Mit einem (gemessenen) 394 kOhm-Widerstand am rechten Kanal messe ich an VD eine Spannung von 1,2 V, bei 153 kOhm am linken Kanal 2,0 V. Und ich höre die Musik nun in Stereo.
Bei dem nachfolgenden Bild aus dem Datenblatt mit dem Signalverlauf kann man sehr schön sehen, dass die LRCLK deutlich langsamer taktet als die BitClock, um jeweils 16 Daten-Bits entweder an den rechten oder linken Kanal zu senden:
In jedem englischen Abschlussbericht steht: „There is always room for improvement“. Das gilt auch hier. Schwachpunkte bei meinem Versuchsaufbau sind sicherlich die schlechten Lautsprecher aus uralten PCs, die früher eigentlich nur beim Einschalten beep machen sollten. Und Störungen durch die Spannungsversorgung könnten sicherlich mit einem großen Kondensator abgemildert werden.
Alles in allem für mich ein spannender Versuch, mit zwei MAX98357A im Prinzip einen der (teuren) Aufsteck-Soundkarten nachzubauen.
Nachdem ich in der Zwischenzeit die neuen Teile aus dem Sortiment von AZ-Delivery bekommen habe, hier das Ergebnis der neuerlichen Versuche. Wie erwartet hat alles auf Anhieb geklappt. Pinleisten und Terminal-Blocks bei zwei MAX98357 Amplifier Breakout Interface I2S Class D Modulen eingelötet und diese in der Breadboard-Schaltung ausgetauscht, die neuen 3W-Lautsprecher angeschlossen und Stereo-Musik mit dem VLC-Mediaplayer abgespielt. Wie gesagt: ein Quantensprung in der Sound-Qualität, in jedem Fall besser als mein Lautsprecher im Monitor (von den alten PC-Lautsprechern ganz zu schweigen).
Hier noch ein Foto des Versuchsaufbaus mit den Teilen aus dem Sortiment von AZ-Delivery:
8 Kommentare
Andreas Wolter
@Manuel: wie Bernd Albrecht bereits per Mail informiert hat, gibt es spezielle I2S Mikrofon-Module.
Grüße,
Andreas Wolter
AZ-Delivery Blog
Manuel
Danke für den Beitrag. Ich frage mich wie man dann z.B. einen Speaker (Mono) und ein Mikrofon verdrahtet mit I2S. Geht das überhaupt?
Holger Kaumann
Hallo,
Danke für die Beschreibung wie i2s für Stereo-Ausgabe verwendet werden kann. Genau danach habe ich gesucht :-)
Bernd Albrecht
Gute Nachrichten für alle ESP32 Fans. Unser eBook-Schreiber hat es hin bekommen. Demnächst hier sein Sketch für Internet-Radio mit I2S.
Bernd Albrecht
@ Dieter: Warum Raspberry Pi und nicht ESP? Weil Programm und Musik-Daten Platz auf der gleichen µSD-Karte haben. Für den ESP bräuchte man einen Kartenleser. Dann kann man aber gleich ein kombiniertes Sound-SD Card-Modul nehmen wie das folgende:
https://www.az-delivery.de/products/wtv020-sound-audio-modul-sd-card-fur-arduino
Wer weitere Informationen wünscht zu I2S auf dem ESP32:
https://docs.espressif.com/projects/esp-idf/en/latest/esp32/api-reference/peripherals/i2s.html
Andreas Wolter
wenn Sie durch den Beitrag inspiriert wurden, fühlen Sie sich frei und nutzen ihn als Vorlage für solche Erweiterungen. Lassen Sie uns gerne wissen, was daraus geworden ist.
Grüße,
Andreas Wolter
AZ-Delivery Blog
Olaf Stolle
Hallo das finde ich total interessant.
Eine Steigerung wäre jetzt noch ein Cam module mit gegen Sprechanlage da würde ich mich sehr drüber freuen.
Dieter
Das gleiche jetzt noch mit dem ESP!