Bau meiner Phoniebox

Auf dieser Seite möchte ich den Bau meiner Phoniebox dokumentieren. Die Phoniebox ist ein Open Source Projekt (http://phoniebox.de/), das im Wesentlichen die Funktionalität der original Toniebox nachbaut. Also: eine mit RFID Chips steuerbare Jukebox auf Basis eines Raspberry Pi für Kinder (die Phoniebox kann aber natürlich auch von Papa genutzt werden indem z.B. einer RFID Karte ein Rockradio Webstream oder eine Playlist bei Spotify zugewiesen wird). Ich habe eine erste Box für meinen Sohn und zwei weitere für meine Neffen gebaut. Dabei habe ich die Boxen immer weiter verbessert und schlussendlich sogar einen eigenen PCB dafür designed. Aber gleich mehr dazu….

Grundsätzlich muss zunächst eine „Box“ gebaut werden, also ein Gehäuse mit allerhand Hardware. Dies wird im ersten Schritt beschrieben. Danach benötigen wir die entsprechende Software. Bei mir kommt die großartige RPi-Jukebox zum Einsatz.

Verwendete Teile

Hardware

HardwareKomponente
KisteBox vom Bauhaus
Front- und RückplatteAlu Dibond
Maßanfertigung
RechnerRaspberry Pi 3+ oder 4
VerstärkerHifiBerry MiniAmp
PlatineCustom PCB
Lautsprecher2x Visaton FRS 5 Breitband 5”
DisplayAZDelivery OLED
Ein AusschalterOnOffShim
RFID LeserNeuftech
StromversorgungPowerbank
ButtonsArcade Buttons mit Mikroschalter LED
Widerstände und
Kondensatoren
Kondensatoren
Widerstände:
100 Ohm | 220 Ohm1K Ohm | 10K Ohm
Buchsen und Litzen Dupont 24Pin Buchse
Dupont 2Pin Buchse
Litzen
Abstandshalter für den HatDistanzhülsen
Langer 40poliger Pi HeaderPi Header
Stiftleiste für Buttons und Display
(2×12 gewinkelt)
Stifleiste gewinkelt 2,54mm
Stifleiste für Power LED und Power Button
(je 2×1 gewinkelt)
Stiftleiste
Stiftleiste für OnOffShim (2×6 gerade)Stifleiste gerade

Die Kiste

Zunächst aber zur Auswahl der Hardware. Nachdem ich mich bei der ersten Box noch für die in vielen Blogs empfohlene Kesper Kiste von Obi entschieden hatte, wollte ich für die Version 2 ein hochwertigeres Aussehen ohne Lackieren. Schlussendlich ist es eine Kiste vom Bauhaus geworden.

Front- und Rückplatte

Ich wollte eine farbige Front bei gleichzeitiger Stabilität und Kratzfestigkeit. Nach langem Suchen habe ich schließlich folgende Alu Dibond Platten bestellt. Die genau Abmessung für die Kiste vom Bauhaus sind 28x18cm für Front- und Rückplatte.

Das Bearbeiten der Platte ging erstaunlich gut, mit einem Lochbohrer wurden die 25mm Löcher für die Buttons und die 50mm Löcher für die Lautsprecher gebohrt. Nur das Ausschneiden des Displays war nicht so erfolgreich und das ist zugegebenermaßen auch der Schwachpunkt meiner gebauten Box. Mal sehen wie ich das in einer Version 3 verbessern kann (auf jeden Fall mit besserem Werkzeug: ich habe gebohrt, dann mit der Stichsäge bearbeitet und abschließend gefeilt).

Das fertige Ergebnis der Alu Frontplatte und der Holzbox war dann folgendes:

Einbau der Komponenten in die Box

Es gab folgendes zu tun:

  • Das Display wurde mit Heißkleber eingeklebt
  • Die Powerbox wurde ebenfalls mit Heißkleber befestigt und unten durch ein Holzstück (an dem dann auch die Rückseite verschraubt wird) eingeklemmt
  • Die Lautsprecher wurden … natürlich verklebt
  • Die Griffe haben die perfekte Maße für die Befestigung der Buttons. Ich habe dann lediglich eine Abdeckung gebaut.
  • Die 4 Abstandshalter für die RaspberryPi Aufnahme wurden von unten verschraubt
  • Für die Rückplatte habe ich drei Holzleisten von unten bzw. oben verschraubt um dann dort wiederum die Platte zu verschrauben.

Ansteuerung der LEDs und Buttons

In der ersten Version meiner Phoniebox habe ich (wie in den meisten anderen Anleitungen zum Bau einer Box) auf ein externes Breakout Board die einzelnen Widerstände und Pins gelötet und diese dann einzeln mit den GPIO PINs des RaspberryPi verkabelt. Insgesamt fand ich die Lösung total unübersichtlich und nicht besonders zuverlässig (die Stecker der Einzelpins haben sich immer wieder gelöst). Hier ein Bild dazu:

Kabelsalat in Version 1

Phoniebox Hat – custom PCB

Hier als Abkürzung direkt der Link zum KiCad Projekt auf Github: https://github.com/amueller-tech/phonieboxHat

Für die Version 2 schwebte mir vor einen PCB zu designen der einfach auf den RaspberryPi als „Hat“ aufgesteckt wird und an den dann alle Hardwarekomponenten (Buttons, LEDs, Display etc.) angeschlossen werden.
Da ich für die Soundausgabe auf einen HifiBerry MiniAmp setze, sollte dieser dann gleich noch mit aufgesteckt werden können. Die konkreten Anforderungen an den PCB waren:

  • Kompatibler Hat für den RaspberryPi 3+4 zum Aufstecken
  • Befestigung eines weiteren HATs am PCB (für den HifiBerry)
  • Anschluss für 5 Buttons inklusive LEDs
    (Vol+, Vol-, Previous, Play/Pause, Next)
  • Anschluss für die PowerLed
  • Anschluss für ein IC2 (4Pin) Display
  • Anschluss für einen OnOffShim zum Ein/Ausschalten des Pis

Ich machte mich also daran in KiCad einen Schaltplan zu entwerfen und schickte die Bestellung nach China. Ungefähr 2 Wochen später bekam ich folgende Platine:

UPDATE 13.06.2020: Neue Platine 0.3 verfügbar die nun auch den OnOffShim integriert.
Alles andere bleibt im Prinzip gleich.

Sofort machte ich mich an den Aufbau. Für die Widerstände und die Kondensatoren (zum Abfangen von möglichen Spannungsschwankungen) entschied ich mich für kompakte SMD 1206 Bauteile, die aber noch gut mit der Hand zu löten sind. Für die Stecker kommen 4 polige übereinander angeordnete Exemplare zum Einsatz (bei v0.3 eine 2×12 polige Buchse). Um die PINs des Raspberry Pis auch an einen weiteren Hat weiterzuleiten benötigt man extra lange PIN header die dann durchgesteckt werden. Man verlötet sie auf der Oberseite des Hats und hat dann noch genügend Länge um einen weiteren aufzustecken. Wichtig ist natürlich, dass GPIOs nicht doppelt belegt werden dürfen, man kann also nicht einen beliebigen HAT aufstecken, die beiden müssen aufeinander abgestimmt sein.

Das fertige Ergebnis kann sich glaube ich sehen lassen. Der Hat passt perfekt auf den RaspberryPi, der HifiBerry kann einfach mit aufgesteckt werden und durch die Steckerlösung lassen sich alle Komponenten der Phoniebox einfach an- und ausstecken. Das ganze trägt natürlich auch super zur Ordnung im Inneren bei und gleichzeitig ist alles richtig befestigt und ich habe keine Angst mehr, dass sich ein Pin löst wenn die Kids die Box doch einmal etwas unsanfter abstellen.

Verkabelung und fertiges Ergebnis

Eigentlich felt nur noch die Verkabelung der Komponenten sowie die Rückseite der Box. Hier ein paar Impressionen wie ich das gelöst habe:

Software

Als Software kommt wie gesagt die großartige RPi-Jukebox zum Einsatz. Nach der Installation müssen basierend auf meine PCB Design die GPIOs angepasst werden. Hier eine Übersicht der Belegung direkt aus KiCAD heraus:

Die GPIOs für den HifiBerry MiniAMP sind fix (16, 18, 19, 20, 21, 26) und können nicht von den Buttons und LEDs belegt werden. Die restlichen GPIOs habe ich so gewählt, dass sie für die Leiterführung auf dem PCB am besten passen. Im Folgenden nun die einzelnen Installationsschritte mit der jeweiligen Anpassung der GPIOs

Raspberry Image mit HifiBerry

Mittels dem Tools Etcher wird das aktuellste Raspbian Image Buster Lite geflashed:

Etcher: https://www.balena.io/etcher/
Raspbian: https://www.raspberrypi.org/downloads/raspbian/

Um direkt nach dem Flashen beim Starten mittels WLAN und SSH auf den PI zugreifen zu können, müssen 2 Dateien ins Boot Verzeichnis der SD kopiert werden.

Eine leere Datei Namens „ssh“ und eine Datei Namens wpa_supplicant.conf
die die Konfiguration des Netzwerkes enthält:

# Datei wpa_supplicant.conf 
ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev
update_config=1
country=DE

network={
       ssid="wlan-bezeichnung"
       psk="passwort"
       key_mgmt=WPA-PSK
}

Nach dem Einloggen mittels SSH wird die interne Soundkarte deaktiviert und der HifiBerry MiniAMP aktiviert:

#/boot/config.txt  
#Deactivate onboard Audio
#dtparam=audio=on

[all]
dtoverlay=hifiberry-dac

Danach muss die Default Soundkarte auf den HifiBerry gesetzt werden:

#/etc/asound.conf 
pcm.hifiberry {
          type softvol
          slave.pcm "plughw:0"
          control.name "Master"
          control.card 0
  }
 pcm.!default {
          type plug
          slave.pcm "hifiberry"
  }

Installation der Jukebox Software

Nun kann die eigentliche Jukebox Software installiert werden:

cd; rm buster-install-*; wget https://raw.githubusercontent.com/MiczFlor/RPi-Jukebox-RFID/master/scripts/installscripts/buster-install-default.sh; chmod +x buster-install-default.sh; ./buster-install-default.sh

Die Fragen in der Installationsroutine sind selbsterklärend (bzw. die Standardoptionen sind ok), nur beim Soundinterface muss man „Master“ als iFace angeben.

Danach müssen die GPIOs in /home/pi/.config/phoniebox/gpio_settings.ini wie folgt geändert werden: Danach dann in RPi-Jukebox-RFID/components/gpio_control sudo install.sh ausführen

[DEFAULT]
enabled: True
[VolumeControl]
enabled: False
Type: TwoButtonControl ;or RotaryEncoder
PinUp: 5
PinDown: 6
pull_up: True
hold_time: 0.3
hold_repeat: True
timeBase: 0.1 ;only for RotaryEncoder
functionCallDown: functionCallVolD
functionCallUp: functionCallVolU
functionCallTwoButtons: functionCallVol0 ;only for TwoButtonControl

[PrevNextControl]
enabled: False
Type: TwoButtonControl
Pin1: 22
Pin2: 23
functionCall1: functionCallPlayerPrev
functionCall2: functionCallPlayerNext
functionCallTwoButtons: None
pull_up: True
hold_time: 0.3
hold_repeat: False

[PlayPause]
enabled: True
Type: Button
Pin: 8
pull_up: True
hold_time: 0.3
functionCall: functionCallPlayerPause

[Shutdown]
enabled: False
Type:  Button
Pin: 3
pull_up: True
hold_time: 2
functionCall: functionCallShutdown

[Volume0]
enabled: False
Type:  Button
Pin: 17
pull_up: True
hold_time: 0.3
functionCall: functionCallVol0

[VolumeUp]
enabled: True
Type:  Button
Pin: 23
pull_up: True
hold_time: 0.3
hold_repeat: True
functionCall: functionCallVolU

[VolumeDown]
enabled: True
Type:  Button
Pin: 27
pull_up: True
hold_time: 0.3
hold_repeat: True
functionCall: functionCallVolD

[NextSong]
enabled: True
Type:  Button
Pin: 6
pull_up: True
hold_time: 0.3
functionCall: functionCallPlayerNext

[PrevSong]
enabled: True
Type:  Button
Pin: 10
pull_up: True
hold_time: 0.3
functionCall: functionCallPlayerPrev

[Halt]
enabled: False
Type:  Button
Pin: 21
pull_up: True
hold_time: 0.3
functionCall: functionCallPlayerPauseForce

Installation des Displays

Zunächst muss der IC2 Interface aktiviert werden:

#raspi-config auf der Kommandozeile ausführen, dann 
-> Interfacing Options -> enable ic2 service

Danach kann die Software wie folgt installiert werden:
(Mehr Details gibt es beim Autor auf dessen super Seite zur Dokumentation seiner Phoniebox: http://splittscheid.de/selfmade-phoniebox/).
Am Schluss die „Option 3 skip“ wählen, wir haben das GPIO File ja schon angepasst.

cd; rm o4p_installer.sh; wget https://raw.githubusercontent.com/splitti/oled_phoniebox/master/scripts/install/o4p_installer.sh; chmod +x o4p_installer.sh; ./o4p_installer.sh

Installation des LED Services

Ebenfalls vom Autor der Displaysteuerung übernommen wurde er LED Service der die LEDs der Buttons beim hochstarten blinken lässt. Installiert wird er wie folgt:

git clone https://github.com/splitti/phoniebox_led_control --branch master; sudo ln -s /home/pi/phoniebox_led_control/service/phoniebox_led_control.service /etc/systemd/phoniebox_led_control.service;sudo systemctl daemon-reload; sudo systemctl enable /etc/systemd/phoniebox_led_control.service; sudo service phoniebox_led_control  start

Dann folgende GPIOs anpassen:

#/home/pi/phoniebox_led_control/led.py
prev=25
play=5
next=12
volup=24
voldown=22

#/home/pi/phoniebox_led_control/gpiozero_led.py 
LED_PREV = PWMLED(25)
LED_PLAY = PWMLED(5)
LED_NEXT = PWMLED(12)
LED_VOLUP = PWMLED(24)
LED_VOLDOWN = PWMLED(22)

Dann den Service zum Autostart hinzufügen

sudo ln -s ~/phoniebox_led_control/service/phoniebox_led_control.service /etc/systemd/system/phoniebox_led_control.service
sudo systemctl daemon-reload 
sudo systemctl enable /etc/systemd/system/phoniebox_led_control.service
sudo service phoniebox_led_control start

Installation des OnOff Shim

curl https://get.pimoroni.com/onoffshim | bash

#/etc/cleanshutdown PINS are GPIO Numbers
trigger_pin=17
led_pin=13
poweroff_pin=4
hold_time=2
shutdown_delay=0
polling_rate=1