Bei uns im Wohnzimmer steht ein Receiver, der ziemlich genau 50 Jahre auf dem Buckel hat. Der Sony STR-V5 hat richtig Wumms, ist mit Wire-Wrap Verbindungen verkabelt wie frühere Raumfahrttechnik und wird sicher auch noch weitere 50 Jahre funktionieren. Das Problem war nur, dass er mit seinen Cinch-Eingängen nicht mehr mit aktuellen Geräten kompatibel ist, die drahtlos übertragen. Daraus entstand die Idee, für den Receiver einen etwas besseren Bluetooth-Empfänger zu bauen im Passenden Retro-Look. Das Endergebnis ist hier schon mal zu sehen.
Bluetooth-Audio
Vor diesem Projekt hatte ich keine Ahnung von Bluetooth. In meiner Vorstellung klang es recht einfach, die Audiodaten zu übertragen und dann abzuspielen. Leider ist es nicht ganz so. Aufgrund der begrenzten Datenrate einer Bluetooth-Funkverbindung müssen die Daten komprimiert werden. Das übernimmt ein „Codec“. Der muss natürlich der gleiche sein auf der Sender- und der Empfangsseite. Die ältesten und derzeit am weitesten verbreiteten Codecs sind „AAC“ und „SBC“. Audiophile Nutzer waren mit der Qualität dieser Kompression nicht zufrieden, sodass eine Reihe neuer Standards versuchen den Markt zu erobern. Neben „SBC“ und „AAC“ wetteifern nun auch “ aptX“, „aptX HD“ und „LDAC“ um die Gunst des Kunden. Nicht vergessen: Sender und Empfänger müssen den gleichen Codec unterstützen. Wenn man sich z.B. einen Bluetooth-Kopfhörer mit „aptX“ kauft, der Receiver aber „LDAC“ spricht, kommt nur eine Verbindung mit „SBC“ zustande, falls es überhaupt klappt.
Insgesamt ist der Bluetooth-Standard ziemlich komplex und mein Interesse hält sich in Grenzen da noch weiter einzutauchen. Die Software benutzt „SBC“, was von quasi allen Geräten unterstützt wird.
Lautstärkeregelung
Während der Programmierung ist mir aufgefallen, dass die Lautstärkeregelung bei Bluetooth der Knackpunkt ist. Das Grundproblem besteht darin, dass die Audio-Samples mit 16 Bit und üblicherweise 100% Lautstärke übertragen werden. Im Empfänger wird nun die Lautstärke reduziert auf sagen wir mal 35%. Das bedeutet, dass wir die Audio-Samples ungefähr durch 16 teilen müssen. Als Ergebnis haben wir Audiodaten mit einer Auflösung von nur noch 12 Bit. Und genauso hört sich das dann an.
Eine einfache Lösung für das Problem ist ein 32 Bit D/A-Wandler. Die empfangenen 16 Bit Samples werden in 32 Bit Werte umgewandelt, indem einfach Nullen angehängt werden. Das macht erst mal keinen Unterschied. Im zweiten Schritt können wir aber die Lautstärke mit dem 32 Bit-Wert berechnen und diesen dann direkt an den D/A-Wandler senden. Dadurch gibt es keinen Informationsverlust bei geringer Lautstärke, die 16 Bit Information bleiben erhalten.
Über die Geheimnisse einer gefälligen Lautstärkeregelung hatte ich kürzlich einen Artikel geschrieben.
Bauteile
Herzstück der Schaltung ist ein Mikrocontroller ESP32 der Firma Espressif. Das System bietet nicht nur reichlich Rechenleistung für 3,50 Euro, sondern ist auch noch stromsparend. Es gibt sehr viele Code-Beispiele vom Hersteller und lebhafte Diskussionen in Foren, was Anwendungsentwicklung und Fehlersuche erleichtern.
Als hochwertiger D/A-Wandler kommt ein PCM5102A von Texas Instruments mit 32 Bit und 112dB Signal-Rausch-Abstand zum Einsatz. Eigentlich ist der für Bluetooth-Audio viel zu gut, die Vorteile der 32 Bit zahlen sich aber bei der Lautstärkeregelung aus.
Das ganze wird noch ergänzt durch zwei Taster für Lautstärke und Reset, ein 128×64 Pixel OLED-Display und eine Lochraster-Platine. Bei diesem Projekt verwende ich fertige Module, die nur noch miteinander verbunden werden müssen. Das geht natürlich viel schneller, als ein eigener Platinen-Entwurf.
Schaltung
Da ich für das Projekt fertige Module verwendet habe, beschränkt sich die Schaltung auf wenige Verbindungen des zentralen ESP32 Moduls mit dem OLED-Display, dem D/A-Wandler und den zwei Tastern. Das ganze ist in einer Stunde zusammengelötet.
Das Schaltbild steht hier als pdf zur Verfügung.
Gehäuse
Aus verleimten Sperrholzresten habe ich ein kleines Gehäuse gebaut, was ganz chic geworden ist und für meinen Geschmack und gut zum Sony-Receiver passt.
Software
Die Software ist abgeleitet vom Beispiel „A2DP-SINK“ des ESP32-Herstellers Espressif. Das hat die Entwicklungszeit sehr verkürzt für mich, da die komplette und ziemlich komplexe Bluetooth-Kommunikation bereits im Beispiel implementiert ist. Ich habe noch eine Verarbeitung der Audio Samples für die Lautstärkeregelung und die Umwandlung von 16 zu 32 Bit hinzugefügt wie oben beschrieben. Außerdem habe ich die Routinen für das OLED-Display ergänzt. Auf dem Display wird der Betriebszustand, das verbundene Gerät und eine logarithmische Pegelanzeige dargestellt.
Am Ende hat die Programmierung und Fehlersuche dann doch deutlich länger als ein Wochenende gedauert, da noch eine Menge Bugs zu finden und zu beseitigen waren.
Den kompletten Quellcode, die Bedienungsanleitung und Anweisungen zum Compilieren des Projektes habe ich auf Github veröffentlicht.
https://github.com/uhucrew/bt-receiver-pcm5102a