Bluetooth Audio Receiver mit PCM5102A

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.

Receiver betriebsbereit
Receiver betriebsbereit

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.

ESP-WROOM-32D Modul
ESP-WROOM-32D Modul

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.

D/A-Wandler Board
D/A-Wandler Board

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.

Bauteile
Bauteile

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.

Verdrahtung Unterseite
Verdrahtung Unterseite
Schaltbild
Schaltbild

Das Schaltbild steht hier als pdf zur Verfügung.

Prototyp
Prototyp
Funktionstest
Funktionstest

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.

Gehäuse aus Sperrholz - Vorderseite

Gehäuse aus Sperrholz - Unterseite
Gehäuse aus Sperrholz, Vorder- und Unterseite

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

 

 

Bekomme Updates per Email

Loading

2 Antworten auf „Bluetooth Audio Receiver mit PCM5102A“

    1. Hello,
      I’m not so familiar with all the Bluetooth stuff. There are two callback functions to receive metadata in the Espressif code. I tried both but didn’t receive any metadata.
      So I’m giving up. If there is anyone out there with a hint, please write me.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert