RasPi-Internetradio        

von Ralf Beesner                  
Elektronik-Labor   Projekte   RaspberryPi 

 

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.






Elektronik-Labor   Projekte   RaspberryPi