Raspberry Pi | David Wolski | 1-2023 | 25. November 2022

Bluetooth mit Raspberry Pi

Ein Raspberry Pi 3/4 oder ein Zero W kann als Empfangsstation für Bluetooth-Audio
dienen und so Hi-Fi-Geräte ansteuern, die selbst kein Empfangsmodul haben. Der grund­legende Aufbau gelingt allein mit Standardsoftware.

Ein Raspberry Pi 3/4 oder ein Zero W kann als Empfangsstation für Bluetooth-Audio
dienen und so Hi-Fi-Geräte ansteuern, die selbst kein Empfangsmodul haben. Der grund­legende Aufbau gelingt allein mit Standardsoftware.

Der neue Soundserver Pipewire ersetzt zusammen mit seinem Sessionmanager Wireplumber in aktuellen Linux-Distributionen das bisher verbreitete Pulse Audio. Anwender bekommen davon meist wenig mit – Hauptsache, es funktioniert. Geschaffen wurde Pipewire als nahtloser Ersatz und die Audioschnittstellen sehen für Programme und Treiber nicht anders aus als jene von Pulse Audio.

Pipewire kann aber mehr als der bisherige Soundserver und dient in diesem Projekt dazu, einen Raspberry Pi mit Bluetooth zu einer Empfangsstation zu machen, um Audiostreams von PCs, Smartphones, Tablets an die Platine zu senden, die diesen dann über eine angeschlossene Stereoanlage, Kopfhörer, Soundbar oder ein TV-Gerät ausgibt. Pipewire und Wireplumber sind für den Einsatz auf kleinen Embedded-Geräten geschaffen und deshalb effizient in C programmiert. Diese Linux-Komponenten überfordern also selbst den Raspberry Pi Zero W nicht, ein Modell 3 oder 4 erst recht nicht. Es handelt sich also um eine Lösung für Hi-Fi- und Unterhaltungselektronik, die selbst keinen Bluetooth-Empfänger hat.

Eigene Schaltungen mit Breadboard und fliegendem Aufbau sind nicht nötig – es ist ein Softwarethema mit Standardkomponenten. Die folgende Anleitung umfasst allerdings intensive Arbeiten in der Kommandozeile.

Raspberry-Pi-OS: Neuer ist besser

Als die ersten Raspberry-Pi-Modelle mit eigenem Bluetooth-Chip auf den Markt kamen, war Raspberry-Pi-OS mit seiner Firmware und Treibern noch gar nicht so weit, Bluetooth optimal zu nutzen: Verbindungen waren instabil und auch nur auf geringe Distanzen möglich.

Mit der aktuellen Ausgabe von Raspberry-Pi-OS vom September 2022 hat sich die Bluetooth-Unterstützung durch neue Treiber deutlich gebessert.

Es lohnt sich also, mit einer möglichst frischen Ausgabe des Standardsystems für die Platine zu arbeiten. Ein bereits installiertes Raspberry-Pi-OS auf der Basis von Debian 11 „Buster“ bezieht die Verbesserungen aber auch über ein schlichtes „sudo apt upgrade“.

Backports: Pakete installieren

Pipewire und Wireplumber sind in der hier verlangten Version erst in der kommenden Ausgabe „Bookworm“ von Raspberry-Pi-OS verfügbar, aber seit November 2022 auch in den Backports. Diese müssen als Repository erst manuell eingebunden werden, was der Befehl

echo "deb https://deb.debian.org/debian/ bullseye-backports main contrib non-free" | sudo tee /etc/apt/sources.list.d/bullseye-backports.list

auf dem Raspberry Pi erledigt. Die Pakete dort haben eine neuere Signatur und der dazugehörige Schlüssel muss noch importiert werden. Dazu wechselt das Kommando

sudo -s

zu einer root-Shell und die Kommandos

gpg --keyserver keyserver.ubuntu.com --recv-keys 04EE7237B7D453EC

gpg --keyserver keyserver.ubuntu.com --recv-keys 648ACFD622F3D138

beziehen die zusätzlichen Schlüssel, die dann mit den beiden Eingaben

gpg --export 04EE7237B7D453EC | sudo apt-key add -

gpg --export 648ACFD622F3D138 | sudo apt-key add -

in den Paketmanager eingelesen werden. Die root-Shell kann jetzt mit Strg-D oder „exit“ beendet werden. Danach bezieht das Kommando

sudo apt -t bullseye-backports install pipewire wireplumber libspa-0.2-bluetooth

gezielt nur die aktuelleren Pipewire- sowie Wireplumber-Pakete. Zum Abschluss der Aktion ist ein Neustart des Raspberry-Systems nötig.

Pairing-Agent: Bluetooth aktivieren

Pairing als Audiogerät: Der Raspberry Pi meldet sich bei einer Suche nach Bluetooth-Geräten mit seinem Hostnamen. Einige Clients zeigen bei der Verbindung unkritische Fehlermeldungen.

Damit die Platine eingehende Bluetooth-Verbindungen akzeptiert, sorgt ein Python-Script in einem selbst gebauten Systemd-Dienst für die Empfangsbereitschaft. Das benötigte Python-Script, das vom Dienst aufgerufen wird, liegt auf Github. Der Befehl

wget https://raw.githubusercontent.com/fdanis-oss/pw_wp_bluetooth_rpi_speaker/master/speaker-agent.py

lädt es als „speaker-agent.py“ ins Home-Verzeichnis herunter, wo es dann dauerhaft verbleibt.

Der zugehörige Dienst läuft im Benutzerkontext und mit dem Kommando

mkdir -p ~/.config/systemd/user/

muss dazu im Home-Verzeichnis erst noch ein passender Ordner angelegt werden. Dort legt dann

sudo nano ~/.config/systemd/user/speaker-agent.service

eine neue Systemd-Dienstdatei an, welche den Inhalt aus dem Listing „Bluetooth-Empfang: Systemd-Dienst“ auf dieser Seite erhält. Eine Modifikation der Bluetooth-Konfiguration ist noch nötig, damit später eine Bluetooth-Verbindung zum Raspberry Pi automatisch immer neu aufgebaut wird, sollte sie mal abbrechen:

sudo sed -i 's/#JustWorksRepairing.*/JustWorksRepairing = always/' 
/etc/bluetooth/main.conf

Nun wird der neue Systemd-Dienst mit der Eingabe (ohne „sudo“)

systemctl --user enable --now speaker-agent.service

permanent in Gang gesetzt, damit dieser beim Systemstart automatisch im Benutzerkontext ausgeführt wird. Der Raspberry Pi ist jetzt als Audiogerät per Bluetooth erreichbar und ein Pairing gelingt ohne weitere Bestätigung auf dem Zielsystem, um Audiostreams auszugeben. In den Bluetooth-Einstellungen der Clientgeräte taucht der Raspberry Pi in der Liste der verfügbaren Geräte mit seinem Hostnamen auf (oft „raspberrypi“).

Auf Empfang gestellt: Ein Systemd-Dienst im Benutzerkontext präpariert den Raspberry als Bluetooth-Gerät.

Hinweis: Nach dieser Anleitung arbeitet ein Raspberry Pi nur als Ziel für Bluetooth-Audio, bildet aber nicht alle Fähigkeiten eines Bluetooth-Geräts ab. Beim Pairing zeigen einige Clients deshalb Warn- oder Fehlerhinweise an, stellen aber eine Verbindung für Audiostreams dennoch tadellos her. Eventuelle Fehlermeldungen kann man also getrost ignorieren.

Besserer Sound: Digital-Analog-Wandler

Ein Raspberry Pi hat keinen ausgewachsenen Digital-Analog-Wandler. Der analoge Kopfhörerausgang wird über Pulsweitenmodulation (PWM) bedient, die direkt im System-on-Chip (SoC) untergebracht ist. Je hochwertiger der verwendete Kopfhörer oder die angeschlossene Stereoanlage ist, desto deutlicher macht sich das Defizit der Raspberry-Pi-Modelle bemerkbar: Die 3,5-
mm-Buchse liefert eher dünne Klangqualität. Zwei Möglichkeiten für besseren Sound aus dem Raspberry Pi bieten sich an:

1. HDMI: Ist das Gerät über einen HDMI an einen Hi-Fi-Verstärker oder einen Smart-TV angeschlossen, tritt dieser Mangel in Sachen Audioqualität nicht auf. HDMI überträgt neben dem Videosignal auch den Ton direkt auf digitalem Weg. Das Hi-Fi-Gerät oder der TV wandelt das Signal selbst von digital zu analog.

2. Separater DA-Wandler: Auf die Pin-Brücke des Raspberry Pi 3 oder 4 kann der Digital-Analog-Wandler Hifi DAC PCM5122 von Innomaker gesteckt werden, der mit dem System über den I2S-Bus kommuniziert. Die Zusatzplatine gibt ein analoges Audiosignal auf zwei Cinch-Buchsen aus. Auf der Platine arbeitet ein hochwertiger Texas-Instruments-Wandler mit einer Abtastrate von 384 kHz und 32 Bit Auflösung. Die Aufsteckplatine, die für rund 40 Euro im Versandhandel zu haben ist (https://amzn.to/3t1fgR5), benötigt keine eigene Stromversorgung.

Satter Sound: Wer dem Raspberry Pi ein gutes analoges Audiosignal entlocken will, braucht einen hochwertigen DA-Wandler wie die Aufsteckplatine von Innomaker.

Zusätzliche Info:
Bluetooth-Empfang: Systemd-Dienst

[Unit]

Description=Bluetooth speaker agent

[Service]

ExecStart=python speaker-agent.py

[Install]

WantedBy=default.target