Raspberry Pi als Musikabspielgerät an der Stereoanlage
Aus BraLUG-Wiki
Inhaltsverzeichnis |
Was soll das hier?
Eigentlich wollte ich nie beim "Raspberry Pi"-Hype mitmischen. Als eingefleischter Pinguin muß ich immer innerlich grinsen, wenn die neuen "Linuxversteher" von ihren genialen Projekten berichten, aber meist nicht so richtig wissen, was sie tun...! Allerdings hatte ich mir vor einiger Zeit auch so ein Ding angeschafft, weil der Mini-Rechner für meine Wetteraufzeichnungen, nach langen Jahren klaglosen Betriebes, plötzlich rumzickte. Die aufgetretenen Probleme konnten aber gelöst werden, die Hardware arbeitet wieder stabil und nun lag der voreilig gekaufte Raspberry arbeitslos auf meinem Schreibtisch rum....
Irgendwann kam mir dann doch eine Idee zu einem sinnvollen Einsatzzweck, für die es sich lohnte etwas Gehirnschmalz zu vergeuden. Ich wollte meine, auf einer Netzwerk-Festplatte abgelegten, MP3-Dateien auch auf der Stereoanlage im Wohnzimmer komfortabel abspielen können. Diese Stereoanlage ist nicht netzwerkfähig, um Mediaserver etc. einzubinden und hat auch keinen USB- oder sonst-was-Anschluß. Es steht nur der gewohnte einfache Verstärkereingang zur Verfügung...
Nach ein wenig Recherche, Rumprobieren und etwas Softwareentwicklung entstand ein kleines "Musikabspielgerät" auf Basis eines Raspberry Pi mit einem kleinen Touch-Display zur einfachen Bedienung (WAF beachten). In der Folge soll das Ganze mal ein wenig beschrieben werden.
Hinweis: Es wird dabei vorausgesetzt, dass der Leser dieses Artikels die wichtigsten Grundkenntnisse über das Betriebssystem Linux besitzt und sich z.B. nicht wundert, warum man als Non-Root keine Schreibzugriffe auf /usr/bin hat (siehe oben ;-))!
Hardware
Raspberry Pi mit Touch-Display
Hardwareseitig ist ein Raspberry Pi Dreh- und Angelpunkt des hier vorgestellten Musikabspielgerätes. Da es unendlich viele Webseiten zum Thema "Raspberry Pi" im Internet gibt, will ich nicht noch eine anfangen.... Vielleicht nur soviel: für dieses kleine Projekt setze ich ein Board vom Modelltyp B ein.
Interessanter ist da schon das dazugehörige Touch-Display mit folgender Spezifikation:
- TFT-Display: 2.83", 240x320 (Transmissiv)
- Touch Controller: TI ADS7846/TSC2046
- Hintergrundbeleuchtung dimmbar (PWM)
- Schnittstelle: SPI (Touch Controller + Display)
Die Platine des Displays ist so gestaltet, dass sie direkt auf das Raspberry-Board gesteckt werden kann. Mit einem entsprechend angepaßten Gehäuse ergibt das Ganze ein nettes kleines ansehliches Gerät. Ich habe das Raspberry-Board, das Display und das Gehäuse im Bundle bei einem gut sortierten Elektronik-Versender eingekauft.
Ein speziell für das Touch-Display angepaßtes Linux-Image (Basis: Raspbian), welches einfach auf eine SD-Karte kopiert wird, findet man hier.
USB-Soundkarte
Wie allseits bekannt, ist die interne Soundkarte des Raspberry Pi qualitativ nicht besonders. Weiterhin will das System auch an den Verstärkereingang meiner Stereoanlage anschliessen. Also musste eine vernünftige externe USB-Soundkarte her. Meine Wahl fiel auf die USB-Soundkarte U-Control UCA-202 der Firma Behringer. Neben den expliziet gesuchten Audio-Ein-/-Ausgängen via Cinch-Buchsen, verfügt das Teil auch über einen optischen S/PDIF Ausgang und einen Kopfhöreranschluss mit Lautstärkeregler als gern "mitgekaufte" Ausstattung. Die Audioqualität ist, soweit ich das beurteilen kann, sehr gut und reicht für meine Belange vollkommen aus. Die Anschaffung lohnt sich auf jeden Fall!
Der Anschluss der Soundkarte an den Raspberry Pi gestaltete sich recht einfach. Sie wurde sofort vom System erkannt und das entsprechende Kernelmodul problemlos nachgeladen.
> lsusb ... Bus 001 Device 004: ID 08bb:2902 Texas Instruments Japan PCM2902 Audio Codec ...
> dmesg ... usb 1-1.2: New USB device found, idVendor=08bb, idProduct=2902 usb 1-1.2: New USB device strings: Mfr=1, Product=2, SerialNumber=0 usb 1-1.2: Product: USB Audio CODEC usb 1-1.2: Manufacturer: Burr-Brown from TI input: Burr-Brown from TI USB Audio CODEC as /devices/platform/bcm2708_usb/usb1/1-1/1-1.2/1-1.2:1.3/input/input0 hid-generic 0003:08BB:2902.0001: input,hidraw0: USB HID v1.00 Device [Burr-Brown from TI USB Audio CODEC ] on usb-bcm2708_usb-1.2/input3 ...
> lsmod ... snd_soc_bcm2708_i2s 5474 0 regmap_mmio 2806 1 snd_soc_bcm2708_i2s snd_rawmidi 21357 2 snd_usbmidi_lib,snd_seq_midi snd_soc_core 131356 1 snd_soc_bcm2708_i2s ...
Damit der MPD (siehe weiter unten!) die Soundkarte zur Audio-Ausgabe verwendet, ist in der Konfigurationsdatei /etc/mpd.conf der entsprechende Abschnitt für das Audio-Ausgabegerät anzupassen:
... audio_output { type "alsa" name "My ALSA Device" device "hw:1,0" # optional format "44100:16:2" # optional mixer_device "default" # optional mixer_control "PCM" # optional mixer_index "0" # optional ...
Einziges Problem, welches mir nach einiger Zeit aufgefallen ist, war ein extensives Zumüllen diverser Log-Dateien mit der Meldung "delay: estimated 0, actual 132". Abhilfe schaffte folgende Zeile in der Datei /etc/modeprobe.d/snd_usb_audio.conf:
options snd-usb-audio nrpacks=1
WLAN
...kommt später...
Software
Music Player Daemon (MPD)
Für das Abspielen meiner MP3-Dateien, welche auf einem Netwerklaufwerk liegen, der "Music Player Daemon" (MPD) zum Einsatz. Dabei handelt es sich um einen reinen Unix-Systemdienst ohne eigene Oberfläche, dafür aber über das Netzwerk erreichbar ist. Damit ist die Bedienoberfläche austauschbar und kann auch remote über das Netzwerk erfolgen.
MPD kann MP3-, Ogg Vorbis-, FLAC-, AAC-, Mod- oder WAV-Dateien verarbeiten. Als Ausgabemedium wird die Soundkarte des Servers verwendet. Die Musikdateien können beliebig auf dem Rechner oder im Netzwerk (via SMB, NFS, sshfs etc. ins Filesystem des Servers eingebunden) liegen. MPD verwaltet die Verweise dorthin intern in einer eigenen Datenbank. Etwas gewöhnungsbedürftig ist, dass die Audiodateien nicht direkt abgespielt werden können, sondern erst die Verweise dorthin in eine "Queue" aufgenommen werden müssen. Die Wiedergabe aus dieser "Queue" kann dann aber mit den verschiedensten Kommandos ("Start", "Stop", "Vor", "Zurück", "Zufall", "Wiederholung" etc.) komfortabel über die Netzwerkschnittstelle gesteuert werden. Weiterhin stellen die MPD-Schnittstellen einige Kommandos zur Verwaltung von vorbereiteten Abspiellisten im m3u-Format zur Verfügung.
Eine kleines Benutzerinterface
Zur Steuerung des MPD auf dem Raspberry gibt es eine Reihe von Clients für die verschiedensten Betriebssysteme. Hier eine kleine Auswahl für Linux:
- mpc: ein kleines Kommandozeilentool zur rudimentären Steuerung
- ncmpc, ncmpcpp: Curses-basierte MPD-Clients für die Textconsole
- gmpc: grafischer MPD-Client auf Basis GTK2
- ario: grafischer MPD-Client auf Basis GTK+
- Xfmpc: grafischer MPD-Client speziell angepasst für Xfce-Desktop
- Sonata: ein, in Python geschriebener, grafischer MPD-Client auf Basis GTK+
Weitere MPD-Clients für Linux, Android, MacOS, Windows etc. findet man z.B. in dieser Übersicht.
(Cool, gerade gesehen! Es gibt auch MCBetty für BettyTV-Fernbedienungen! Ich habe noch so ein Ding im Schrank zu liegen, dass sieht wohl nach einem kleinen Zusatzprojekt aus...:-))
Nun ist es aber so, dass man nicht immer einen Rechner, Smartphone oder Tablet im Wohnzimmer zur Verfügung hat bzw. hochfahren möchte. Aus diesem Grund kommt zur Steuerung des MPD das Touch-Display an meinem Raspberry ins Spiel. Ich habe eine minimalistische Bedienoberfläche implementiert, mit der die wichtigsten MPD-Funktionen angesteuert werden können:
- Auswahl von (vorkonfigurierten) Abspiellisten auf dem Server
- "Start", "Stop", "Vor" und "Zurück" innerhalb der aktiven Abspielliste
- Ein-/Ausschalten von Zufallswiedergabe und Endlosschleife
- Anzeige diverser Informationen (Künstler, Album, Titel, Abspielzeit) zum gerade abgespielten Musikstück
- zusätzlich habe ich noch eine kleine Anzeige der aktuellen Wetterdaten aus meiner Wetteraufzeichnung implementiert; die Daten liegen in einer SQLite-Datenbank auf einem Netzwerklaufwerk
Die sonst noch üblichen Funtionen zur Lautstärkeeinstellungen und zum Lautlos-Stellen habe ich in der Benutzeroberfläche nicht implementiert, da dies ja über meine Stereoanlage geregelt wird.
Die Abspiellisten (Playlists) kann man ebenfalls nicht mit meiner Bedienoberfläche zusammenstellen. Dies kann man, in einer ruhigen Minute, mit einem der oben erwähnten Clients am PC, Smartphone oder Tablet erledigen. Achso, wenn man sich eine oder mehrere Playlists mit URLs von Internetradio-Stationen aufbaut, kann man, eine Internetverbindung vorausgesetzt, über diesen "Umweg" auch Internetradio hören.
Bei der selbstgeschriebenen Benutzeroberfläche (GUI) handelt es sich um ein kleines C-Programm, welches das Framebuffer-Device des Raspberry ansteuert. Für die Ausgabe sind einige grundlegende Grafikfunktionen (Zeichnen von Punkten, Linien, Zeichen, Buttons etc.) implementiert worden. Zur Ansteuerung der Touch-Fläche wurde die tslib verwendet. Als Schnittstelle zum MPD wurde die libmpd eingebunden. Die Abfrage der SQLite-Datenbank (Wetterdaten) erfolgt unter Einbeziehung der, vom SQLite-Projekt zur Verfügung gestellten, API. Die Übersetzung der C-Quellen kann direkt auf dem Raspberry Pi erfolgen. Dazu sind die dev-Pakete der genannten Bibliotheken sowie der gcc und die entsprechenden bin-utils auf dem System zu installieren.
Der Start des GUI-Programmes kann auf verschiedenste Art und Weise erfolgen:
- wenn eine USB-Tastatur am Raspberry angeschlossen ist (was allerdings kontraproduktiv zum Gesamtkonzept wäre), ganz normal über die Kommandozeile
- remote z.B. über eine ssh-Verbindung; Stichwort screen, damit das Programm auch weiterläuft, wenn die Remote-Verbindung beendet wird
- automatischer Start des Programmes ohne Benutzeranmeldung über eine modifizierte /etc/inittab; Stichwort rungetty
Letzteres sieht dann ungefähr so in der /etc/inittab aus (das Programm rpi_gui in /usr/bin):
... 1:2345:respawn:/sbin/rungetty tty1 -u pi sudo rpi_gui 2:23:respawn:/sbin/getty 38400 tty2 3:23:respawn:/sbin/getty 38400 tty3 4:23:respawn:/sbin/getty 38400 tty4 5:23:respawn:/sbin/getty 38400 tty5 6:23:respawn:/sbin/getty 38400 tty6 ...
Tipp zur Erstellung von Screenshots von der Display-Ausgabe: Nachdem ich einige Zeit damit verschwendete, mit einem Fotoapparat halbwegs taugliche Bilder von der Display-Ausgabe anzufertigen (...und mir dies nicht gelungen ist), habe ich das kleine Kommandozeilentool fbcat gefunden, mit dem man den Inhalt des Framebuffers 1:1 auslesen und in einer ppm-Datei abspeichern kann.
Softwaredownload
- rpi_gui (Version 0.1)
- erste, sehr unaufgeräumte Version...
- Ansteuerung und Zeichnen im Framebuffer
- Ansteuerung Touchscreen (tslib)
- Steuerungs-GUI für MPD
- Ausgabe Wetterdaten