« =

Portable Musikbox

Musicbox

Es ist das Jahr 2018. Eine Party. Einer der Gäste hat einen Marshall Stanmore II Bluetooth dabei. Es spielt Musik via Bluetooth. Einen AUX-Eingang hat es auch. Der Klang ist überragend für diese kleine Kiste. Es sieht schick aus und der Preis geht in Ordnung. In mir wird der Wunsch geweckt, auch so ein Gerät haben zu wollen. Aber was ist mit lokaler Musik von USB Stick oder NAS? Airplay? Endgeräteunabhängiges Streaming über Spotify, Tidal und tausende von Internetradio Streams? Einem Akku für mehrere Stunden Musikgenuss unabhängig vom Stromnetz? Display zur Anzeige der wichtigsten Informationen? Hab ich schon einen Akku erwähnt? Fehlanzeige. Nichts.

Hmm. Also was tun? Die Ansprüche herunterschrauben und doch einen Stanmore II kaufen? Einen TonUINO nachbauen? Nach einem Gerät suchen, welches all diesen Ansprüchen gerecht wird? Oder am Ende doch ein Eigenbau?

Ein paar Tage später formten sich erste Ideen. Da gibt es doch diese kleinen Minicomputer, genannt Raspberry Pi, bei denen mir bisher kein weiterer sinnvoller Anwendungsfall einfiel, außer einem "Server" für Temperatursensoren. Ein Recherche ergab, dass es mittlerweile kleine Verstärker- und UPS-Aufsätze (sogenannte HATs) für den Raspberry gibt. Und Displays. Und Treiber. Und entsprechende Projekte. Sogar fertige Software, die ohne großen Installationsaufwand einsatzfähig ist. Die Entscheidung war gefallen. Es wird ein Eigenbau. Die Auswahl der Teile fiel nicht leicht. Heraus kam ein tragbares, viereinhalb Kilogramm schweres Gerät mit den Maßen 29,7cm (B) x 17,5cm (H) x 20cm (T), welches sämtliche meiner Anforderungen erfüllt und dabei knapp 18 Stunden bei Zimmerlautstärke vor sich hindudelt. Gerne auch mal lauter. Egal wann. Egal wo. Läuft.

Wieviele Stunden in den Aufbau geflossen sind, bevor die Musicbox soweit war, dass sie stabil einsatzfähig ist, kann ich nur noch erahnen. Stunden. Tage. Wochen. Monate... Aber jede einzelne Sekunde davon hat Spaß gemacht und ich bereue keine einzige davon.

Musicbox Musicbox Musicbox

Musicbox Musicbox

Was wird benötigt

Hardware

Um das Ganze zum Leben zu erwecken, benötigt es etwas Hardware:

Elektronik

  • Raspberry Pi 3B / energiesparender als der 3B+, was die Akku-Laufzeit verlängert
  • 2,8" LCD-TFT SPI Display mit ILI9341 Controller / bei mir ist die Version ohne Touch im Einsatz
  • HiFiBerry MiniAmp
  • zwei kleine Lautsprecher Chassis, zum Beispiel Visaton VS-FRS8 M
  • UPS HAT Geekworm/SupTronics X750 UPS HAT
  • Geekworm Metal Push Button for X735/X710/X725/X750
  • 4x 18650 Li-Ion Akku
  • Netzteil 5V mit mindestens 3A (15W) und Hohlstecker - für die X750 UPS
  • GPIO Header Erweiterung 3-fach
  • Drehencoder
  • Real Time Clock DS1307 (RTC)
  • microSD Karte ab 4GB für das Betriebssystem
  • USB Stick für lokale Musikdateien; die Größe hängt von der Musiksammlung ab
  • Adapter, um die Anschlüsse des Raspberry am Gehäuse nach außen zu führen (allesamt Stecker auf Buchse und wenn möglich mit abgewinkeltem Stecker):
    • Gleichstrom, 5,5 (außen) x 2,5mm (innen), 1m
    • USB 3, 30cm
    • RJ45 Ethernet, 50cm
    • HDMI, 50cm

Musicbox Musicbox Musicbox

Gehäuse

  • Holz / 18mm Bambus für den Korpus, 8mm MDF für Front- und Rückseite
  • Einschlagmuttern
  • Schrauben
  • Kunstleder Gürtel als Tragegriff
  • Bespannstoff für die Front

Software

Etwas Software:

Sonstiges

Zeit, Geduld und Kreativität.

Zusammenbau

Der Zusammenbau gestaltet sich recht einfach. Alle Teile werden über die GPIO Leiste bzw. die GPIO Erweiterung zusammengesteckt. Einige Drähte vom Display, der RTC, LED usw. direkt gesteckt. Grundlegende Löterfahrung ist von Vorteil, um Pin-Header und Leitungen zu verlöten.

GPIO Belegung

GPIO PIN wPi HAT
18 12 HifiBerry MiniAmp (sound interface) SPI1 CE0
19 35 HifiBerry MiniAmp (sound interface) SPI1 MISO
20 38 HifiBerry MiniAmp (sound interface) SPI1 MOSI
21 40 HifiBerry MiniAmp (sound interface) SPI1 SCLK
16 36 HifiBerry MiniAmp (Mute) SPI1 CE2
26 37 HifiBerry MiniAmp (Shutdown power stage) SPI5 CE1
27 13 Volumio Status LED / on if loaded and configured via GPIO Control Plugin
5 29 Rotary Encoder (A) CLK
6 31 Rotary Encoder (B) DT
13 33 Rotary Encoder (Switch) SW
3.3V 17 Rotary Encoder (+3.3V)
GND 25 Rotary Encoder (GND)
2 3 RTC (SDA)
3 5 RTC (SCL)
5V 4 RTC (5V)
GND 6 RTC (GND)
4 7 UPS X750 (power management)
17 11 UPS X750 (power management)
18 12 UPS X750 (power management - overlapping with HifiBerry MiniAmp: this wire has to be cut, otherwise the behaviour of the Musicbox will be getting weird)
5V 2,4 UPS X750 (5V power supply)
. 3,5 UPS X750 (I²C for UPS battery voltage and percentage reading)
GND 6 UPS X750 (GND)
3.3V 1 Display (3.3V) oder Pin17
GND 9 Display (GND)
11 23 Display (SCK => SCLK)
10 19 Display (MOSI) (can be connected by multiple devices)
9 21 Display (MISO) (can be connected by multiple devices)
8 24 Display (CS => CE0) (Chip Enable)
12 32 Display (LED Backlight) (original GPIO18 (PIN12))
24 18 Display (D/C TFT Data / Command)
25 22 Display (RST) (original GPIO23 (PIN16))

Installation und Einrichtung

Das Volumio-Image für den Raspberry Pi herunterladen und auf die microSD Karte übertragen. Wie das geschieht, steht im Volumio Quick Start Guide (PDF - Englisch).

Initiale Einrichtung

Siehe Schritt 5. Volumio configuration on the Web-UI im Quick Start Guide.

In Schritt drei der Konfiguration über die Web-UI ("Configure your DAC-Audio Output") wird das DAC Device ausgewählt. In meinem Fall der HiFiBerry MiniAmp mit folgenden Einstellungen, welche auch später über Einstellungen > Wiedergabe eingestellt werden können:

  • I2S DAC: on
  • DAC Model: HiFiBerry DAC

Nach der Auswahl des DAC muss der Raspberry einmal neu gestartet werden. Bevor nun jedoch der erste Titel gestartet wird, sollte einmal die Lautstärke, die auf 100% steht, reduziert und folgende Einstellungen vorgenommen werden:

Lautstärke einstellen

  1. Einstellungen > Wiedergabeoptionen > Lautstärke-Einstellungen > Art des Mischers: Software > Speichern
  2. Standard-Lautstärke: 20
  3. Lautstärke-Schritt pro Klick: 4 > Speichern

Datenschutzeinstellungen

Systemeinstellungen > Privacy settings > Allow UI Statistics Collection: ein- oder ausschalten

Plugins

Ein paar Plugins aus den aufgeführten Plugin-Kategorien werden installiert:

  • Music Services
    • Spotify - ermöglicht das Durchsuchen der Spotify Wiedergabelisten, Alben, Interpreten innerhalb der Volumio UI
    • Volumio Spotify Connect2 - ermöglicht das nahtlose Umschalten zwischen Geräten über "Wiedergabe auf" in den Spotify Apps und Web
  • Miscellanea
    • Amplifier Switch - schaltet den DAC/Amp ein (Play) oder aus (Pause, Stop)
    • AutoStart - startet die Wiedergabe des letzten wiedergegebenen Songs nach dem Start von Volumio
  • System Tools
    • GPIO Control
  • User Interface
    • Rotary Encoder II - für die Verwendung eines Drehencoders (z.B. zum Einstellen der Lautstärke, Start, Pause, Stopp, nächster/voriger Titel)

Plugins konfigurieren

Spotify

  • set Username & Password > Authorize

Volumio Spotify Connect2

  • Multi-User Device: off
  • Username, Password
  • Gapless, Autoplay etc.

Amplifier Switch

  • Ausgang: 16 (Mute GPIO des HiFiBerry MiniAmp)

AutoStart

  • On
  • 20.000 ms delay

GPIO Control

Ich habe eine kleine LED auf GPIO 27 installiert, um so etwas wie eine Betriebsanzeige zu ermöglichen. Das Plugin schaltet eine LED ein bei Volumio Start und aus wenn das Gerät ausgeschaltet wird.

  • System Startup Event: On
    • GPIO Pin: 27
    • GPIO State: On
  • System Shutdown Event: On
    • GPIO Pin: 27
    • GPIO State: Off

Rotary Encoder II

Drehgeber 1:

  • Perioden pro Schritt: 1/1
  • Anschluss A GPIO: 5
  • Anschluss B GPIO: 6
  • Drehfunktion: Lautstärke
  • Taster GPIO: 13
  • Entprell-Zeit (ms): 100
  • Taster Logikpegel low aktiv: off
  • Funktion Tastendruck: Pause an/aus
  • Funktion langer Tastendruck: Stop

Vorbereitungen

So weit, so gut. Die Musicbox ist jetzt grundlegend eingerichtet. Vergiss nicht, die Lautstärke nach der Auswahl des Amp einmal herunterzuregeln. Ansonsten gibt es Ärger mit den Nachbarn. Jetzt solltest du deinen ersten Track vom USB Stick (Musikbibliothek), NAS oder Spotify abspielen können - whatever you prefer. Hit the PLAY button.

Für die Einrichtung der Hardware braucht es noch ein paar Vorbereitungen. Lass uns noch ein paar nette Gimmicks hinzufügen, bevor es weiter zur Hardware und deren Software geht.

SSH aktivieren

Um die nächsten Schritte auszuführen, muss SSH aktiviert werden. Rufe dazu die Volumio Dev Console http://volumio.local/dev/ in deinem Browser auf und schalte SSH per "Enable" Button ein. Damit ist es möglich, dich via SSH per putty, kitty oder deinem bevorzugter SSH Client mit Volumio zu verbinden und Kommandos auf der Konsole auszuführen.

Schalte Live Log ein, wenn du erfahren möchtest, was Volumio gerade tut.

Userconfig

Logge dich nun mit SSH in Volumio ein. Kopiere die Beispiel userconfig.txt (siehe unten) nach /boot/userconfig.txt. Diese Datei ist schon out-of-the-box in der /boot/config.txt eingebunden und enthält ein paar persistente Tweaks und Konfigurationen, wie z.B.:

  • keine Bootverzögerung (boot delay)
  • SPI aktivieren (für Display)
  • I²C aktivieren (für UPS, RTC)
  • energiefressende LEDs ausschalten, die innerhalb des Gehäuses sowieso nicht gesehen werden können
  • Heruntertakten der CPU (Underclocking)

Beispiel einer `userconfig.txt`

# Add your custom config.txt options to this file,
# which will be preserved during updates
boot_delay=0
dtparam=spi=on # required by: TFT Display
dtparam=i2c_arm=on # required by X750 UPS
dtoverlay=i2c-rtc,ds1307 # required by: RTC clock
#dtoverlay=spi1-1cs

# Disable on-board LEDs to save power of around 30mA
## ACT LED.
dtparam=act_led_trigger=none
dtparam=act_led_activelow=off

# PWR LED.
dtparam=pwr_led_trigger=none
dtparam=pwr_led_activelow=off

# underclock 3B+ / power saving here is actually 
#force_turbo=0 # comment this out if something gets wrong
over_voltage=-2 # reduce cpu voltage by 2*0,25V
arm_freq=1200 # std=1400
arm_freq_min=400 # std=600
core_freq=350 # std=400
core_freq_min=200 # std=250

# dtoverlay=sdtweak,overclock_50=100
# avoid_warnings=2
# initial_turbo=30

Underclocking und Power consumption

Mehr Details zu Underclocking und Power consumption:

https://www.raspberrypi.org/documentation/configuration/config-txt/overclocking.md

https://magpi.raspberrypi.org/articles/how-to-overclock-raspberry-pi-4

https://www.foxplex.com/sites/raspberry-pi-over-und-underclocking/

https://learn.pi-supply.com/make/how-to-save-power-on-your-raspberry-pi/

APT Update / Upgrade

Kein APT Update oder Upgrade ausführen.

Viele Anleitungen weisen darauf hin, eine Update der Paketlisten und ein Upgrade der Pakete vorzunehmen:

> sudo apt-get update
> apt-get upgrade

Kann man so machen. Es ist jedoch bekannt, dass man sich bei einem dist-upgrade die Volumio Installation kaputt machen kann. Im speziellen ist das der MPD. Solltest du doch ein Upgrade vorgenommen haben und nichts geht mehr, schau in den Troubleshooting Abschnitt unter MPD kaputt.

Einrichten der Hardware

Display

SPI wurde bereits im Abschnitt Userconfig in der userconfig.txt aktiviert: dtparam=spi=on.

Ein Modul muss trotzdem noch hinzugefügt werden. Mit dem Editor die /etc/modules öffnen:

> sudo nano /etc/modules

und die folgende Zeile hinzufügen:

> spi-bcm2835

Mit CTRL-o speichern und mit CTRL+x den Editor verlassen.

Build Tools installieren:

> sudo apt-get install --reinstall make
> sudo apt-get install build-essential

Python Libraries installieren (Image (Pillow), SPI, RPi.GPIO):

> sudo apt-get install python-dev python-setuptools python-pip python-rpi.gpio
> sudo apt-get install libjpeg-dev zlib1g-dev libfreetype6-dev # necessary for Pillow
> /usr/bin/pip install pillow==6.2.2 spidev netifaces gpiozero --user

Pillow 6.2.2 is the latest version which supports Python 2.7.x

--------------------------------------------------------------------
PIL SETUP SUMMARY
--------------------------------------------------------------------
version      Pillow 6.2.2
platform     linux2 2.7.9 (default, Sep 26 2018, 05:58:52)
              [GCC 4.9.2]
--------------------------------------------------------------------
--- JPEG support available
*** OPENJPEG (JPEG2000) support not available
--- ZLIB (PNG/ZIP) support available
*** LIBIMAGEQUANT support not available
*** LIBTIFF support not available
--- FREETYPE2 support available
*** LITTLECMS2 support not available
*** WEBP support not available
*** WEBPMUX support not available
--------------------------------------------------------------------
To add a missing option, make sure you have the required
library and headers.
See https://pillow.readthedocs.io/en/latest/installation.html#building-from-source

To check the build, run the selftest.py script.

Installation des Displays

Das Volumio Display Plugin installieren. Das Installations-Script ist auf Github verfügbar. Kurz und knapp:

> git clone https://github.com/one-step-behind/volumio-tft-display-plugin
> cd volumio-tft-display-plugin
> volumio plugin install

USV/UPS

Die Geekworm/SupTronics X750 UPS ist mit mehreren X750-A2 (4-Zellen 18650 Li-Ion Batteriehalter) erweiterbar. Laut Beschreibung können so 12x 18650 eingesetzt werden, wovon 4 Stück auf dem X750 sitzen. Es sind also zwei dieser Erweiterungen an die UPS anschließbar. In Ermangelung an Verfügbarkeit der X750-A2 war es mir bisher nicht möglich (und auch nicht nötig), diese zu testen. Aber ausprobieren, welche Laufzeiten sich dadurch ergeben würde ich schon gerne.

Die X750 ist kaum noch zu bekommen. Als Ersatz könnte sich die Kombination aus [X728 v2.1](https://wiki.geekworm.com/X728) zusammen mit dem [X728-A2](https://wiki.geekworm.com/X728#X728-A2) (2-Zellen 18650 Batteriehalter) (beides vom gleichen Hersteller wie die X750) eignen. Der [X708-A1](https://wiki.geekworm.com/X708-A1) (8-Zellen 18650 Batteriehalter) tut es wahrscheinlich auch 😲 Getestet habe ich es noch nicht.

Da der GPIO18 vom X750 und dem HifiBerry MiniAmp verwendet wird, muss beim X750 ein Kabel durchtrennt werden. Ansonsten fährt die Musicbox kurz nach dem Starten wieder herunter. Dieser GPIO steuert beim X750 die Abschaltung der Spannungsversorgung zum Pi, wenn der Raspberry per shutdown statt Taster am X750 heruntergefahren wird.

Wieso, weshalb, warum und welches Kabel muss denn durchtrennt werden?

Installation der UPS

I²C wurde bereits im Abschnitt Userconfig in der userconfig.txt aktiviert: dtparam=i2c_arm=on.

Das Installations-Script ist auf Github verfügbar. Kurz und knapp:

> git clone https://github.com/one-step-behind/suptronics-x750-scripts
> cd suptronics-x750-scripts
> chmod +x install.sh
> ./install.sh

RTC

Aktuelle Zeitzone setzen:

> ln -sf /usr/share/zoneinfo/Europe/Berlin /etc/localtime

Installation der RTC

Die folgenden Einrichtungsschritte wurden von der Adafruit RTC Seite übernommen.

I²C wurde bereits im Abschnitt Userconfig in der userconfig.txt aktiviert: dtoverlay=i2c-rtc,ds1307.

Python SMBus und i2c-tools installieren (i2c-tools sind in Volumio v2.861 schon installiert):

> sudo apt-get install i2c-tools python-smbus

Überprüfen, ob die Hardware gefunden wurde:

> sudo i2cdetect -y 1

Wenn dort an Adresse 0x68 ein UU zu sehen ist, wurde die Hardware erfolgreich gefunden.

Die "fake hwclock" deaktivieren, welche sich sonst mit der realen hwclock ins Gehege kommt:

> sudo apt-get -y remove fake-hwclock
> sudo update-rc.d -f fake-hwclock remove
> sudo systemctl disable fake-hwclock

Jetzt kann das original 'hardware clock' Script gestartet werden. Dazu werden per sudo nano /lib/udev/hwclock-set die folgenden drei Zeilen auskommentiert:

#if [ -e /run/systemd/system ] ; then
# exit 0
#fi

Diese beiden Zeilen können auch gleich auskommentiert werden:

/sbin/hwclock --rtc=$dev --systz --badyear
/sbin/hwclock --rtc=$dev --systz

Jetzt kann die Zeit das erste Mal überprüft werden. Mit sudo hwclock -r wird die Zeit direkt von der RTC gelesen. Diese kann von der tatsächlichen Zeit abweichen. Nun wird der Pi mit einem Netzwerk per Ethernet-Kabel oder WiFi verbunden, um die korrekte Zeit aus dem Internet zu synchronisieren. Danach wird mit sudo hwclock -w die korrekte Zeit in die RTC geschrieben. Die RTC übernimmt ab jetzt das Vorhalten der Zeit, auch wenn der Pi nicht mit dem Internet verbunden ist. Mit einem weiteren sudo hwclock -r kann die Zeit in der RTC überprüft werden.

Das Setup muss in der Regel nur einmal durchgeführt werden.

Bluetooth

Bluetooth ist in Volumio eingebaut und wird in den Einstellungen eingeschaltet:

Einstellungen > Quellen > Funktionssteuerung > Bluetooth Input Playback: On

Troubleshooting

GPIO readall errors

`gpio readall` gibt eine Fehler aus: `*Oops - unable to determine board type... model: 13*`
> gpio -v
> # => 2.44
**Lösung:** WiringPi muss von der Version 2.44 auf 2.46 upgedated werden:
> cd /tmp
> wget https://unicorn.drogon.net/wiringpi-2.46-1.deb
> sudo dpkg -i wiringpi-2.46-1.deb

MPD kaputt

Volumio spielt nichts mehr

Den Status des Music Player Daemon (MPD) mit:

> systemctl status mpd -l

überprüfen. Sollte etwa folgendes ausgegeben werden: /usr/bin/mpd: error while loading shared libraries: libbcm_host.so: cannot open shared object file: No such file or directory ist die Ursache ein mit apt-get upgrade upgegradetes System. Don't do this! Dadurch macht man sich die Volumio Installation kaputt. Falls das Kind schon in den Brunnen gefallen ist, gibt es trotzdem eine Lösung.

**Lösung:** Die libbcm_host.so aus dem open-sourced Code für die *ARM side libraries* kompilieren:
> git clone https://github.com/raspberrypi/userland.git

build-essentials und cmake installieren, falls noch nicht geschehen:

> sudo apt-get install build-essential cmake

Jetzt die Libraries bauen, was ein paar Minuten dauert:

> cd userland/
> ./buildme

Wenn der Vorgang durch ist, wird die kompilierte libbcm_host.so nach /usr/lib kopiert:

> sudo cp ./build/lib/libbcm_host.so /usr/lib/libbcm_host.so

Anschließend den MPD neu starten:

> sudo service mpd restart

und überprüfen, ob alles wieder läuft:

> service mpd status
# Active: active (running)
# Started Music Player Daemon.

Projektstart: 01. August 2018 um 02:00

Letzte Änderung: 05. März 2026 um 01:00