RasPi-Internetradio
Vorgeschichte
Über viele Jahre war mein Desktop-PC auch die Multimedia-Zentrale, also
TV-, MP3- und Webstream-Player. Da er relativ viel Strom verbraucht und
Lärm macht, wollte ich immer mal einen herumliegenden, mittlerweile
veralteten Raspberry Pi B in ein Internetradio verwandeln.
Ich konnte mich aber nicht aufraffen, das Projekt zu Ende zu
bauen, solange Lounge FM auf DAB sendete. Die Musikfarbe dieses
Spartenradios gefiel mir halbwegs, es kam ohne Internet-Verbindung aus,
und dümmliche Jingles und Werbung wurden mit der "Halt-die-Klappe!"-Notwehrschaltung
weggedrückt. Da jedoch neben einigen anderen Kommerzsendern auch Lounge
FM im letzten Jahr die DAB-Ausstrahlung beendete, entstand
Handlungsdruck.
Ich bin übrigens mal gespannt, wie lange die
öffentlich-rechtlichen Sendeanstalten durchhalten werden, bis sie das
Scheitern von DAB eingestehen müssen. Die hängen der antiken Idee von
"Vollprogrammen" an und haben so die Chance vertan, DAB mit
Spartenprogrammen zum Erfolg zu führen. Währenddessen hat sich eine
ganze Generation junger Leute mit MP3-Playern und Webstreams bereits
ihr individuelles Spartenradio gebastelt.
Auch ich hole mir notgedrungen meine Lieblingsmusik meist beim
Webkanal "Easy Listening" des vergleichsweise kleinen niederländischen
öffentlich-rechtlichen Rundfunks "AVRO" ab. Der stellt mit seinem
Mini-Etat neben mehreren TV-und Radioprogrammen ein halbes Dutzend
werbefreie Internetradio-Musik-Spartenkanäle auf die Beine, während es
die deutschen Sendeanstalten wichtiger finden, jährlich 8 Mrd. Gebühren
für Seifenopern, überteuerte Sportrechte, Debilen-Shows und einen
opulenten Verwaltungs-Wasserkopf rauszuhauen (z.B. ging vor einigen
Jahren mal durch die Presse, daß die WDR-Intendantin mehr Gehalt bezog
als die Bundeskanzlerin).
Überblick
Es gibt im Web bereits zahllose Bauanleitungen für
Raspberry-Pi-Internetradios und -Multimediacenter, aber meines ist
etwas anders, und vielleicht lohnt sich daher die Beschreibung.
Da es direkt neben dem PC betrieben wird, hat es für den
autonomen Betrieb nur eine spartanische Bedienebene erhalten: drei
Tasten für Senderwechsel und Mute (bzw. das Herunterfahren) sowie drei
LEDs für die binäre Anzeige der Kanalnummer und des Shutdowns. Alle
anderen Aktionen, insbesondere das Editieren des Programmspeichers,
erfolgen vom PC aus. Hierzu könnte man den üblichen Weg per SSH (secure
Shell) über die Netzwerkbuchse oder WLAN gehen, ich fand es aber
"spannender", das mit einem PC-Terminalprogramm über die serielle
Schnittstelle des Raspberry Pi zu lösen.
Für die serielle Anbindung ist jedoch ein Pegelwandler von 3,3V-Pegel auf RS232-Pegel erforderlich.
Da der Raspberry Pi aus dem 12V-Netzteil meiner Fritzbox
mitgespeist wird, kam noch ein Schaltregler 12V / 5V hinzu. Der
Raspberry B zieht so bei 12V nur 200-300 mA, die das Steckernetzteil
der Fritzbox problemlos mit aufbringen kann.
Da ein Webradio mit dem Internet verbunden ist und sich die
korrekte Zeit per NTP holen kann, ist eine Hardwareuhr eigentlich nicht
erforderlich. In der Test-und Probierphase während der Einrichtung des
Webradios war sie aber trotzdem recht angenehm.
Mein kleines Webradio-Programm ist nicht wie üblich in Python
geschrieben, sondern ist ein Bash-Skript. Shellskripte sind ziemlich
kryptisch, weil die Konzepte aus der "Unix-Steinzeit" stammen, aber es
handelt sich ja nur um ein paar Zeilen....
Hardware
Die Hardware besteht im Vollausbau aus 4 Baugruppen: dem
Pegelwandler für die serielle Schnittstelle, einem Schaltregler mit LM
2675-5.0, der Bedienebene mit drei LEDs und drei Tastern und der
Hardwareuhr mit DS1307.
Die LEDs für die Bedienebene sollten 2mA-Typen sein; die
LED-Vorwiderstände sind recht hochohmig, da die Raspberry-IOs nur wenig
Strom liefern dürfen.
Der Festspannungs-Stepdown-Schaltregler mit LM 2675-5.0 kommt
mit wenigen externen Bauteilen aus, liefert bis zu 1 A und verträgt
einen weiten Eingangsspannungsbereich (bis 40V, die sollte aber auch
der Elko C2 aushalten). Als Induktivität habe ich die Bauform "PISM"
verwendet. Sie ist leider ein SMD-Bauteil, das man nur mit zwei kleinen
"U-Bügeln" aus Schaltdraht auf eine konventionelle Platine löten kann,
aber bei Reichelt gab es keine bedrahteten Induktivitäten mit der
erforderlichen Strombelastbarkeit.
Die Hardwareuhr und der Pegelwandler für die serielle Schnittstelle sind in einem separaten Beitrag beschrieben.
Der Aufbau erfolgt wie immer auf einer Streifenraster-Platine.
Um Drahtbrücken zu sparen und um aus der "Lochraster-unfreundlichen"
Randlage des 26-poligen Raspberry-Headers P1 das Beste zu machen, habe
ich die Lochrasterplatine nicht für das direkte Stecken auf den
Raspberry-Pfostensteckverbinder ausgelegt, sondern für den Umweg über
ein Y-Flachbandkabel. Es verbindet die ersten 10 Pins des
Raspberry-Steckverbinders mit einem 10-poligen Stecker, auf dem 5V,
3,3V, Masse, RxD,TxD und I²C-Bus liegen. Weitere 16 Pins liegen auf
einem 16-poligen Stecker, von diesen werden Masse und einige GPIOs
genutzt. Eigentlich hätte hier ebenfalls eine 10-polige Verbindung
gereicht, aber so sind die Stecker verwechselungssicher.
Die beiden Kontaktreihen der Wannenstecker liegen auf der
Streifenraster-Platine direkt nebeneinander, so daß man sie nicht nach
dem Löten unterbrechen kann. Man muß schon vor dem Löten die Leiterbahnen trennen, indem man sie mit einem Messerchen vorsichtig aufritzt.
Sollte jemand die Schaltung (oder Schaltungsteile) nachbauen und einen
neueren Raspberry verwenden: ein 26-poliger Flachbandstecker paßt
mechanisch nicht auf 40-polige Header, man muß einen 40-poligen
verwenden und ggf. nur 26 Anschlüsse durchschleifen. Wie üblich liegt
der rot gefärbte Leiter jeweils an Pin 1 der Stecker (Pin 1 ist mit
einer kleinen Pfeilspitze gekennzeichnet). Der rote Leiter des
breiteren Kabels liegt jedoch am 26-poligen Stecker an Pin11 (dem
niedrigstmöglichen).
Dank des Y-Kabels ist die Lochrasterplatine nur etwa so groß
wie der Raspberry. Die Bauteile sind so angeordnet, dass man die
Platine und einen Raspberry B "huckepack" übereinander anordnen und mit
zwei M3-Sechskantbolzen verbinden kann (die beiden
Befestigungsbohrungen des Raspberry B liegen über ungenutzten Teilen
der Lochrasterplatine). Die externen Anschlüsse liegen auf der gleichen
Schmalseite wie die USB-und Netzwerkbuchse des Raspberry. Da bei den
neueren Raspberries die (vier) Befestigungsbohrungen anders angeordnet
sind, müsste das Layout der Lochrasterplatine für sie etwas abgeändert
werden.
Beim Musteraufbau sitzen auch unter der Lochrasterplatine
kurze Bolzen und eine weitere (nicht kupferkaschierte) Pertinaxplatte,
damit die Lötseite der Lochrasterplatine geschützt ist. So ist ein
Gehäuse entbehrlich.
Software
Das Internetradio-Programm ist ein Shellskript, also mit einem
Batchfile aus der DOS-Zeit vergleichbar. Es nutzt das
Kommandozeilenprogramm mpg123 zum Abspielen der Musikstreams und
Ausgeben der Metadaten sowie das Paket "WiringPi" mit seinem
Kommandozeilentool "gpio" zur Abfrage der drei Tasten und Ansteuerung
der drei LEDs.
Im Shellskript "inetradio" sind als erstes die vier
Internetradios eingetragen. Danach folgt die (einzige) Funktion
"play_and_signal()", sie setzt die LEDs zur Anzeige des eingestellten
Internet-Musiksenders, beendet eine bereits laufende Instanz des
Players mpg123 und startet eine neue für den aktuell eingestellten
Internet-Sender. Der gerade gespielte Interpret und der Musiktitel
werden auf die Standardausgabe (also an das an die serielle
Schnittstelle angeschlossene Terminal) gesendet. Leider ist mpg123
recht geschwätzig, und ich habe es nicht hinbekommen, die Ausgabe so zu
filtern, dass nur Titel und Interpret übrigbleiben.
Der Hauptteil des Programms initiallisiert die Hardware-Ein-
und -Ausgänge und dreht den NF-Mixer auf. Danach läuft eine Schleife,
welche die Bedienungs-Taster abfragt. Die linke und die mittlere Taste
lösen den Senderwechsel aus, die rechte hat eine Doppelfunktion: ein
kurzer Druck schaltet das Radio für 20 Sekunden stumm (Notwehr gegen
Werbemüll), ein langer Druck ( > 1 Sekunde) fährt das Gerät geordnet
herunter. Zum Wiederhochfahren kann man die Betriebsspannung kurz
unterbrechen (eleganter ließe sich das mit Anschluß eines vierten
Tasters an die beiden Reset-Lötaugen des Raspberry Pi lösen; man darf
ihn aber nur zum Neustart des Geräts nutzen).
Die zwei linken LEDs zeigen die Sender-Nummer binär an
(0...3), die rechte LED leuchtet, sobald das Herunterfahren eingeleitet
ist.
Betriebssystem
Erläuterungen zur Konfiguration des Betriebssystems für "headless"-Betrieb sind ebenfalls im bereits genannten Beitrag enthalten:
Zusätzlich müssen noch die Pakete "mpg123" und "wiringpi" mit
"apt get install mpg123 wiringpi" nachinstalliert werden. Danach ist
das unten beigefügte Skript "inetradio" in das Home-Verzeichnis des
Users "pi" zu kopieren. Um es automatisch zu starten, fügt man an die
versteckte Datei ".profile" im gleichen Ordner die Zeile "./inetradio"
an.
Nun sollte man die serielle Schnittstelle mit einem PC
verbinden, dort ein Terminalprogramm starten (Parameter: 115200 bit/s,
8N1), den Raspberry Pi rebooten und schauen, ob im Terminalprogramm die
Systemmeldungen durchlaufen, die automatische Anmeldung erfolgt und das
Inet-Radio gestartet wird (wenn alles geklappt hat, erscheinen dort
erstmal allerlei überflüssige Meldungen und dann endlich der gespielte
Musiktitel).
Beenden läßt sich das Internetradio-Skript mit "Control-c"; man landet dann auf dem Kommandozeilenprompt.
Download des Skripts und einiger Konfigurationsdateien: 0116-raspi-inetradio.tgz
Wenn
man das Archiv im Wurzelverzeichnis "/" mit "tar -xzf
0116-raspi-inetradio.tgz" entpackt, landen sie an den richtigen
Stellen. Neben dem Webradio-Skript sind noch versteckte
Konfigurationsdateien für den Midnight Commander enthalten, die die
Bedienung per serieller Konsole verbessern, ausserdem unter /"etc" die
Dateien für die automatische Anmeldung auf der seriellen Konsole und
das Laden der Uhren-Kernelmodule.