Pi Zero radio aanvulling 3

Door synoniem op donderdag 23 juli 2020 22:30 - Reacties (6)
Categorie: Raspberry Pi, Views: 2.699

Hoewel op een lager pitje afgelopen tijd, blijf ik nog wel verbeteringen aan mijn Pi Zero radio doorvoeren.
Behalve de "gewone" bugs die ik tegen kom in het gebruik is Python 2 inmiddels end of life. Reden genoeg om pydPiper te promoveren naar Python 3.

Voor een deel kun je dat geautomatiseerd doen met 2to3 maar dan blijft er nog genoeg handwerk over. Daarnaast heb je een andere Docker container nodig omdat de oorspronkelijke container van dhrone op Python 2 gebaseerd is. Ook dat vergde wat handwerk om uit te vinden welke versie van de bibliotheken je nodig hebt. De voorbeeld Dockerfiles van dhrone werkte niet zonder meer.

Uiteindelijk heb ik zelf een image gereleased: synoniem/pydpiper3:latest op hub.docker.com. Deze werkt in ieder geval voor pydPiper3 met het 16x2 LCD display dat ik gebruik. Overige displays zul je eventueel zelf moeten testen. De image is gebaseerd op arm32v6/python:3-alpine die in principe op alle Pi's zou moeten werken. Voor alle versies van de Pi vanaf 2 zou je ook arm32v7/python:3-alpine als basis kunnen nemen.

En uiteraard moet je Python3 versie van pydPiper gebruiken waarvoor ik een nieuwe repo aangemaakt heb op https://github.com/synoniem/pydPiper3.

Naar aanleiding van de discussie onder Pi Zero radio aanvulling 2 was het ook tijd om het pydpiper.service voor systemd eens aan te pakken. Dus ook hier is een nieuwe versie voor gekomen.

code:
1
2
3
4
5
6
7
8
9
10
11
[Unit]
Description = pydPiper
Requires = docker.service
After=volumio.service

[Service]
Restart = always
ExecStart = /usr/bin/docker run --rm --network=host --privileged --name pydpiper -v /var/log:/var/log:rw -v /home/volumio/pydPiper3:/app:rw synoniem/pydpiper3:latest python /app/pydPiper.py
ExecStop = /usr/bin/docker stop -t 2 synoniem/pydpiper3:latest
[Install]
WantedBy = multi-user.target

Zoals je kunt zien wordt bij het stoppen van de service de gebruikte container nu direct verwijderd. Uiteraard wordt de Python 3 code en image gebruikt voor het opstarten en krijgt de container de naam van pydpiper mee.

Allemaal geen grote schokkende verbeteringen maar vele kleintjes maken één grote. De volgende stip op de horizon is om Volumio zelf te containeriseren. De eerste pogingen in die richting stemmen nog niet hoopvol. Zo is op dit moment het alleen mogelijk om met een X86_64 onder Debian Jessie (versie 8!) een nieuwe image te bouwen. Er wordt wel gewerkt aan een versie voor de huidige Debian stable Buster (versie 10) maar zover is het nog niet.

Pi Zero radio aanvulling 2

Door synoniem op woensdag 10 juni 2020 21:08 - Reacties (5)
Categorie: Raspberry Pi, Views: 3.229

Bij de Pi Zero radio heb ik pydPiper in de Dockercontainer zo ingesteld staan dat als de container stopt gelijk een nieuwe gestart wordt. De Dockercontainer wordt automatisch als een service gestart door het pydpiper.service bestand in systemd op te nemen.

Vanuit het oogpunt van beheer heel gemakkelijk maar wat nu als er sporadisch een fout optreedt zeg 1 a 2 keer per dag? Dan zie je na een week ettelijke gestopte containers want er wordt wel een nieuwe gestart maar de oude wordt niet verwijderd.

Nu zat er in display.py zo'n sporadische fout:
code:
1
2
3
4
5
6
7
8
9
Uncaught exception
Traceback (most recent call last):
  File "/app/pydPiper.py", line 805, in <module>
    img = dc.next()
  File "/app/displays/display.py", line 1556, in next
    w = s.get()
  File "/app/displays/display.py", line 1257, in get
    widget, duration, conditional = self.widgets[self.currentwidget]
IndexError: list index out of range

Zoals de oorspronkelijke auteur in de documentatie aangeeft is het aansturen van het display vrij tijdkritisch. Dat is de waarschijnlijk de reden dat deze fout soms optreedt. En ik heb het opgelost door de exception te onderscheppen en vervolgens gewoon verder te laten lopen. Als iemand hier betere ideeën voor heeft en de code wil aanpassen, graag! Voor nu heb ik mijn nieuwe versie getest en op Github gezet.

Uiteraard wil je ook van de gestopte containers af want de Pi Zero is al geen snelheid- of geheugenmonster en deze ballast kan de boel alleen maar vertragen.

code:
1
2
3
4
$ sudo service pydpiper stop
$ sudo docker container prune
WARNING! This will remove all stopped containers.
Are you sure you want to continue? [y/N] y

Het verwijderen duurt behoorlijk lang maar uiteindelijk zie je de hashcodes van alle verwijderde containers verschijnen en kun je pydpiper service weer starten met
code:
1
sudo service pydpiper start

Pi Zero radio aanvulling 1

Door synoniem op donderdag 23 april 2020 19:00 - Reacties (2)
Categorie: Raspberry Pi, Views: 2.828

Mijn Pi Zero radio project werkt. Maar er zaten toch nog wat storende zaken in het gebruik van pydPiper voor de aansturing van het 16x2 LCD schermpje.

De aanwezige 0.31 alpha versie op github verbetert wel het configureren en aanmaken van het systemd.service en het pydPiper.cfg bestand met configure.py. Simpel gezegd je maakt het pydPiper.cfg bestand met alle parameters, je exporteert /home/volumio/pydPiper naar de docker container en het werkt.

Wat standaard niet werkt is de weersverwachting en de actuele buitentemperatuur. Zowel Accuweather als Weather Underground hebben kennelijk hun voorwaarden voor het gratis gebruik van hun API veranderd. De 24-uurs klok kun je wel kiezen maar wordt niet weergegeven. En de drie witte blokjes rechts onderin blijkt niet voor de temperatuur te zijn maar een mini progressbar voor het nummer dat speelt. Bij webradio is dat echter niet te meten en zijn de blokjes dus continue wit.

Kleine ergernissen maar genoeg om een eigen repo aan te maken op github (https://github.com/synoniem/pydPiper) en de nodige verbeteringen door te voeren.

Tot nu toe is dat ondersteuning van de Nederlandse weer API op WeerLive van het KNMI.

https://tweakers.net/i/lno8bI1tOYkDO1m5QQh7KJ_oXYc=/full-fit-in/4920x3264/filters:max_bytes(3145728):no_upscale():strip_icc():fill(white):strip_exif()/f/image/eLTfXmJiRqNQAF0p4HR3XWum.jpg?f=user_large


Ondersteuning van de 24 uurs klok

https://tweakers.net/i/2MzvqYMQpRTLb9S_33cbuKrR_Ik=/full-fit-in/4920x3264/filters:max_bytes(3145728):no_upscale():strip_icc():fill(white):strip_exif()/f/image/1N4uNHVGy3yltpOj9Cr94JWV.jpg?f=user_large


En het verwijderen van de progressbar bij webradio.

https://tweakers.net/i/bML3xFeeouEVECVUvPXspOEk_jA=/full-fit-in/4920x3264/filters:max_bytes(3145728):no_upscale():strip_icc():fill(white):strip_exif()/f/image/8avTbh1JzOzdCYI9RExf5swo.jpg?f=user_large


In de nabije toekomst hoop ik ook een python 3 versie van de Docker container beschikbaar te stellen. Dat zal waarschijnlijk iets langer duren omdat ik voor dat ik aan dit projectje begon nog nooit in python geprogrammeerd heb.

De API van weerlive laat zich eenvoudig in demomode gebruiken met de API key demo en de woonplaats Amsterdam. Wil je de gegevens van een andere woonplaats dan kun je voor privé gebruik een gratis key aanvragen. (Vergeet niet pydPiper.cfg aan te passen.)

Om deze aanpassingen te gebruiken kun je volstaan met het clonen van mijn repo op github in de map /home/volumio, naar eigen smaak aanpassen van pydPiper.cfg en het kopieeren van het pydpiper.service bestand:

code:
1
2
3
sudo cp pydpiper.service /etc/systemd/system/pydpiper.service
sudo systemctl daemon-reload
sudo service pydpiper start


Dit er vanuit gaande dat je Docker al geïnstalleerd hebt. Zo niet is er ook een install_docker.sh installatiescript aanwezig.

Pi Zero radio

Door synoniem op zondag 12 april 2020 23:33 - Reacties (15)
Categorie: Raspberry Pi, Views: 3.689

Als nieuw projectje kwam ik samen met iemand anders op het idee om een kleine radio te maken. Gewoon omdat het leuk is maar ook omdat ik tegenwoordig eigenlijk alleen nog maar naar webradio of mijn eigen muziekcollectie op een NAS luister.

Hardware
Een korte zoektocht op het internet leert dat ik niet de eerste ben en dat er heel veel oplossingen in combinatie met een Pi voor handen zijn. Het is meer een kwestie van wat je precies wilt. In mijn geval wilde ik iets wat op zo'n ouderwetse transistorradio lijkt. Gemakkelijk mee te nemen met een laag volume maar een niet al te blikkerig geluid en met een web interface en of een app.

Zoiets als dit:

https://tweakers.net/i/vtfkf1BZHTsOMS2KWh4e1Yt_Kew=/f/image/wRTFl8Z2ZOv0tAmZeLB646dR.jpg

Alleen wilde ik geen drukknoppen of een volumeknop maar meer dit:

https://tweakers.net/i/KMciQib_QL8_EIG_mnWN2TMes-s=/f/image/cw8N73Msu0ludAYFurciFYVn.jpg

Behorend bij dit overzicht van de te printen onderdelen.

https://tweakers.net/i/1PaAaBGT3PoOjZ27ZI9uU0JKOo8=/f/image/vT2mPXMFAUitu3paElCMgcIR.jpg

Alle drie de plaatjes zijn afkomstig van Thingiverse waar de user neurotik een compleet 3D te printen ontwerp heeft gepubliceerd. Je kunt zijn ontwerp exact nabouwen maar ik heb voor het audiodeel een ander keuze gemaakt en kom aan de volgende onderdelen.De Adafruit Speaker Bonnet is zowel een DAC als een miniversterker ineen. Deze past direct op GPIO header en is net zo groot als de Pi Zero zelf. Overigens heeft hij wel dezelfde PCM5102 chip die ondermeer bekend is onder de naam Hifiberry DAC.

https://tweakers.net/i/kzRDjkQNmrDmbnnyDy17U7_dDp8=/f/image/dTLDhHYtE85RC4vwmxXzLVuf.jpg

De standaard chip op het 16x2 LCD Display is de eveneens bekende HD44780 chip. Standaard heeft deze een parallel interface aansluiting. Wil je niet teveel soldeerwerk dan kun je er beter één kopen met een i2c piggyback zoals als op onderstaande plaatje. Dan heb je nog maar vier draadjes die je hoeft aan te sluiten op de Pi.

https://www.picclickimg.com/d/l400/pict/153603979058_/LCD-Display-Module-1602-Board-IIC-I2C-Serial.jpg

Overigens hoef je natuurlijk geen 3D geprint ontwerp te gebruiken. Je kan dit bij wijze van spreken ook nog in een sigarenkistje inbouwen. Je moet wel een beetje harde holle ruimte hebben om als klankkast te dienen want twee 3W speakers van 4 Ohm zonder klankkast is amper te horen.

Software
Als software heb ik Volumio geïnstalleerd. Voor de Raspberry Pi kun je een compleet image downloaden gebaseerd op een minimale versie van Raspbian Jessie. De lijst met mogelijkheden van Volumio is enorm lang maar om een paar te noemen: speelt FLAC, Aac, Vorbis, mp3. Heeft Airplay, UPNP, Webradio, CIFS en NFS ondersteuning. Daarnaast ook nog plugins voor Spotify en Digital Room Correction. Ook niet onbelangrijk in mijn geval een web interface.

Persoonlijk vind ik de mobiele web interface goed genoeg maar er is ook een betaalde app voor zowel Android als IOS. Volumio Free zelf is gratis. Je hebt ook betaalde versies met allerlei extra mogelijkheden die wellicht voor een audiofiel belangrijk zijn maar die mij verder niet zoveel zeggen behalve de Alexa integratie.

Installatie
Installatie van Volumio is eenvoudig. Je download de image en kopieert deze naar een SD-kaartje. Volumio detecteert automatisch de wifi van de Pi Zero W en start in AP mode met SSID Volumio en WPA key Volumio2. Als je hiermee verbindt kun je in je webbrowser volumio.local of 192.168.211.1 intikken en start de wizard met instellingen. Voor mijn configuratie kies je voor I2S DAC: aan, DAC model: Hifiberry DAC (Adafruit MAX98357 werkt ook overigens) en Mixer type: Software. Een handige instelling is bij de Netwerkinstellingen -> Hotspot Instellingen -> Terugvallen op Hotspot aan te zetten. Valt je wifi weg of neem je radio mee naar een andere locatie, kun je eenvoudig via de hotspot een nieuw draadloos netwerk kiezen.

Voor het aansturen van het LCD display heb je afzonderlijke software nodig. Neurotik verwijst hiervoor naar pydPiper. dhrone heeft pydPiper inmiddels omgegooid naar een Docker container. De githubversie is inmiddels versie 0.31 maar je kunt beter het installatiescript van 0.3 volgen:

code:
1
2
3
sudo wget https://github.com/dhrone/pydPiper/archive/v0.3-alpha.tar.gz
sudo tar zxvf v0.3-alpha.tar.gz
cd pydPiper-0.3-alpha


Pas het bestand pydpiper.service aan:
code:
1
sudo nano pydpiper.service


Zoek naar de regel met # HD44780 LCD 16x2 display with I2C interface on address 0x27
Verwijder bij de volgende bijbehorende regel het # en verander fahrenheit in celsius en tijdzone in Europe/Amsterdam zodat het er zo uit komt te zien:
code:
1
ExecStart=/usr/bin/docker run --network=host --privileged -v /var/log:/var/log:rw  dhrone/pydpiper:latest python /app/pydPiper.py --volumio --driver hd44780_i2c  --width 80 --height 16 --i2caddress 0x27 --timezone 'Europe/Amsterdam' --temperature celsius --pages pages_lcd_16x2.py

Je hebt (Zie stap 2a op github) nog de mogelijkheid om weer data weer te geven. Hiervoor moet je een API key aanvragen bij Weather Underground service. Dat heb ik niet ingesteld en hierdoor blijven er op de tweede regel van het display drie witte blokjes staan. Dat is dus als bedoeld en geen defect.

Nadat je het bestand aangepast hebt doe je:
code:
1
sudo ./install.sh


Dat duurt wel even want het script installeert o.a. Docker, kopieert het service bestand en activeert systemd en Docker. Waarna de docker container wordt opgehaald en opgestart.

Uiteraard kun je een ander model Pi gebruiken, hoewel het inbouwen daarvan in deze behuizing nog wel een uitdaging is. Maar de Pi Zero W heeft genoeg pit om het allemaal te draaien: best wel een prestatie. Over pit gesproken het is wel verstandig om een USB-stroomadapter met minstens 2A te gebruiken.