Mijn schoonmoeder vertelde tijdens de kerst over haar hobby om oude radio’s te verzamelen en weer werkend te maken. Dat bracht mij op het idee om zo’n kapotte oude radio de 21ste eeuw in te helpen. Uiteraard ben ik niet de eerste die op dat idee gekomen is, op internet zijn legio hobbyprojecten beschreven. De beschrijving van Bob Rathbone’s project is super gedetailleerd en volledig en een prima inspiratiebron. Onderstaand een beschrijving van mijn project.
Mijn opzet is een oude Phillips radio om te bouwen tot een internet radio m.b.v. een Raspberry Pi Zero 2w, de radio dient de volgende kenmerken te hebben:
- Kan met de knoppen aan de voorkant van de radio bedient worden, waaronder:
- Volume/Mute
- Toon
- Preset channel
- Aan/uit
Kan via een app bedient worden
Kan via een webpagina bedient worden
Kan met een afstandsbediening bedient worden
- Beschikt over de volgende in- en uitgangen
- USB-aansluiting
- RCA en/of S/PDIF aansluiting (voor aansluiten van een versterker)
- Beschikt over (stereo) luidsprekers
Kan muziek van zowel streamingsdiensten als Spotify en Youtube afspelen (DLNA/UPnP-AV)
Kan muziek van internet kanalen zoals 100% NL, Waterstad FM, Sky radio etc. afspelen
- Kan muziek vanaf een NAS afspelen
- Kan muziek vanaf een USB stick afspelen
Kan op TV worden aangesloten voor OSD (OnScreen Display)
Optioneel: Kan als Bluetooth speaker worden gebruikt
Optioneel: Kan muziek via AirPlay afspelen
- Optioneel: Bij het draaien aan de tuning knop beweegt de aanwijzer nog steeds, en scroll je door de preset channels
Links:
https://www.bobrathbone.com/raspberrypi/documents/Raspberry%20PI%20Vintage%20Radio.pdf
https://www.bobrathbone.com/raspberrypi/documents/Raspberry%20PI%20Radio%206.x.pdf
Van mijn schoonmoeder heb ik een Phillips BX310 A/53 bakelieten radio cadeau gekregen. Een redelijk complete beschrijving van dit apparaat kun je vinden op https://www.techniekvantoen.nl/philips-bx-310a/
Het apparaat stamt uit 1952 en zal de basis van mijn project vormen.
Onderdelenlijst:
Onderdeel | Aantal | Prijs | Webshop |
Raspberry Pi Zero 2W | 1 | € 17,95 | SOS Solutions |
HiFiBerry DAC+ Zero | 1 | € 14,90 | SOS Solutions |
Sandisk High endurance 32Gb Micro- SD-card | 1 | € 10,90 | Dataio.nl |
2.5 inch 15W 4 Ohm luidsprekers | 2 | € 21,36 | Aliexpress |
Velleman Stereo versterkermodule 2x30W VM113 | 1 | € 24,10 | Opencircuit.nl |
EI 66/34,7 118 Transformator 50VA, 18V, 2780mA | 1 | € 13,83 | Reichelt.nl |
PCB Protoboard 9x15cm | 1 | € 0,24 | Alixexpress |
C&K Components A12515RNZQ Rotary switch | 1 | € 5,46 | Farnell |
PEC11R-4215F-N0012 BOURNS Rotary encoders | 2 | € 4,19 | TME |
Lineaire Dual Potentiometer 100K | 1 | € 3,69 | Aliexpress |
Askoppeling 6 op 6mm | 4 | € 3,68 | Aliexpress |
Asverlenging 6mm | 4 | € 3,37 | Reichelt.nl |
40 voudige ribbon cable | 1 | Uit rommelbak (van oude PC diskdrive of dvd-speler oid) | |
40 Pins (2×20) Male/Male Headers | 1 | € 2,94 (5) | Aliexpress |
Extra Lange Stacking Header 2x20p | 1 | € 1,82 | Aliexpress |
Schakelaar + AC aansluiting + zekering | 1 | € 1,38 | Aliexpress |
Male 2 pin PCB mount connectors | 5 | € 1,52 (50-stuks) | Aliexpress |
Female 4 pin PCB connectors 30cm | 2 | € 2,52 (10-stuks) | Aliexpress |
Female 2 pin PCB connectors 30cm | 1 | € 2,28 (10-stuks) | Aliexpress |
16 pin male in-line PCB mount connector | 1 | € 2,95 | Aliexpress |
Stereo jack plug socket | 1 | Van sloop thin-client PC | |
2x RCA-male Tulp audio kabel naar 3.5mm Jack male 0,5m | 1 | € 2,99 | Aliexpress |
Tulp chassisdeel-rood/zwart | 1 | € 2,34 (2-stuks) | Aliexpress |
RGB led | 1 | € 0,40 | Reichelt.nl |
VS1838B IR Receiver | 1 | Uit voorraad | |
220 Ohm weerstand | 3 | € 2,30 (50-stuks) | Aliexpress |
100 Ohm weerstand | 1 | Uit voorraad | |
IN4148 diodes | 9 | Uit voorraad | |
KBP310 Bruggelijkrichter 1000V | 1 | € 0,30 | budgetelectronica.nl |
Condensator 50V 4700uF | 1 | € 1,44 | budgetelectronica.nl |
Mean Well 1RM-15-5 220v-5v 3A PCB voeding | 1 | € 11,34 | Reichelt.nl |
Totaal | € 162,73 |
Benodigdheden
- Laptop/Desktop met (Micro)SD kaartlezer
- Optioneel bij Airplay: IOS device zoals een Ipad of IPhone
- Optioneel bij Bluetooth speaker: Mobiele telefoon of tablet met bluetooth
- Verloopkabel of -adapter HDMI naar HDMI-stekker D micro
- USB-C male naar USB-A female adapter (of de USB Mini HUB OTG van hierboven)
- Toetsenbord met USB-A aansluiting
- Muis met USB-A aansluiting
- Monitor met HDMI-aansluiting
- Papiersnijder en/of schaar
- Papierlijm en plakband
- Meetlint
- Viltstift
- (Digitale) schuifmaat
- Boormachine, 4 en 6 mm staal oren
- Popnageltang + 4mm popnagels
- Flex
- Metaalvijl
- Krimpkous + Föhn
- Jumperkabeltjes 10 en 30cm
Stap 1. Raspbian op de Micro SD kaart installeren en configureren
Download de Raspberry Pi Imager van https://downloads.raspberrypi.org/imager/imager_latest.exe, en open de exe. De installatie wizard van de Imager tool start. Klik op “Installeren”, en daarna op “Voltooien”

De Imager tool start en je krijgt een melding met de vraag of de Raspberry Pi imager wijzigingen op je apparaat mag aanbrengen, bevestig dit met “Ja

Daarna verschijnt de user-interface van de imager tool

Plaats de lege SD-Card in je kaartlezer. Kies bij “Besturingssysteem” voor “Raspberry PI OS (32-BIT)” en bij “Opslagapparaat” de SD-Card die je net geplaatst hebt. Klik daarna op “Schrijf”, en Raspbian wordt op je SD-Card geïnstalleerd.

Haal nadat de Imager tool klaar is, sluit de Imager tool en haal de SD-kaart uit je Laptop/Desktop en schuif hem in de Raspberry Zero 2W

Sluit Toetsenbord, Muis en Monitor aan. (De Raspberry Zero ondersteund ook Bluetooth, dus je kunt ook een Bluetooth toetsenbord en muis gebruiken. Maar om die in te kunnen stellen zul je toch eerst met een USB-A variant aan de slag moeten). Sluit de Raspberry Zero met een voeding van minimaal 5.2v en 2.5A (gebruik hier bij voorkeur een officiele Raspberry Pi voeding) aan op het lichtnet. Raspbian start nu op in Desktop mode. Log in met username “pi” en wachtwoord “raspberry”.

Automatisch start de “Welkom bij Raspberry Pi” installatie wizard op

Klik op “Next”, en stel je Land, Taal en TimeZone in

Verander nu het wachtwoord van de user “pi”
Selecteer het WiFi netwerk en vul het WiFi password in

Laat de Raspberry Zero de updates van Raspbian downloaden en installeren
En klik tenslotte op “Restart” om de setup af te ronden

Enable eventueel SSH volgens de tutorials op https://phoenixnap.com/kb/enable-ssh-raspberry-pi#ftoc-heading-1
Maak met een terminal programma, bijv. Putty, connectie met de Raspberry Zero 2W. Achterhaal hiervoor het ip-address van je Raspberry Zero 2W van je router of dhcp-server, of open op de desktop van de Raspberry Zero een terminalvenster en gebruik het commando ipconfig om het ip-address te achterhalen.
In mijn geval heb ik er voor gekozen om SSH te activeren op de Raspberry Zero 2W volgens de beschrijving op https://phoenixnap.com/kb/enable-ssh-raspberry-pi#ftoc-heading-3
En maak verbinding met de Raspberry Zero m.b.v. de volgende putty settings, de eerste keer dat je via SSH connectie maakt moet je bevestigen dat de fingerprint van de Raspberry Zero toegevoegd wordt aan het register, bevestig dit met “Ja”

Log in met user pi en het wachtwoord wat je eerder ingegeven hebt. We gaan nu nog een paar zaken configureren, zoals de hostnaam en (optioneel) syslog, voer hiervoor de volgende commando’s uit
$ sudo vi /etc/hostname
Verander de hostname “raspberrypi” naar een naam van je keuze, in mijn geval “radio”, en sla de file op. Verander tevens in /etc/hosts de hostname achter 127.0.0.1 (zogenaamde localhost)
$ sudo vi /etc/hosts
Die ziet er dan als volgt uit
pi@raspberrypi:~ $ cat /etc/hosts
127.0.0.1 localhost
::1 localhost ip6-localhost ip6-loopback
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
127.0.1.1 radio
Voeg tot slot de hostname toe aan de dhcp-client configuratie file /etc/dhcpcd.conf, dit onder “# define static profile”
$ sudo vi /etc/dhcpcd.conf
Die ziet er dan als volgt uit
$ cat /etc/dhcpcd.conf # A sample configuration for dhcpcd. # See dhcpcd.conf(5) for details. # Allow users of this group to interact with dhcpcd via the control socket. #controlgroup wheel # Inform the DHCP server of our hostname for DDNS. hostname # Use the hardware address of the interface for the Client ID. clientid # or # Use the same DUID + IAID as set in DHCPv6 for DHCPv4 ClientID as per RFC4361. # Some non-RFC compliant DHCP servers do not reply with this set. # In this case, comment out duid and enable clientid above. #duid # Persist interface configuration when dhcpcd exits. persistent # Rapid commit support. # Safe to enable by default because it requires the equivalent option set # on the server to actually work. option rapid_commit # A list of options to request from the DHCP server. option domain_name_servers, domain_name, domain_search, host_name option classless_static_routes # Respect the network MTU. This is applied to DHCP routes. option interface_mtu # Most distributions have NTP support. #option ntp_servers # A ServerID is required by RFC2131. require dhcp_server_identifier # Generate SLAAC address using the Hardware Address of the interface #slaac hwaddr # OR generate Stable Private IPv6 Addresses based from the DUID slaac private # Example static IP configuration: #interface eth0 #static ip_address=192.168.0.10/24 #static ip6_address=fd51:42f8:caae:d92e::ff/64 #static routers=192.168.0.1 #static domain_name_servers=192.168.0.1 8.8.8.8 fd51:42f8:caae:d92e::1 # It is possible to fall back to a static IP if DHCP fails: # define static profile #profile static_eth0 #static ip_address=192.168.1.23/24 #static routers=192.168.1.1 #static domain_name_servers=192.168.1.1 hostname radio.sydspost.nl # fallback to static profile on eth0 #interface eth0 #fallback static_eth0
reboot de Raspberry Zero met
$ sudo reboot
Maak opnieuw verbinding met de Raspberry Zero in putty door voor de optie “Restart Session” te kiezen, en log opnieuw in als user pi. Als alles goed is gegaan zie je dat de prompt is aangepast naar: pi@radio:~ $.
Optioneel kun je de systeem logging van de Raspberry Zero naar een centrale syslog server laten zenden, zie ook mijn tutorial “Syslog server inrichten“. Standaard is rsyslog al geïnstalleerd binnen de Raspbian image en behoeft alleen nog geconfigureerd te worden. Volg hiervoor stap 3. van voorgenoemde tutorial, dus:
$ sudo vi /etc/rsyslog.conf
Voeg nu onderstaande regel toe boven in de file, net onder de eerste uitgecommentarieerde regels:
@@<ip-address syslog server>:<poortnummer>
In mijn geval dus @@192.168.2.29:514, de eerste 5 regels van de file ziet er dan zo uit:
$ cat /etc/rsyslog.conf # /etc/rsyslog.conf Configuration file for rsyslog. # # For more information see # /usr/share/doc/rsyslog-doc/html/rsyslog_conf.html @@192.168.2.29:514
Herstart de rsyslog deamon met:
$ sudo systemctl restart rsyslog
Check de /var/log/syslog file op je Centrale syslog-server om te checken of de radio zijn logging doorstuurt naar de centrale Syslog server.
Stap 2. Benodigde software installeren
Installeer anacron. Anacron wordt gebruikt om de playlists gescheduled te updaten, dit om radio streams die niet meer bestaan te detecteren en uit je playlist te halen.
$ sudo apt-get install anacron
Installeer optioneel scratch. Default wordt de radio software met een achtergrond image geleverd. Het installeren van scratch zorgt voor additionele achtergrond images die je kunt activeren in de radio software. Hoe dit in zijn werk gaat leg ik later uit.
$ sudo apt-get install scratch
Nu gaan we de Music Player Daemon (MPD) installeren en de bijbehorende client Music Player Client (MPC), dit inclusief de Python MPD bibliotheek
$ sudo apt-get install mpd mpc python3-mpd
En installeren we de radio software van Bob Rathbone
$ wget https://bobrathbone.com/raspberrypi/beta/radiod_7.4_armhf.deb
$ sudo dpkg -i radiod_7.4_armhf.deb
Indien dpkg de volgende foutmelding geeft “Package python is not installed”, voer dan het volgende commando uit om dit te herstellen: sudo apt-get install -f
Het configuratieprogramma wordt automatisch opgestart

Kies voor 1. Replace configuration file, en ga met de tab toets naar “<Ok>” en druk op Enter.

Ik ga mijn radio bedienen met de knoppen voorop het apparaat. Hierbij worden de Volume en Toon knoppen aangesloten op Rotary Encoders, dit ik kies voor optie 2. Radio with Rotary Encoders en Enter, bevestig de vraag “Is this correct?” met “<Ja>”

Ik ga standaard Rotary encoders gebruiken, dus kies voor optie 1. Standard rotary encoders with A, B and C inputs only en Enter, bevestig de vraag “Is this correct?” met “<Ja>”

Ik gebruik de 26 pins flatcable versie, dus kies voor optie 2. 26 pin version wiring en Enter, bevestig de vraag “Is this correct?” met “<Ja>”

Ik ga een DAC gebruiken, dus kies voor optie 1. GPIO 10 – Physical pin 19 en Enter, bevestig de vraag “Is this correct?” met “<Ja>”

Ik ga mijn TV voor Onscreen Display gebruiken, de TV sluit ik aan op de HDMI poort van de Raspberry Zero, dus kies voor optie 5. HDMI or touch screen display en Enter, bevestig de vraag “Is this correct?” met “<Ja>”

En wederom voor optie 5. HDMI television or monitor (800×480) en Enter, bevestig de vraag “Is this correct?” met “<Ja>”

Hoewel de Vintage look-alike er mooi is, en goed zou passen bij de oude Philips radio, kies ik voor de functioneel rijkere radio, dus optie 1. Full feature radio en Enter, bevestig de vraag “Is this correct?” met “<Ja>”

Kies voor optie 1. Start radio at boot time en Enter, bevestig de vraag “Is this correct?” met “<Ja>”

Voor beeldvullende radio-interface op mijn TV kies ik voor optie 1. Start graphical radio full screen en Enter, bevestig de vraag “Is this correct?” met “<Ja>”. De configuratietool gaat nu even flink aan de slag, en keert terug met het configureren van de Audio interface

Druk op Enter, het volgende scherm verschijnt

Omdat ik de HiFiBerry DAC nog niet besteld heb, en de Raspberry Zero niet over een audio output jack beschikt, voorlopig voor optie 2. HDMI output. Druk op Enter en bevestig de vraag “Is this correct?” met “<Ja>”.

Bevestig de vraag op de Raspberry Pi gereboot dient te worden met “<Yes>”.
De LG monitor die ik als tweede monitor gebruikt voor mijn laptop beschikt over naast uiteraard een HDMI aansluiting ook over een hoofdtelefoon aansluiting. Deze monitor verbindt ik met een verloopkabel HDMI naar HDMI-stekker D micro met de Raspberry Zero en de hoofdtelefoonaansluiting van de monitor verbindt ik aan de AUX-ingang van m’n Bose Soundtouch. Dit wordt mijn testopstelling om de software in te stellen en te testen. Hiervoor moeten nog wel een aantal aanpassingen in de configuratie gedaan worden, eerst dient achterhaald te worden wat het “adres” van je geluidskaart is. De naam van de soundcard-driver van de Raspberry Zero is overigens “vc4hdmi”, en wordt ingesteld met een dtoverlay in /boot/config.txt. Check dit met
$ grep vc4 /boot/config.txt dtoverlay=vc4-kms-v3d
Indien dit niets oplevert, voeg dan de dtoverlay regel onderaan toe in /boot/config.txt. Vervolgens kunnen we met aplay -L de aanwezige soundcard configuraties achterhalen
$ aplay -L null Discard all samples (playback) or generate zero samples (capture) sysdefault Default Audio Device front Default Audio Device lavrate Rate Converter Plugin Using Libav/FFmpeg Library samplerate Rate Converter Plugin Using Samplerate Library speexrate Rate Converter Plugin Using Speex Resampler bluealsa Bluetooth Audio Hub jack JACK Audio Connection Kit oss Open Sound System pulse PulseAudio Sound Server upmix Plugin for channel upmix (4,6,8) vdownmix Plugin for channel downmix (stereo) with a simple spacialization default btdevice Bluetooth device hw:CARD=vc4hdmi,DEV=0 vc4-hdmi, MAI PCM i2s-hifi-0 Direct hardware device without any conversions plughw:CARD=vc4hdmi,DEV=0 vc4-hdmi, MAI PCM i2s-hifi-0 Hardware device with all software conversions sysdefault:CARD=vc4hdmi vc4-hdmi, MAI PCM i2s-hifi-0 Default Audio Device front:CARD=vc4hdmi vc4-hdmi, MAI PCM i2s-hifi-0 Default Audio Device hdmi:CARD=vc4hdmi,DEV=0 vc4-hdmi, MAI PCM i2s-hifi-0 HDMI Audio Output dmix:CARD=vc4hdmi,DEV=0 vc4-hdmi, MAI PCM i2s-hifi-0 Direct sample mixing device usbstream:CARD=vc4hdmi vc4-hdmi USB Stream Output
De systemdefault is ” sysdefault:CARD=vc4hdmi”, test of alles goed is aangesloten met (Let op: zonder “CARD=” !). Als het goed is hoor je een vrouwenstem zeggen “Front speaker …”.
speaker-test -D sysdefault:vc4hdmi -t wav -c 1
Vervolgens heb ik dit “adres” van de soundcard opgenomen in de configuratie van MPD en de radio. Voeg onderstaand configuratie-fragment toe aan /etc/mpd.conf
audio_output { type "alsa" name "My ALSA Device" device "sysdefault:vc4hdmi" mixer_type "software" ## mixer_device "default" # optional ## mixer_control "PCM" # optional ## mixer_index "0" # optional }
Noot: je kunt meerdere geluidskaarten configureren in mpd.conf, dus er kunnen meerdere instanties van audio_output {} voorkomen.
Vervolgens configureer je in /usr/share/radio/radiod.conf welke geluidskaart definitie uit de mpd configuratie de radio moet gebruiken voor zijn output. Dit doormiddel van het configureren van de parameter : audio_out”. Dit ziet er dan als volgt uit
# Audio output device - Must match an output using the "aplay -l" command # The configure_audio.sh program will set this to headphones(default), HDMI, DAC or USB # depending upon the audio device/card selection. You can override this setting # with your own unique string from the aplay command, for example "HiFiBerry" audio_out="sysdefault:vc4hdmi"
Mijn proefopstelling:
Om de software te kunnen bedienen nog een bluetooth muis geconfigureerd met
$ sudo bluetoothctl
Agent registered
[bluetooth]#
set de muis in de pairing stand en laat de Raspberry Zero naar bluetooth devices scannen met
[bluetooth]# scan on Discovery started [CHG] Controller B8:27:EB:D8:24:3F Discovering: yes [NEW] Device 00:A0:50:93:4B:E0 HwZ_fb1449f749000b2f20 [NEW] Device ED:7E:5A:8E:0C:9F N038L [NEW] Device DC:BC:5B:3D:7D:10 N005J [NEW] Device 9C:30:5B:4F:1F:04 Woonkamer-TV [NEW] Device 1C:1A:DF:E9:07:3E Microsoft Sculpt Comfort Mouse
Je ziet mijn Microsoft Sculpt Comfort Mouse als nieuw bluetooth apparaat verschijnen, pair dit apparaat met het mac-address ( in mijn geval 1C:1A:DF:E9:07:3E ) van de muis
[bluetooth]# pair 1C:1A:DF:E9:07:3E
Attempting to pair with 1C:1A:DF:E9:07:3E
[CHG] Device 1C:1A:DF:E9:07:3E Connected: yes
[CHG] Device 1C:1A:DF:E9:07:3E Modalias: usb:v045Ep07A2d0129
[CHG] Device 1C:1A:DF:E9:07:3E UUIDs: 00001000-0000-1000-8000-00805f9b34fb
[CHG] Device 1C:1A:DF:E9:07:3E UUIDs: 00001124-0000-1000-8000-00805f9b34fb
[CHG] Device 1C:1A:DF:E9:07:3E UUIDs: 00001200-0000-1000-8000-00805f9b34fb
[CHG] Device 1C:1A:DF:E9:07:3E ServicesResolved: yes
[CHG] Device 1C:1A:DF:E9:07:3E Paired: yes
Pairing successful
[CHG] Device 1C:1A:DF:E9:07:3E WakeAllowed: yes
[CHG] Device 1C:1A:DF:E9:07:3E ServicesResolved: no
[CHG] Device 1C:1A:DF:E9:07:3E Connected: no
de muis is nu gepaired met de Raspberry Zero, maar moet nu nog geconnect en getrust worden met
[bluetooth]# connect 1C:1A:DF:E9:07:3E [CHG] Device 1C:1A:DF:E9:07:3E Class: 0x00000580 [CHG] Device 1C:1A:DF:E9:07:3E Icon: input-mouse [CHG] Device 1C:1A:DF:E9:07:3E Connected: yes [bluetooth]# trust 1C:1A:DF:E9:07:3E Changing 1C:1A:DF:E9:07:3E trust succeeded [Microsoft Sculpt Comfort Mouse]# exit
De testopstelling is hiermee compleet.
Stap 3. Configuratie IR-ontvanger
Om de radio te kunnen bedienen kun je natuurlijk de knoppen icm met OSD gebruiken of een app. Maar een afstandsbediening is wel zo gemakkelijk. Ik kon nog net op tijd een WD TV Live afstandsbediening uit de prullenbak redden die mijn vrouw in haar opruimwoede had weggegooid. Deze ga ik inzetten als afstandsbediening.

Voordat we de benodigde software gaan installeren en configureren heb ik eerst een proefopstelling gemaakt met een VS1838B IR ontvanger, breadboard en Raspberry Zero. De pinout is als volgt
Raspberry Zero | VS1838B | Toelichting |
3.3v | VCC | |
GND | GND | |
GPIO 25 | Signal |

De proefopstelling ziet er als volgt uit

Nu gaan we de software installeren, start de configuratie wizard op met
sudo /usr/share/radio/configure_ir_remote.sh
De wizard start met het volgende scherm, kies optie 1. “Run IR remote control configuration” en druk op “OK”

Kies optie 1. Raspbian Buster or later” en druk op “Ok”, op de vraag “Is this correct” bevestig dat met “Yes”

Kies bij op welke GPIO de IR ontvanger is aangesloten voor optie 5. “All versions using DAC GPIO 25” en druk op “Ok”

Kies bij IR Activity led voor optie 5. “No remote Activity led or manual configuration”. De IR Activity led configureren we in de volgende stap. Druk op “Ok”

De configuratie wizard installeert nu een flink aan bibliotheken en software modules, de installatie sluit af met
Configuration of LIRC completed OK Reboot the system and then run the following to configure your IR remote control sudo irrecord -f -d /dev/lirc0 ~/lircd.conf Then copy your configuration file (myremote.conf) to /etc/lirc/lircd.conf.d sudo cp myremote.conf /etc/lirc/lircd.conf.d/. Reboot the Raspberry Pi A log of this run will be found in /usr/share/radio/install_ir.log
Reboot de Raspberry Zero
$ sudo reboot
Nadat de Raspberry Zero opnieuw opgestart is, check of LIRC goed draait met
$ sudo systemctl status lircd ● lircd.service - Flexible IR remote input/output application support Loaded: loaded (/lib/systemd/system/lircd.service; enabled; vendor preset:> Active: active (running) since Mon 2022-01-03 18:54:38 CET; 39s ago TriggeredBy: ● lircd.socket Docs: man:lircd(8) http://lirc.org/html/configure.html Main PID: 486 (lircd) Tasks: 2 (limit: 409) CPU: 36ms CGroup: /system.slice/lircd.service └─486 /usr/sbin/lircd --nodaemon
Als LIRC goed is opgestart kunnen we nu de afstandsbediening en IR ontvanger testen met
$ sudo mode2 --raw -d /dev/lirc0
Using driver default on device /dev/lirc0 Trying device: /dev/lirc0 Using device: /dev/lirc0 Running as regular user pi
Druk nu een toets van de afstandsbediening in, je krijgt nu een response als hieronder staand
Using raw access on device /dev/lirc0 Using device: /dev/lirc/0 Running as regular user pi code: 0xffffff00 code: 0x2fdf0a00 code: 0x4b230001 code: 0x23110000 code: 0x6a020001 code: 0x17020000 code: 0x68020001 code: 0x18020000 code: 0x4d020001 code: 0x83060000 code: 0x6a020001 code: 0x17020000 code: 0x81020001 code: 0xfe010000 code: 0x4d020001 code: 0x36020000 code: 0x16020001 code: 0x82020000 code: 0x52020001 code: 0x67060000 code: 0x2c020001 code: 0xa0060000 code: 0x65020001 code: 0x1a020000 code: 0x4f020001 code: 0x35020000 code: 0x14020001 code: 0xb6060000 code: 0x4f020001 code: 0x81060000 code: 0x83020001 code: 0x50060000 code: 0x2e020001 code: 0xa0060000 code: 0x4a020001 code: 0x33020000 code: 0x2e020001 code: 0x9f060000 code: 0x4d020001 code: 0x3e020000 code: 0x0c020001 code: 0xb8060000 code: 0x4d020001 code: 0x33020000 code: 0x4c020001 code: 0x36020000 code: 0x2c020001 code: 0x53020000 code: 0x4e020001 code: 0x36020000 code: 0x67020001 code: 0x18020000 code: 0x4b020001 code: 0x38020000 code: 0x15020001 code: 0xb6060000 code: 0x4f020001 code: 0x31020000 code: 0x4f020001 code: 0x82060000 code: 0x68020001 code: 0x66060000 code: 0x4d020001 code: 0x80060000 code: 0x16020001 code: 0xb7060000 code: 0x4e020001 code: 0x82060000 code: 0x4f020001 code: 0x809c0000 code: 0x3c230001 code: 0xa0080000 code: 0x2d020001 code: 0x09110203
Dat werkt, nu gaan we de IR codes van de WD TV Live afstandsbediening downloaden van sourceforge.net. Op de pagina http://lirc-remotes.sourceforge.net/remotes-table.html vindt je van heel veel afstandsbedieningen de IR codes, die van de WD TV Live afstandsbediening vindt je op https://sourceforge.net/p/lirc-remotes/code/ci/master/tree/remotes/wd/KWSB0865F101.lircd.conf. Met wget halen we die op
$ wget https://sourceforge.net/p/lirc-remotes/code/ci/master/tree/remotes/wd/KWSB0865F101.lircd.conf?format=raw --2022-01-03 22:28:19-- https://sourceforge.net/p/lirc-remotes/code/ci/master/tree/remotes/wd/KWSB0865F101.lircd.conf?format=raw Resolving sourceforge.net (sourceforge.net)... 204.68.111.105 Connecting to sourceforge.net (sourceforge.net)|204.68.111.105|:443... connected. HTTP request sent, awaiting response... 200 OK Length: unspecified [text/plain] Saving to: ‘KWSB0865F101.lircd.conf?format=raw’ KWSB0865F101.lircd. [ <=> ] 2.17K --.-KB/s in 0s 2022-01-03 22:28:20 (13.5 MB/s) - ‘KWSB0865F101.lircd.conf?format=raw’ saved [2226]
Het bestand wordt opgeslagen met de naam ‘KWSB0865F101.lircd.conf?format=raw’, deze dient hernoemd te worden naar een willekeurige bestandsnaam met de extentie .conf. Ik gebruik de bestandsnaam wdtvlive.lirc.conf
$ mv 'KWSB0865F101.lircd.conf?format=raw' wdtvlive.lircd.conf
Kopieer dit file vervolgens naar de directory /etc/lirc/lircd.conf.d en herstart Lirc
$ sudo cp wdtvlive.lircd.conf /etc/lirc/lircd.conf.d/wdtvlive.lircd.conf $ sudo systemctl restart lircd
We gaan nu de afstandsbediening opnieuw testen met irw
$ irw
Druk een toets op de afstandsbediening in, en het systeem reageert met
$ irw 00000000219e10ef 00 KEY_ENTER WDTVLive 00000000219ea05f 00 KEY_UP WDTVLive 00000000219e00ff 00 KEY_DOWN WDTVLive
Dat werkt, sluit af met <Ctrl-c>. De standaard toets-indeling en key-benaming van de WDTV wijkt af van de radio software. Dus de file /etc/lirc/lircd.conf.d/wdtvlive.lircd.conf dient aangepast te worden zodat de key-benamingen overeenstemmen met de functies van de radio.
$ sudo vi /etc/lirc/lircd.conf.d/wdtvlive.lircd.conf
Hulptabel die ik daarbij gebruikt heb:
Radio Key Name | Operation | WD-TV Live AB toets | WD-TV IR code HEX |
KEY_VOLUMEUP | Volume up | Right arrow | 249E906F |
KEY_VOLUMEDOWN | Volume down | Left arrow | 249EE01F |
KEY_CHANNELUP | Channel up | Up arrow | 249EA05F |
KEY_CHANNELDOWN:q | Channel down | Down arrow | 249E00FF |
KEY_MUTE | Mute sound | Mute | 249EB24D |
KEY_MENU | Step menu Play selected Load tracks/stations Next menu | Setup | 249E827D |
KEY_UP | Previous artist Toggle source Previous option | << | 249EF807 |
KEY_DOWN | Next artist Toggle source Next option | >> | 249E7887 |
KEY_LEFT | Track up Toggle option | |<< | 249E40BF |
KEY_RIGHT | Track down Toggle option | |>> | 249E807F |
KEY_OK | Step menu Play selected Load tracks/stations Next menu | OK | 249E10EF |
KEY_EXIT | Exit/shutdown | Ȯ | 249E48B7 |
De file /etc/lirc/lircd.conf.d/wdtvlive.lircd.conf komt er dan als volgt uit te zien (de ongebruikte toetsen heb ik uit gecommentarieerd)
$ cat wdtv*.conf # Please make this file available to others # by sending it to <lirc@bartelmus.de> # # this config file was automatically generated # using lirc-0.9.0-pre1(default) on Thu Dec 10 10:11:42 2015 # # contributed by N. Wolf # # brand: WD # model no. of remote control: KWSB0865F101 # devices being controlled by this remote: WD TV Live Streaming Media PLayer WDBHG70000NBK-01 # begin remote name WDTVLive bits 16 flags SPACE_ENC|CONST_LENGTH eps 30 aeps 100 header 8994 4433 one 592 1654 zero 592 569 ptrail 599 pre_data_bits 16 pre_data 0x219E gap 107534 toggle_bit_mask 0x0 begin codes # KEY_0 0x8877 # KEY_1 0x18E7 # KEY_2 0x9867 # KEY_3 0x708F # KEY_4 0x38C7 # KEY_5 0xB847 # KEY_6 0x7A85 # KEY_7 0xBA45 # KEY_8 0x3AC5 # KEY_9 0xFA05 # KEY_AUDIO 0xB04F # KEY_BACK 0xD827 # KEY_BLUE 0xE817 KEY_CHANNELDOWN 0x00FF KEY_OK 0x10EF KEY_DOWN 0x7887 # KEY_GREEN 0x28D7 # KEY_HOME 0x609F KEY_VOLUMEDOWN 0xE01F KEY_MUTE 0xB24D KEY_RIGHT 0x807F # KEY_ENTER 0x10EF # KEY_OPTION 0x58A7 # KEY_PLAYPAUSE 0x50AF KEY_EXIT 0x48B7 KEY_LEFT 0x40BF # KEY_RED 0xA857 KEY_UP 0xF807 KEY_VOLUMEUP 0x906F # KEY_SEARCH 0xF00F KEY_MENU 0x827D # KEY_STOP 0x20DF # KEY_SUBTITLE 0x30CF KEY_CHANNELUP 0xA05F # KEY_YELLOW 0x6897 end codes end remote
Natuurlijk daarna weer getest met irw, nadat ik eerst de lircd-daemon opnieuw heb opgestart
$ sudo systemctl restart lircd $ irw 00000000219ee01f 00 KEY_VOLUMEDOWN WDTVLive 00000000219e906f 00 KEY_VOLUMEUP WDTVLive 00000000219ea05f 00 KEY_CHANNELUP WDTVLive 00000000219e00ff 00 KEY_CHANNELDOWN WDTVLive 00000000219e10ef 00 KEY_OK WDTVLive 00000000219ef807 00 KEY_UP WDTVLive 00000000219e40bf 00 KEY_LEFT WDTVLive 00000000219e807f 00 KEY_RIGHT WDTVLive 00000000219e7887 00 KEY_DOWN WDTVLive 00000000219e48b7 00 KEY_EXIT WDTVLive 00000000219e827d 00 KEY_MENU WDTVLive 00000000219eb24d 00 KEY_MUTE WDTVLive ^C
Zo dat klopt als een zwerende vinger. Nu starten we de irradiod deamon op en zorgen ervoor dat hij bij het starten van de Raspberry Zero automatisch opstart met
$ sudo systemctl enable irradiod radiod Created symlink /etc/systemd/system/multi-user.target.wants/irradiod.service → /lib/systemd/system/irradiod.service. Created symlink /etc/systemd/system/multi-user.target.wants/radiod.service → /lib/systemd/system/radiod.service. $ sudo systemctl start irradiod radiod
Controleer de status van de irradiod daemon met
$ sudo systemctl status irradiod radiod
Dit gaf bij mij een foutmelding dat import RPi.GPIO as GPIO mislukte. Achterliggende reden is dat de python scripts /usr/share/radio/remote_control.py en /usr/share/radio/rc_daemon.py nog op python2.7 draaien. En python2.7 wordt al sinds januari 2021 niet meer onderhouden. Dus het lukte me met geen mogelijkheid om de module RPi.GPIO te installeren onder python2.7. Toen de list bedacht om de python code van beide scripts te migreren naar python3. Hiervoor is gelukkig tooling beschikbaar, 2to3. Dus deze eerst geïnstalleerd
$ sudo apt install 2to3 $ sudo apt install python3-lib2to3 $ sudo apt install python3-toolz
Daarna de scripts gemigreerd met
$ sudo 2to3 /usr/share/radio/remote_control.py -w $ sudo 2to3 /usr/share/radio/rc_daemon.py -w
Daarna is er toch nog wat handwerk nodig, op de 1ste regel van beide scripts dient !/usr/bin/env python2 aangepast te worden naar !/usr/bin/env python3. Verder dient in rc_daemon.py de functie file() aangepast te worden naar open(). De functie file() is namelijk in python3 aangepast naar open(), blijkbaar zet de 2to3 tool dit niet automatisch om. Pas de volgende regels aan
72 si = open(self.stdin, 'r') 73 so = open(self.stdout, 'a+') 74 se = open(self.stderr, 'a+') 75 os.dup2(si.fileno(), sys.stdin.fileno()) 76 os.dup2(so.fileno(), sys.stdout.fileno()) 77 os.dup2(se.fileno(), sys.stderr.fileno()) 78 se.flush()
Let op, regel 78 is toegevoegd, dus bij het volgende stukje moet je één regel aftrekken
83 open(self.pidfile,'w+').write("%s\n" % pid) ... 113 pf = open(self.pidfile,'r') ... 129 open(self.pidfile,'w+').write("%s\n" % pid) ... 140 pf = open(self.pidfile,'r')
Tot slot liep ik nog tegen een bug in lirc aan die de file /usr/lib/python3/dist-packages/lirc/_client.so steeds liet verdwijnen. De manier om dit op te lossen staan prima beschreven op https://bugzilla.redhat.com/show_bug.cgi?id=1652992. Heb dit opgelost door lirc te deinstalleren, en daarna opnieuw te installeren. En daarna paths.py aangepast conform de suggestie van Brian J. Murrell
$ sudo vi /usr/lib/python3/dist-packages/lirc/paths.py
De file /usr/lib/python3/dist-packages/lirc/paths.py ziet er na de aanpassing als volgt uit
$ cat paths.py ''' Set up paths to components, including in-tree development. ''' import glob import sys import os.path HERE = os.path.abspath(os.path.dirname(__file__)) if HERE not in sys.path: sys.path.insert(0, HERE)
Na bovenstaande aanpassingen kon ik succesvol de irradiod daemon opstarten met
$ sudo systemctl restart irradiod $ sudo systemctl status irradiod ● irradiod.service - Radio remote control daemon Loaded: loaded (/lib/systemd/system/irradiod.service; enabled; vendor preset: enabled) Active: active (running) since Tue 2022-01-04 10:28:29 CET; 1s ago Main PID: 3714 (python3) Tasks: 1 (limit: 409) CPU: 598ms CGroup: /system.slice/irradiod.service └─3714 python3 /usr/share/radio/remote_control.py nodaemon
Maar dit pret was van korte duur, want even later kreeg ik de volgende foutmelding:
Jan 04 17:29:16 radio remote_control.py[15708]: module 'lirc' has no attribute 'init'
Dit klopt dus niet, lirc is voor Raspbian Jessie en eerder, voor Buster en Bullseye is pylirc2 nodig. Simpelweg sudo pip3 install pylirc2 uitvoeren werkte niet, gaf de foutmelding “pylircmodule.cpython-39-arm-linux-gnueabihf.so: undefined symbol: Py_InitModule”. Gelukkig vond ik een workarround op https://github.com/project-owner/Peppy.doc/wiki/Pylirc, in het kort
$ sudo apt-get install python3-dev $ sudo apt-get install liblircclient-dev cd $ wget https://files.pythonhosted.org/packages/a9/e1/a19ed9cac5353ec07294be7b1aefc8f89985987b356e916e2c39b5b03d9a/pylirc2-0.1.tar.gz $ tar xvf pylirc2-0.1.tar.gz $ cd pylirc2-0.1 $ rm pylircmodule.c $ wget https://raw.githubusercontent.com/project-owner/Peppy.doc/master/files/pylircmodule.c $ sudo python3 setup.py install $ sudo mv /usr/local/lib/python3.9/dist-packages/pylircmodule.cpython-39-arm-linux-gnueabihf.so /usr/local/lib/python3.9/dist-packages/pylirc.cpython-39-arm-linux-gnueabihf.so
Vervolgens nog een aanpassing in /usr/share/radio/remote_control.py, verander het path achter pylirc_module op regel 60 in ‘/usr/local/lib/python3.9/dist-packages/pylirc.cpython-39-arm-linux-gnueabihf.so’
$ sudo vi /usr/share/radio/remote_control.py
Dit komt er dan zo uit te zien
60 # pylirc_module='/usr/lib/python2.7/dist-packages/pylircmodule.so' 61 pylirc_module = '/usr/local/lib/python3.9/dist-packages/pylirc.cpython-39-arm-linux-gnueabihf.so'
Opstarten van de irradiod-daemon gaat daarna goed en geeft geen foutmeldingen meer
$ sudo systemctl start irradiod $ sudo systemctl status irradiod ● irradiod.service - Radio remote control daemon Loaded: loaded (/lib/systemd/system/irradiod.service; enabled; vendor preset: enabled) Active: active (running) since Tue 2022-01-04 17:30:09 CET; 11min ago Main PID: 15729 (python3) Tasks: 1 (limit: 409) CPU: 532ms CGroup: /system.slice/irradiod.service └─15729 python3 /usr/share/radio/remote_control.py nodaemon Jan 04 17:30:09 radio systemd[1]: Started Radio remote control daemon. Jan 04 17:30:11 radio remote_control.py[15737]: Protocols changed to unknown other lirc rc-5 rc-5-sz jvc s> Jan 04 17:30:11 radio remote_control.py[15737]: Loaded BPF protocol xbox-dvd
Nu testen of het werkt, stop de irradiod-daemon en start remote_control.py handmatig op
$ sudo systemctl stop irradiod $ sudo /usr/share/radio/remote_control.py nodaemon IR Remote control listener running pid 17027 Using pylirc module Protocols changed to unknown other lirc rc-5 rc-5-sz jvc sony nec sanyo mce_kbd rc-6 sharp xmp cec imon rc-mm Loaded BPF protocol xbox-dvd Listening for input on IR sensor KEY_VOLUMEUP KEY_VOLUMEDOWN KEY_CHANNELUP KEY_CHANNELDOWN KEY_MUTE KEY_MENU KEY_UP KEY_DOWN KEY_LEFT KEY_RIGHT KEY_OK KEY_EXIT ^C('\nStopping remote control pid', 17027) Killed $ sudo systemctl start irradiod
en zowaar het werkt ! In de volgende stap gaan we de led die aangeeft dat de afstandsbediening een signaal stuurt installeren en testen.
Stap 4. Led die ontvangst IR signaal weergeeft installeren en configureren
Eerst de proefopstelling uitbreiden met de rode led en een 100 Ohm weerstand. Dit conform onderstaande pinout
Raspberry Zero | Led | Toelichting |
GND | Cathode (-), korte poot | |
GPIO11 | Anode (+), lange poot | Sluit deze in serie aan met de 100 Ohm weerstand |
Om het softwarematig werkend te krijgen is een aanpassing van de file /usr/share/radio/radiod.conf nodig, de waarde van parameter “remote_led” op regel 65 dient op 11 (GPIO11) gezet te worden
$ sudo vi /usr/share/radio/radiod.conf
dit deel van radiod.conf komt er dan als volgt uit te zien
60 # Output LED for remote control, default GPIO 11 (pin 23) or 61 # GPIO 13 (pin 33) for AdaFruit plate or PiFace CAD (40 pin RPi needed) 62 # Use GPIO 16 (pin 36) for designs using IQAudIO DAC cards etc. 63 # Use GPIO 14 (pin 8) for designs using IQAudIO Cosmic controller 64 # remote_led=0 is no output LED 65 remote_led=11 66
Sla de file op en test de werking met
$ sudo ./remote_control.py flash
Herstart de radiod- en irradiod-daemons om de werking in combinatie met de afstandsbediening te testen
$ sudo systemctl restart irradiod radiod
Stap 6. Bluetooth speaker koppelen
Dat was nog een hele uitdaging, want zowel ‘bluealsa’ alsook de bibliotheek waar bluealsa van afhankelijk is ‘libfdk-aac-dev’ zijn niet beschikbaar als raspbian bullseye package. Gelukkig is de libfdk-aac-dev bibliotheek wel beschikbaar binnen de debian bullseye packages. Dus als eerste alle bibliotheken die wel beschikbaar zijn binnen de Raspbian Bullseye repository geinstalleerd.
$ sudo apt-get install autoconf libtool libasound2-dev libbluetooth-dev libdbus-glib-1-dev libsbc-dev
Daarna voor installeren van de libfdk-aac-dev bibliotheek de repository van Debian Bullseye toegevoegd aan de apt sources, de bibliotheek lijst van apt-get bijgewerkt en de bijbehorende keyring toegevoegd. Daarna kon ik succesvol de bibliotheek libfdk-aac-dev installeren
$ sudo echo 'deb http://www.deb-multimedia.org bullseye main' >> /etc/apt/sources.list $ sudo apt-get update -oAcquire::AllowInsecureRepositories=true $ sudo apt-get install deb-multimedia-keyring $ sudo apt-get install libfdk-aac-dev
Zoals al genoemd, bluealsa is niet vanuit een repository te installeren, dus deze van github gedownload en gecompileerd
$ cd $ git clone https://github.com/Poco-Ye/bluez-alsa.git $ cd bluez-alsa $ sudo autoreconf --install $ mkdir build && cd build $ ../configure --enable-aac --enable-debug $ sudo make && sudo make install
Helaas zorgt deze installatieprocedure er niet voor dat de bluealsa service wordt aangemaakt, dus deze dient zelf gemaakt te worden
$ sudo vi /lib/systemd/system/bluealsa.service
Voeg onderstaande toe aan deze file en sla hem op
[Unit] Description=BluezALSA proxy Requires=bluetooth.service After=bluetooth.service [Service] Type=simple User=root ExecStart=/usr/bin/bluealsa -p a2dp-sink -p a2dp-source pi@radio:/usr/share/sounds/alsa $
Enable de service en start hem op
$ sudo systemctl enable bluealsa $ sudo systemctl start bluealsa
Nu kunnen we de bluetooth speaker koppelen met bluetoothctl
$ sudo bluetoothctl
Agent registered
[bluetooth]#
set de bluetooth speaker in de pairing stand en laat de Raspberry Zero naar bluetooth devices scannen met
[bluetooth]# scan on Discovery started [CHG] Controller B8:27:EB:D8:24:3F Discovering: yes [NEW] Device 00:A0:50:93:4B:E0 HwZ_fb1449f749000b2f20 [NEW] Device ED:7E:5A:8E:0C:9F N038L [NEW] Device DC:BC:5B:3D:7D:10 N005J [NEW] Device 9C:30:5B:4F:1F:04 Woonkamer-TV [NEW] Device 3C:A3:08:B2:E5:FB Speaker fitnessruimte
Je ziet mijn Bose soundtouch, met naam “Speaker fitnessruimte” als nieuw bluetooth apparaat verschijnen, pair dit apparaat met het mac-address ( in mijn geval 3C:A3:08:B2:E5:FB ) van de speaker
[bluetooth]# pair 3C:A3:08:B2:E5:FB Attempting to pair with 3C:A3:08:B2:E5:FB [CHG] Device 3C:A3:08:B2:E5:FB Connected: yes [CHG] Device 3C:A3:08:B2:E5:FB Connected: yes [CHG] Device 3C:A3:08:B2:E5:FB Modalias: bluetooth:v009Ep0801d4014 [CHG] Device 3C:A3:08:B2:E5:FB UUIDs: 0000110b-0000-1000-8000-00805f9b34fb [CHG] Device 3C:A3:08:B2:E5:FB UUIDs: 0000110c-0000-1000-8000-00805f9b34fb [CHG] Device 3C:A3:08:B2:E5:FB UUIDs: 0000110e-0000-1000-8000-00805f9b34fb [CHG] Device 3C:A3:08:B2:E5:FB UUIDs: 00001200-0000-1000-8000-00805f9b34fb [CHG] Device 3C:A3:08:B2:E5:FB ServicesResolved: yes [CHG] Device 3C:A3:08:B2:E5:FB Paired: yes Pairing successful
de speaker is nu gepaired met de Raspberry Zero, maar moet nu nog geconnect en getrust worden met
[Speaker fitnessruimte]# connect 3C:A3:08:B2:E5:FB Attempting to connect to 3C:A3:08:B2:E5:FB Connection successful [Speaker fitnessruimte]# trust 3C:A3:08:B2:E5:FB [CHG] Device 3C:A3:08:B2:E5:FB Trusted: yes Changing 3C:A3:08:B2:E5:FB trust succeeded [Speaker fitnessruimte]# exit
Je kunt nu het volume instellen met
alsamixer -D bluealsa

Door met de muis op de rood-wit-groene balk te klikken kun je het volume instellen. Een proefbestand afspelen kun je met
aplay -D bluealsa /usr/share/sounds/alsa /Front_Center.wav
Stel nu de audio settings van de radio opnieuw in met
$ sudo /usr/share/radio/configure_audio.sh
en kies voor optie 13 “Bluetooth device” en druk op “<Ok>” en “<Yes>”

Start de radio daarna opnieuw op. En test of de radio het geluid afspeelt via de bluetooth speaker zodra de Raspberry Zero opnieuw is opgestart
Stap 8. Radio configureren als bluetooth speaker
Ja je leest het goed, andersom kan natuurlijk ook. Als de radio straks uitgerust wordt met een paar stevige speakers dan is het ook heel handig om de radio te kunnen gebruiken als bluetooth speaker voor je telefoon of tablet. Dit configureren we als volgt. Zorg er eerst voor dat je Raspberry Zero bluetooth verbinding te vinden is door andere devices, dit doe je met
pi@radio:~ $ bluetoothctl Agent registered [bluetooth]# discoverable on [CHG] Controller B8:27:EB:D8:24:3F Discoverable: yes
Pak nu je telefoon of tablet erbij. In mijn geval gebruik ik een Oneplus 5T android telefoon. Klik op het bluetooth icoontje van je telefoon en klik op “+ Apparaat koppelen”

Het duurt soms even voor dat je radio zichtbaar wordt, even geduld dus, hij verschijnt vanzelf

En daar is hij al, klik op radio en de telefoon probeert te koppelen aan de radio, als de bluetooth-koppelcode getoond wordt, krijg je ook een melding op de desktop van de Raspberry Zero
Op je desktop

Klik op je desktop op “OK” en op je telefoon op “Koppelen”, in je terminal window zie je dat de telefoon gekoppeld wordt
pi@radio:~ $ bluetoothctl Agent registered [CHG] Device 94:65:2D:41:23:0F Connected: no [DEL] Device 94:65:2D:41:23:0F OnePlus 5T [NEW] Device 94:65:2D:41:23:0F OnePlus 5T [CHG] Device 94:65:2D:41:23:0F Modalias: bluetooth:v001Dp1200d1436 [CHG] Device 94:65:2D:41:23:0F UUIDs: 00001103-0000-1000-8000-00805f9b34fb [CHG] Device 94:65:2D:41:23:0F UUIDs: 00001105-0000-1000-8000-00805f9b34fb [CHG] Device 94:65:2D:41:23:0F UUIDs: 0000110a-0000-1000-8000-00805f9b34fb [CHG] Device 94:65:2D:41:23:0F UUIDs: 0000110c-0000-1000-8000-00805f9b34fb [CHG] Device 94:65:2D:41:23:0F UUIDs: 0000110e-0000-1000-8000-00805f9b34fb [CHG] Device 94:65:2D:41:23:0F UUIDs: 00001112-0000-1000-8000-00805f9b34fb [CHG] Device 94:65:2D:41:23:0F UUIDs: 00001115-0000-1000-8000-00805f9b34fb [CHG] Device 94:65:2D:41:23:0F UUIDs: 00001116-0000-1000-8000-00805f9b34fb [CHG] Device 94:65:2D:41:23:0F UUIDs: 0000111f-0000-1000-8000-00805f9b34fb [CHG] Device 94:65:2D:41:23:0F UUIDs: 0000112d-0000-1000-8000-00805f9b34fb [CHG] Device 94:65:2D:41:23:0F UUIDs: 0000112f-0000-1000-8000-00805f9b34fb [CHG] Device 94:65:2D:41:23:0F UUIDs: 00001132-0000-1000-8000-00805f9b34fb [CHG] Device 94:65:2D:41:23:0F UUIDs: 00001200-0000-1000-8000-00805f9b34fb [CHG] Device 94:65:2D:41:23:0F UUIDs: 00001800-0000-1000-8000-00805f9b34fb [CHG] Device 94:65:2D:41:23:0F UUIDs: 00001801-0000-1000-8000-00805f9b34fb [CHG] Device 94:65:2D:41:23:0F UUIDs: fafbdd20-83f0-4389-addf-917ac9dae5b2 [CHG] Device 94:65:2D:41:23:0F ServicesResolved: yes [CHG] Device 94:65:2D:41:23:0F Paired: yes [CHG] Device 94:65:2D:41:23:0F UUIDs: 00001103-0000-1000-8000-00805f9b34fb [CHG] Device 94:65:2D:41:23:0F UUIDs: 00001105-0000-1000-8000-00805f9b34fb [CHG] Device 94:65:2D:41:23:0F UUIDs: 0000110a-0000-1000-8000-00805f9b34fb [CHG] Device 94:65:2D:41:23:0F UUIDs: 0000110c-0000-1000-8000-00805f9b34fb [CHG] Device 94:65:2D:41:23:0F UUIDs: 0000110d-0000-1000-8000-00805f9b34fb [CHG] Device 94:65:2D:41:23:0F UUIDs: 0000110e-0000-1000-8000-00805f9b34fb [CHG] Device 94:65:2D:41:23:0F UUIDs: 00001112-0000-1000-8000-00805f9b34fb [CHG] Device 94:65:2D:41:23:0F UUIDs: 00001115-0000-1000-8000-00805f9b34fb [CHG] Device 94:65:2D:41:23:0F UUIDs: 00001116-0000-1000-8000-00805f9b34fb [CHG] Device 94:65:2D:41:23:0F UUIDs: 0000111f-0000-1000-8000-00805f9b34fb [CHG] Device 94:65:2D:41:23:0F UUIDs: 0000112d-0000-1000-8000-00805f9b34fb [CHG] Device 94:65:2D:41:23:0F UUIDs: 0000112f-0000-1000-8000-00805f9b34fb [CHG] Device 94:65:2D:41:23:0F UUIDs: 00001132-0000-1000-8000-00805f9b34fb [CHG] Device 94:65:2D:41:23:0F UUIDs: 00001200-0000-1000-8000-00805f9b34fb [CHG] Device 94:65:2D:41:23:0F UUIDs: 00001800-0000-1000-8000-00805f9b34fb [CHG] Device 94:65:2D:41:23:0F UUIDs: 00001801-0000-1000-8000-00805f9b34fb [CHG] Device 94:65:2D:41:23:0F UUIDs: fafbdd20-83f0-4389-addf-917ac9dae5b2 [CHG] Device 94:65:2D:41:23:0F ServicesResolved: no [CHG] Device 94:65:2D:41:23:0F Connected: no
Connect en trust nu de radio en de telefoon met
[bluetooth]# connect 94:65:2D:41:23:0F [CHG] Device 94:65:2D:41:23:0F Connected: yes [OnePlus 5T]# trust 94:65:2D:41:23:0F [CHG] Device 94:65:2D:41:23:0F Trusted: yes Changing 94:65:2D:41:23:0F trust succeeded [OnePlus 5T]# exit
En je telefoon en radio zijn gekoppeld

Stel de radio bluetooth connectie nog even in door achter “radio” op het instellingen icoontje te klikken, en “HD-audio” en “Media-audio” op aan te zetten

Test het uit door bijvoorbeeld een Youtube filmpje te openen (als je even een van de volumeknoppen indrukt zie je dat de media-uitvoer naar bluetooth staat ingesteld), en als alles goed is gegaan hoor je prachtige klanken uit je radio “bluetooth speaker” komen

Stap 7. Airplay installeren en configureren
Om Airplay ondersteuning te installeren start je de configuratie wizard install_airplay.sh
$ sudo /usr/share/radio/install_airplay.sh
De Raspberry Zero staat flink te stampen om alle software componenten te installeren. Vervolgens activeren we de airplay ondersteuning in de radio. Zet hiervoor de parameter airplay op regel 290 op yes
$ sudo vi /usr/share/radio/radiod.conf
dit deel van de configuratiefile ziet er dan als volgt uit
287 [AIRPLAY] 288 289 # Airplay activation yes or no 290 airplay=yes 291 292 # Mixer preset volume for radio and media player if using sound card 293 # Set to 0 if using onboard audio or USB sound dongle. 294 # If using a sound card set to 100% initially and adjust as neccessary 295 # Old name was mixer_volume 296 mixer_preset=100 297
Vervolgens dien je de parameter mixer_volume_id nog van de juiste waarde te voorzien, deze kun je achterhalen met
$ amixer -D sysdefault controls | grep -i volume numid=5,iface=MIXER,name='PCM Playback Volume'
en stel je de waarde van de parameter mixer_volume_id met de waarde 5 in in /usr/share/radio/radiod.conf, dat ziet er dan zo uit (let op, dit deel kan ontbreken in je configuratiefile, voeg dit dan compleet onderin toe)
# Mixer volume ID (Airplay) Use command 'amixer controls | grep -i volume' # to identify mixer volume control ID mixer_volume_id=5
Tot slot zorgen we ervoor dat de ook shairport-sync de default soundcard “sysdefault” gebruikt. Hiervoor openen we de file /etc/shairport-sync.conf, en zoeken naar de parameter group “alsa” onder “// Back End Settings”
$ sudo vi /etc/shairport-sync.conf
Haal het //-teken weg voor output_device en verander “default” in “sysdefault”, dit gedeelte van de configuratiefile ziet er dan als volgt uit
// Back End Settings // These are parameters for the "alsa" audio back end. // For this section to be operative, Shairport Sync must be built with the following configuration flag: // --with-alsa alsa = { output_device = "sysdefault"; // the name of the alsa output device. Use "shairport-sync -h" to discover the names of ALSA hardware devices. Use "alsamixer" or "aplay" to find out the names of devices, mixers, etc. // mixer_control_name = "PCM"; // the name of the mixer to use to adjust output volume. If not specified, volume in adjusted in software.
Zorg dat de airplay ondersteuning automatisch op wordt gestart, en reboot
$ sudo systemctl enable shairport-sync $ sudo systemctl start shairport-sync $ sudo reboot
Pak nu een IOS device erbij en connect via Airplay met de radio. Open het bedieningspaneel op je IOS device (Hoe dat voor jou device werkt kun je naslaan op https://support.apple.com/nl-nl/HT202809), en klik op het Airplay icoon rechtsboven.

Er volgt nu een overzicht van beschikbare airplay apparaten, radio staat daar al tussen, klik die aan en het IOS device maakt verbinding met de radio
Kies nu je favoriete muziek app, bijvoorbeeld Google play, en start audio streaming naar de radio

Stap 8. Webpagina installeren
Altijd handig om als je op afstand van de radio met je laptop zit te werken, en je geen zin hebt om op te staan om de afstandsbediening te pakken of aan de knoppen te draaien, dat je de radio via een webpagina kunnen bedienen. Hiervoor installeren we eerst Apache2 inclusief wat bibliotheken
$ sudo apt-get install apache2 php libapache2-mod-php
En daar Bob Rathbone’s webpagina’s voor radio
$ cd $ wget http://www.bobrathbone.com/raspberrypi/packages/radiodweb_1.9_armhf.deb $ sudo dpkg -i radiodweb_1.9_armhf.deb $ echo 'ServerName radio' >> /etc/apache2/apache2.conf $ sudo systemctl reload apache2
En ta da, je webinterface is klaar

Stap 9. Spotify connect installeren en configureren
Installeer spotify connect met
$ cd $ curl -sL https://dtcooper.github.io/raspotify/install.sh | sh
Open de file /lib/systemd/system/raspotify.service en commentarieer de parameters “Restart” en “RestartSec” uit, voeg tevens achter de parameter “ExecStart=/usr/bin/librespot” de optie “–device=sysdefault:vc4hdmi”
$ sudo vi /lib/systemd/system/raspotify.service
Na die aanpassing ziet de file er als volgt uit
[Unit] Description=Raspotify (Spotify Connect Client) Documentation=https://github.com/dtcooper/raspotify Documentation=https://github.com/librespot-org/librespot Documentation=https://github.com/dtcooper/raspotify/wiki Documentation=https://github.com/librespot-org/librespot/wiki/Options Wants=network.target sound.target After=network.target sound.target [Service] DynamicUser=yes SupplementaryGroups=audio # Restart=always # RestartSec=10 # Some of these may be implied by DynamicUser=yes RestrictRealtime=true RestrictSUIDSGID=true RestrictNamespaces=true RestrictAddressFamilies=AF_UNIX AF_INET AF_INET6 AF_NETLINK ProtectHostname=true ProtectControlGroups=true ProtectKernelLogs=true ProtectKernelModules=true ProtectKernelTunables=true ProtectProc=invisible ProtectHome=true ProtectSystem=strict ProtectClock=yes DevicePolicy=strict DeviceAllow=char-alsa rw DeviceAllow=/dev/null r DeviceAllow=/dev/random r DeviceAllow=/dev/urandom r UMask=077 CacheDirectoryMode=0700 CacheDirectory=%N StateDirectoryMode=0700 StateDirectory=%N ConfigurationDirectoryMode=0600 ConfigurationDirectory=%N PrivateTmp=true PrivateUsers=true ProcSubset=pid NoNewPrivileges=true PermissionsStartOnly=true LockPersonality=true MemoryDenyWriteExecute=true RemoveIPC=true CapabilityBoundingSet= #SystemCallArchitectures=native SystemCallFilter=@system-service SystemCallFilter=~@privileged @resources SystemCallErrorNumber=EPERM Environment=LIBRESPOT_NAME="%N (%H)" Environment=LIBRESPOT_CACHE=%C/%N Environment=LIBRESPOT_SYSTEM_CACHE=%S/%N EnvironmentFile=-%E/%N/conf ExecStart=/usr/bin/librespot --device=sysdefault:vc4hdmi [Install] WantedBy=multi-user.target
Reload de system deamon’s, en start de raspotify daemon opnieuw op
$ sudo systemctl daemon-reload $ sudo systemctl restart raspotify
Stap 10. Backup maken
Het gros van het installatie en configuratie werk is nu gedaan. Tijd om een backup te maken. Ik gebruik hiervoor het programma USB Image tool 1.7.0, dit tooltje kun je van verschillende websites downloaden, onder andere hier https://usb-image-tool.en.uptodown.com/windows/download
Sluit je radio af met
sudo shutdown now
Haal het SD-kaartje uit je Raspberry Zero en plaatst hem in de SD-kaartlezer van je laptop/desktop. Start USB Image tool, en klik op je SD kaart. In mijn geval SDXC Card (D:\)

Klik vervolgens op “Backup” rechts onderin. Geef de backup een plaats op je harde schijf en een zinvolle naam, en klik op “Opslaan”

Er wordt nu een bijna 1-op1 kopie van je SD-Card gemaakt, zorg ervoor dat je dus genoeg ruimte op je harde schijf hebt

Je kunt echter de img file nog comprimeren door hem te zippen. Dus zodra de USB image tool klaar is met het maken van de image file, sluit je de tool af. Open de verkenner en navigeer naar de plaats waar je de image file hebt opgeslagen. Klik met je rechter muisknop op de image file, en kies voor “Comprimeren naar ZIP-bestand

De 32Gb (in mijn geval) wordt nu teruggebracht naar een meer behapbare 1.7Gb. Ik upload deze zip-file vervolgens naar Google Drive, maar je kunt hem natuurlijk ook naar een USB thumbdrive of externe harde schijf kopieren en buiten je woning bewaren.
Je kunt nu de SD-card veilig verwijderen uit je laptop/desktop, en hem terugplaatsen in je Raspberry Zero.
Het software matige deel is nu klaar, we gaan nu letterlijk onze handen vuil maken met het aanpassen van de vintage radio zodat al die mooie nieuwe electronica er in gaat passen.
Stap 11. Philips radio uit elkaar halen
Om ruimte te maken voor de moderne electronica moet de oude buizenradio verwijderd worden uit zijn behuizing. Dit is een precair klusje, want ik wil koste wat kost de knoppen kunnen hergebruiken, en buitenkant van de radio mag natuurlijk niet beschadigd worden. Eerst draai ik de 7 schroeven van het achterpaneel los gedraaid en het achterpaneel verwijderd
Daarna de radio een kwart slag gedraaid, met de voorkant op de werkbank, en de 4 schroeven (3 schroeven in mijn geval, een ontbrak al) van het onderpaneel losgedraaid en het onderpaneel verwijderd.
Vervolgens de 4 knoppen aan de voorkant voorzichtig losgetrokken, dit ging gelukkig verrassend soepel.
Wederom de radio met de voorkant op de werkbank geplaatst en de 4 schroeven waarmee de binnenkant van de radio vast zit aan de behuizing losgedraaid, daarna voorzichtig de radio een stukje uit zijn behuizing gehaald.
De luidspreker zit nog aan de radio vast, die met een kniptang losgeknipt
Daarna kon ik de radio volledig losmaken van zijn behuizing. Als laatste de luidspreker losgemaakt van het frontpaneel door de 3 schroeven met klemmen los te draaien
Uiteraard komt er 60 jaar aan stof vrij uit de binnenkant van radio, daarom eerst maar eens een natte doek door de binnenkant gehaald, en ook de buitenkant voorzichtig afgesopt

Op de bodem van de radio ga ik een metalen plaat monteren waarop ik vervolgens alle electronica, zoals de Raspberry Zero, transformator, DAC, versterker en PCB op vastzet. Van een vorig project heb ik een deel van de metalen behuizing van een thinclient PC nog liggen, deze maak ik in de volgende stap op maat.
Stap 12. Nieuwe basis voor het binnenwerk maken
Ben eerst gestart met het maken van een CAD tekening van het frontpaneel van het nieuwe binnenwerk, dit om exact de posities van de rotary encoders en switch te bepalen, maar ook om de poulies van de zenderaanwijzer op de juiste plek terug te kunnen monteren. In feite maak ik zo’n soort van boormal voor het frontpaneel.
Eerst alle maten overgenomen m.b.v. een meetlint en digitale schuifmaat.

Hier mijn CAD ontwerpen
De tekeningen zijn in CAD en PDF formaat te downloaden
File | Download |
FreeCad tekening Frontpaneel buizenradio | https://drive.google.com/file/d/1NoOT6KCy5qTouuTfLhOYngYP900Y7Wca/view?usp=sharing |
PDF file van Frontpaneel buizenradio | https://drive.google.com/file/d/1ZHLX0weAiR-EoI_E64aQpjCQdNOecB3J/view?usp=sharing |
Vervolgens het ik de CAD tekeningen uitgeprint, met de papiersnijder en schaar bijgesneden en met papierlijm aan elkaar bevestigd.
In de schuur vond ik een oud TL-armatuur. Het metalen deksel had de perfecte afmetingen, vorm en dikte voor het frontpaneel.
Vervolgens met een prikpen in het midden van de gaatjes in de boormal een perforatie aangebracht. De boormal daarna met plakband op het op maat gemaakte frontpaneel geplakt en met een viltstift het middenpunt van de gaatjes overgenomen van de boormal op het frontpaneel.

Met de boormachine alle gaatjes in het frontpaneel geboord. Dan is de onderplaat aan de beurt. Hiervoor gebruik ik de behuizing van een sloop thin cliënt PC. Ook hiervan komen de vorm, maten en dikte overeen met wat ik nodig heb. Met de flex maak ik hem op maat.
Aan de zijkanten bevestig ik met popnagels een paar op maat gemaakte hoekijzers.
Hier bevestig ik vervolgens met popnagels het frontpaneel

En pas het geheel in de behuizing van de radio
De gaten voor de Rotary encoders en switch komen exact overeen met de gaten van de behuizing van de radio. Alleen van de lengte van het onderpaneel moet nog iets af om het passend te krijgen, maar dat doe ik later wanneer de constructie van de aanwijzer er op zit, en de afstand tot de binnenkant van de voorkant van de radio exact bekend is. Maar voordat ik daar aan begin maak ik eerst nog een ontwerp voor het plaatsen van de electronica op de onderplaat. Aanname is dat deze ongeveer 28 bij 12 cm wordt. Eerst de maten van de verschillende componenten uit de respectievelijke datasheets gehaald.
Raspberry Zero 2W TPA3110 Digitale Power Audio Versterker Board Transformator
Daarna op basis hiervan een CAD tekening gemaakt die wederom als boormal kan fungeren.

Ook deze is uiteraard weer te downloaden
File | Download |
Onderpaneel radio CAD file | https://drive.google.com/file/d/1TXkJWP6N7Au9GwSiuiBbn3Gf0TNEOaLs/view?usp=sharing |
Onderpaneel radio PDF file | https://drive.google.com/file/d/1HKt2X2_1RxbijZ6xwXEXAD0TKvZuEls7/view?usp=sharing |
Ook hier weer dezelfde procedure. Tekening op maat snijden met papiersnijder, en met plakband op onderpaneel vastzetten. Daarna met boormachine de gaatjes (4mm) boren.
Stap 13. Zenderaanwijzer monteren op metalen binnenwerk
Zoals al in de vorige stap beschreven staat wil ik de zenderaanwijzer werkend zien te krijgen in de nieuwe opzet. Mijn plan is om de radio software van bob uit te breiden met een preset-channel functie, bijv. met 8 of 12 preset-channels. De zenderaanwijzer wordt dan verbonden met de schacht van de rotary switch waarmee je de preset-channel kunt selecteren. Je kunt dan door de preset-channels “bladeren” terwijl je ook de zenderaanwijzer ziet bewegen, met een druk op de rotary switch selecteer je dan de preset-channel. Als eerste stap in deze functionaliteit de montage van de “oude” poelies en draad met aanwijzer op het nieuwe metalen binnenwerk. Onderstaand een foto van de montage van de verschillende onderdelen op de oude buizenradio, dit ter referentie

De compenten die ik overneem zijn:
- Links de poulie met bevestigingsbeugel
- Rechts de geleide poulie met bevestigingsbeugel
- Rechts de grote poelie met bevestigingspaneel
- Rechtsonder de schachthouder van de zenderkeuze
- Draad met veer
Helaas brak de draad tijdens het demonteren van de onderdelen, dus die moet ik vervangen. Onderstaand de gedemonteerde onderdelen

Vervolgens deze onderdelen vastgeschroefd op het frontpaneel

Voor testdoeleinden heb ik even de oude schacht van de zenderkeuze gebruikt, deze wordt later vervangen door een rotary switch met push-button. In mijn viskoffer vond ik een stevige gevlochten draad en twee wartels ter vervanging van de gebroken draad. Voor het kunnen bevestigen van de verschillende onderdelen heb ik nog wat kleine inkepingen moeten flexen/vijlen en gaatjes moeten boren, maar het voert te ver om deze hier ook allemaal te gaan beschrijven. De opstelling uiteraard ook getest met bevestigde zenderaanwijzer in de radio, en dit werkt allemaal naar behoren.
Nu kan ook de definitieve lengte van het onderpaneel bepaald worden, en het onderpaneel op maat gemaakt worden. De definitieve maten van het onderpaneel komen uit op 280 x 105 mm. Dit intussen in een aangepaste CAD tekening opgenomen zoals beschreven in de vorige stap.
Stap 14. <het wachten is op de bestelde elektronica componenten>