Baumscheibenradio - Internetradio mit den Raspberry Pi Zero W


Auf dieser Seite geht es um ein Webradio, das ich unauffällig in eine Baumscheibe integriert habe.
Der schlechte Radioempfang des alten UKW-Radios gab Anlass sich mit einem Nachfolgegerät auseinanderzusetzen und die vielen im Web dokumentierten Raspberry Radio Projekte gaben mir genug Input um ein eigenes umzusetzen.
Wichtig war neben dem Empfang der Webstationen auch die Optik. Dazu kam die Idee, ein von außen nicht sichtbarem Radio zu bauen.
Schließlich war das Gehäuse klar:


Eine Baumscheibe sollte das Radio beherbergen.


Zur Geschichte:
Es begann mit dem schlechten Empfang des alten konventionellen Radios im Bad. Es sollte gegen ein modernes, antennen-unabhängiges Radio ausgetauscht werden. Nach der ersten Recherche war klar, dass es ein Internetradio werden sollte, da ausreichend WLAN verfügbar ist und es stationär im Bad genutzt wird.
Bei der Recherche bin ich darüber gestolpert, dass einige günstigere Varianten schnell nicht weiter supportet werden, und dadurch ihre Funktion verlieren. Daher war klar, dass es eine eigene Konstruktion werden würde.
Es begann die Suche nach Selbstbau-Varianten auf Basis eines Raspberry Pis. Die Idee war ursprünglich auch, das alte Radio weiter zu nutzen und die technischen Komponenten wieder zu verwerten. Das Batteriefach hätte ausreichend Platz für einen Pi 3 geboten. Der Vorteil eines Pi 3 wäre die bereits integrierte Soundkarte gewesen. Der Anspruch an besonders gute Soundqualität war nicht vorhanden, somit hätte der Pi 3 die Anforderungen an Sound und WLAN abgedeckt.
Leider ist der Pi 3 fast 3-mal so teuer wie der Pi Zero W, den es zum Zeitpunkt des Kaufs (12.2017) bei Sertronics für ca. 13€ gab. Der Vorteil des Pi Zero W sind die geringen Abmaße und das integrierte WLAN im Gegensatz zum reinen Pi Zero.
Im Vorfeld empfand ich lediglich als negativ, dass es keinen separaten Soundausgang am Pi Zero gibt, und daher das Soundsignal nur über Umwege abgegriffen werden kann. Dazu gibt es mehrere Möglichkeiten mit mehreren Vor- und Nachteilen. Man könnte den HDMI Ausgang anzapfen, der ein Soundsignal trägt. Man könnte eine USB Soundkarte anschließen oder, und das war am Ende die Lösung, man zapft die GPIO Schnittstelle an, da diese ebenfalls über eine Soundausgabe verfügt.

Die Wahl fiel auf den Zero W und ich entschied mich für den Versuch eine USB Soundkarte anzuschließen. Das günstigste Modell mit Prime Versand nach Deutschland war folgendes.



Proof of Concept:
Nach wochenlangem warten erhielt ich den Artikel und konnte die ersten Tests anstellen. Für die erstmalige Einrichtung bräuchte man zusätzlich einen USB Hub, da es nur einen freien USB Port am Pi Zero gibt. Ohne USB Hub kann man dann entweder nur Tastatur oder USB Soundkarte anstecken. Es sei denn, man hat eine über WLAN verbundene Smartphone Tastatur oder eine Bluetooth-fähige Tastatur, die angeschlossen werden kann.
Nachdem ich noch einen USB Hub parat hatte für ein weiteres Projekt, dass bereits in der Pipeline wartet (Pi im Sega Mega Drive USB Hub), konnte ich mit den ersten Tests der Hard- und Software beginnen. Die USB Soundkarte wurde an den Pi angeschlossen und mit einem Raspbian Image und grafischer Oberfläche getestet. Leider bekam ich immer nur für einige Sekunden einen Ton aus der Karte und dann verschwand der Ton wieder. Da die Karte dasselbe Fehlerbild auch an einem PC zeigte, legte ich diese als defekt beiseite. Da der Versand 8 Wochen dauerte musste also eine neue Lösung her. Durch ein parallellaufendes Projekt hatte ich noch einen PAM8403 Verstärker und eine Anleitung für jeweils Hoch- und Tiefpassfilter, sodass ich die PWM-Modulation der GPIO Schnittstelle nutzen konnte. Der Kollege von othermod.com hat dazu eine tolle Anleitung erstellt, die einfach nachzuahmen ist. Kurzerhand wurde also die Schaltung gelötet und getestet. Der Sound dieses Verstärkers hatte mich nicht so richtig überzeugt, daher bin ich auf folgenden umgestiegen. Ob es nun an meinen Löt-Qualitäten lag oder der Verstärker tatsächlich besser ist kann ich nicht sagen. Mit dem Ergebnis bin ich jedoch zufrieden.
Als Lautsprecher kommen zwei ausrangierte Wohnzimmer Boxen zum Einsatz. Diese wurden aus ihrem Gehäuse entfernt und dann in eine Pressspanplatte eingelassen.


Die Software:
Internetradios wie dieses gibt es bereits wie Sand am Meer. In unterschiedlichen Konfigurationen mit Tasten oder Display. Auch bei der Software gibt es große Auswahl. Je nach Anspruch kann man eher zur multifunktionalen Musikbox gehen oder die Funktionen sehr einfach halten. Ich habe mich nach einigen Tests und der Entscheidung ohne Display zu bleiben für die MPC/MPD Lösung entschieden. Je nachdem was die nächsten Jahre bringen kann es dann immer noch eine neue Lösung geben, die dann auch Amazon Music oder Spotify connect bieten kann. Für den aktuellen Gebrauch reicht allerdings der MPC völlig aus.
Dazu gibt es zwei Teile der Software. Zunächst wird das Betriebssystem auf einer SD-Karte installiert. Da es nur wenige Aufgaben übernehmen wird und im Prinzip nur über das WLAN aus dem Internet ein Radiosender empfängt und dann abspielt. Es wird kein Display haben, also headless arbeiten.
Dazu wird die aktuelle Raspbian Version installiert (Stretch lite) und auf den neuesten Stand gebracht.

sudo apt-get update
sudo apt-get upgrade

Die Python-Datenbank wird auf den neuesten Stand gebracht:

sudo apt-get install python3

sudo apt-get install python-setuptools

sudo apt-get install python-dev

Da wir später die Tasten über das Python-Script ansteuern werden und diese Tasten an die GPIO-Schnittstelle angeschlossen werden, müssen wir die Python-GPIO Steuerung installieren.

sudo apt-get install python-rpi.gpio

Zur Vorbereitung der Soundausgabe:

sudo apt-get install alsa-utils

sudo modprobe snd_bcm2835

Dann installieren wir den MPC/MPD Player:

sudo apt-get install mpd mpc

Dann muss man natürlich eine Playlist haben, die gefüllt mit URL´s der Radiosender ist (Wie man Radiosender URL´s bekommt wird hier erklärt. Leider gibt es einige eigenwillige Web-Stationen, die ihre URL nicht so einfach offenlegen.):
sudo nano /var/lib/mpd/playlists/radiosender.m3u



Die Playlist muss dann noch die Rechte bekommen:

chmod 644 /var/lib/mpd/playlists/radiosender.m3u

Damit der zweite Software teil, der gleich folgt, beim Start des Radios automatisch gestartet wird muss folgendes am Ende der Startdatei eingetragen werden:
Zwischen:

fi und: exit 0

sudo python /home/pi/radio.py

Das ermöglicht den Start des Radio-Scripts beim Hochfahren des Radios.


Zum Abschluss der Vorbereitungen müssen nun noch einige Einstellungen in der Config-Datei umgesetzt werden:

sudo nano /boot/config.txt

# Sound ueber GPIO PWM
dtoverlay=pwm-2chan,pin=18,func=2,pin2=13,func2=4
gpu_mem=16

Diese Settings stellen die später angeschlossenen Anschlüsse der GPIO Leiste auf die PWM-Modulation ein. Hier ist GPIO 18 und 13 jeweils ein Audio-Ausgang. Die zweite Zeile stellt den Grafikspeicher auf 16MB herunter, da es eine headless Lösung ist, brauchen wir keine Rechenpower für den nicht vorhandenen Display.
Nun fehlt aber der entscheidende Teil, das eigentliche Script:
Ich habe auch hier wieder ein vorhandenes Script als Basis genommen und dann auf meine Situation umgebaut:

sudo nano /home/pi/radio.py

Darin ist folgendes Script hinterlegt:

#!/usr/bin/python
#
# Script for Raspberry Pi Internet Radio
#
# Author: Kyle Prier
# Site: http://wwww.youtube.com/meistervision
#
# LCD author : Matt Hawkins
# Site   : http://www.raspberrypi-spy.co.uk/
#
# Date   : 10/01/2012

import RPi.GPIO as GPIO
import time
import os


GPIO.setmode(GPIO.BCM)
GPIO.setup(26, GPIO.IN) # Vorwaerts Button
GPIO.setup(21, GPIO.IN) # Hauptsender
GPIO.setup(16, GPIO.IN) # Lautstaerke hoch
GPIO.setup(20, GPIO.IN) #Lautstaerke runter
GPIO.setup(19, GPIO.IN) #Ausschalter
os.system("mpc clear")
os.system("mpc load radiosender")
os.system("mpc volume 80")
os.system("mpc play 1")
#os.system('mpc current')

while 1:
            if GPIO.input(26) == True:
                        os.system("mpc next")
                        time.sleep(0.1)
                        os.system("mpc play")
                        #os.system('mpc current')
                        print 'Naechste Station'
            if GPIO.input(21) == True:
                        #os.system("mpc play 1")
                        time.sleep(0.1)
                        os.system("mpc play 1")
                        os.system("mpc volume 80")
                        #os.system('mpc current')
                        print 'Hauptsender'
            if GPIO.input(16) == True:
                        os.system("mpc volume +1")
                        os.system("mpc volume")
                        time.sleep(0.1)
            if GPIO.input(20) == True:
                        os.system("mpc volume -1")
                        os.system("mpc volume")
                        time.sleep(0.1)
            if GPIO.input(19) == True:
                        os.system("mpc stop")
                        os.system("mpc clear")
                        os.system("sudo shutdown -h now")
                       
            time.sleep(.2)

Das Script startet zunächst mit einigen Einstellungen. Es lägt fest, wie die Nummerierung der GPIO Pins gezählt wird. Danach werden die GPIO Pins festgelegt, die für die Tasten belegt werden. Im Anschluss wird eine Abfolge von Befehlen festgelegt, die dafür sorgt, dass bei jedem Hochfahren der richtige Sender und die richtige Lautstärke eingestellt sind. Danach beginnt die Schleife, die auf die Tastenbetätigung reagiert.
Nicht vergessen, der automatische Login beim Start sollte eingestellt sein, damit der Bootvorgang nicht an der Stelle stockt, sondern bis zum abspielen der Musik weiter läuft.

Die Hardware:




Wie eingangs erwähnt wird ein Hoch- und Tiefpassfilter zusammengelötet und mit dem PAM8403 Verstärker verbunden. Die Ausgänge werden direkt mit den Lautsprechern verbunden.


Da Headless, sollte per Tasten eine gewünschte Funktion ausgeführt werden. Die Taster sollten per GPIO angesteuert werden. Damit das Tastensignal ordentlich interpretiert werden kann, musste pro Taster eine Schaltung mit Widerständen realisiert werden, um ein definiertes Signal abgeben zu können. dazu mehr im Teil Software. Die GPIO müssen zunächst per Script in einen definierten Zustand versetzt werden, von dem dann durch Betätigung des Tasters eine definierte Zustandsänderung erfolgt. Gleichzeitig sollte natürlich verhindert werden, dass das Programm den einmaligen Druck als Dauerdruck erkennt.
Um in der Hardware die Definition zu erreichen wird eine sogenannter Pull-Up oder Pull-Down Schaltung eingesetzt. Der Zusammenhang wird hier ganz gut erklärt.
Mit den verkabelten Tasten sieht die Schaltung dann so aus:


Das Herzstück: Baumscheibe als Gehäuse



Das Gehäuse war dann schon deutlich schwieriger in der Umsetzung. Zunächst sollte das alte Radio weiter genutzt werden können, oder zumindest das Gehäuse. Da der Softtouch Lack allerdings bereits klebrig wurde war das Gehäuse auch nicht mehr wirklich schön.



Eine neue Idee lieferte eine Baumscheibe, die dazu inspirierte, ein Radio unsichtbar zu verbauen. Die Technik sollte im Innern liegen und für den Betrachter unsichtbar sein. Da die Lautsprecher einen Schallaustritt benötigen sollte dieser nur zur in Wand Richtung gedrehten Seite sichtbar sein.



Die gewählte Baumscheibe war ca. 11 bis 12cm dick, so dass genügend Tiefe für die Technik vorhanden war. Um diese dann in der Scheibe unterzubringen musste die Baumscheibe nun also entkernt werden, was eine sehr große Herausforderung darstellte. Ziel war ja, dass die Baumscheibe einseitig ausgehöhlt wird und auf der anderen Seite unberührt bleibt. Die Strategie war, zunächst mit kleinen Bohrern vor zu bohren und dann durch größere Bohrer nach zu bohren, ohne die Baumscheibe durch zu bohren. Die Kraft beim Bohren musste also wohl dosiert werden. Nachdem die Löcher gebohrt waren wurde klar, dass das nur die eine Seite der Medaille war. Die ganzen übrig gebliebenen Stege mussten auch noch entfernt werden. Die Stege standen nach wie vor sehr stabil.



Der nächste Schritt war dann, die Stege mit der Stichsäge von einander zu trennen. Dadurch waren die Stege zwar vereinzelt und nicht mehr ganz so stabil aber immerhin steif genug, dass es noch immer viel Kraft benötigte um sie zu entfernen. Das Entfernen passierte zunächst durch Herausbrechen mit Hilfe einer Zange.



 An jenem Abend war das ganze Prozedere dann zu viel. Denn neben dem Herausbrechen musste auch noch der letzte Rest aus der Baumscheibe entfernt werden, der nach dem Herausbrechen stehen blieb. Da die übrigen Stege nicht an der Wurzel abbrachen, bis zu der der Bohrer in das Holz eindrang, blieb immer ein Rest von ca. 2cm übrig.


Dazu benötigte ich dann einen Forstnerbohrer, der mit 35mm Durchmesser alles planarisierte. Das funktionierte auch ganz gut. Nur für meine Hand funktionierte es nicht gut. Im Anschluss hatte ich erst einmal eine Sehnen Entzündung.

Nachdem die Baumscheibe hohl war, musste nun noch die Rückseite angepasst werden. So wurden die zwei Löcher für die Lautsprecher in die Pressplatte geschnitten und auch die Durchbrüche für die Tasten.



Nach der Montage der Lautsprecher und Kabel sowie Raspberry und Verstärker sieht das Ergebnis nach einigen Tests folgendermaßen aus:




Von der Vorderseite ist nur die Baumscheibe zu sehen, von der Technik kann man lediglich das Kabel am Rande erkennen. Dreht man es herum, sieht man die beiden Lautsprecher und die Tasten, die bewusst mit einigem Abstand platziert wurden.

Es gibt folgende Tasten mit Funktion. Da das Radio beim Einschalten nach dem Bootvorgang sofort den eingestellten Hauptsender in voreingestellter Lautstärke abspielt, gibt es zunächst keinen Bedarf etwas zu verändern. Sollte man den Sender ändern wollen, kann man über die Taste „Weiter“ einen Sender in der Playlist weiter schalten. Daneben liegt die „Reset“-Taste, die wieder auf den Hauptsender und reguläre Lautstärke stellt. Daneben gibt es noch „Lauter“ und „Leiser“ sowie einen „Aus“ Schalter. Einschalten erfolgt durch das Einstecken des Netzteils.


Keine Kommentare:

Baumscheibenradio - Internetradio mit den Raspberry Pi Zero W

Ein neues Projekt ist gerade fertig dokumentiert worden. Das Baumscheiben-Radio :