Raspberry Pi Internet Radio

Eerste project met een add-on UI print

Je bent radioman of niet. Dus het eerste project met wat meer voeten in de aarde zou hebben moest een internet radio ‘ontvanger’ worden met display en schakelaars. Hiermee kan je hem immers ook stand alone gebruiken. Dus zonder beeldscherm, keyboard of externe pc via SSH of VNC.

Nou ik kan jullie meedelen, het is gelukt!

Al vrij snel kwam ik met googlen BitWizard tegen. Deze hobby-isten club (trouwens ook radioamateurs) heeft hele handige, leuke en prijsgunstige producten voor je op de plank liggen, waaronder een SPi User Interface opsteek print. Deze unit heeft dezelfde afmetingen als de Raspberry Pi en ik heb hem voorlopig met een extra 26 pin long header door de behuizing heen gemonteerd.

De UI print heeft een HD44780 compatble 2 x 16 karaters display en 6 schakelaars. Verder zijn alle RPi in en output lijnen beschikbaar op de print. Vandaar de uitstekende printheaders (kunnen we er altijd nog afknippen als we ze niet gaan gebruiken).

Overigens, je moet wel een beetje ‘nerd’ zijn om de boel aan de gang te krijgen. Er is wel documentatie beschikbaar, maar je moet de nodige handelingen verrichten om de kaart door de RPi te laten herkennen. Vervolgens moet je git installeren ($ apt-get install git) en daarna bw_tool.

Nu een paar zaken waar ik tegenaan liep:

  • In eerste instantie kon ik de kaart in het geheel niet bereiken. Het viel me op dat het display niet mooi de karakters weergaf. De oorzaak bleek uiteindelijk de voedingspanning te zijn. Je moet er echt op letten om een goede USB<->micro kabel te gebruiken en dat de 5 volt ‘USB’ voeding voldiende stroom kan leveren. Ik gebruik nu een ‘auto-sigaretten-aansteker-adapter’ waar 2A op staat die in mijn station voeding van 10A is aangesloten.
  • Er zijn voorbeelden op internet te vinden die niet werken! Dit komt door een klein verschil op de GPIO bus van de RPi tusen versie 1 en 2 waardoor de adressen (nummer) veranderd zijn.
  • De aangemaakt /dev devices verlenen geen rw (read write) rechten aan all. Hierdoor moet je alle bw_tool command’s met sudo beginnen. (of $ sudo chmod a+rw /dev/spi*)
  • De SPI_UI device naam is niet /dev/I2C-0 en /dev/I2C-1 maar /dev/spidev0.0 en /dev/spidev0.1. Hierdoor werd ik door de diverse voorbeelden ook behoorlijk op het verkeerde been gezet.
  • Mijn SPI_ rpi_ui 1.3 start op met de tekst A: 94 op de tweede lijn. Dit is dus het adres van het board / display en niet 82 zoals in veel voorbeelden.

Goed dit wetende kon ik teksten op het display krijgen en vervolgens ook de schakelaars uitlezen. Nu dus op naar een eerste aanzet voor een bedienbare internetradio.

Ik had al een radio script. Dit script wert samen met de xmms2 player. Het installatiescript vind je hier  (www.dronkert.net/misc/radio.html).  Volg de instructies en je kunt al aan de slag met ontvangst.

Ik heb hierna het script aangepast om de zenderinformatie op het SPI schermpje te plaatsen. De code van het script radio ziet er dan als volgt uit:

else
		if [ -f $DBFILE ]; then
			curstation=$(cat $DBFILE | grep --colour=never -m 1 -F "$curstream" | grep --colour=never -oP '^\S+')
			# added lookup real name in DBFILE (pa3ang)
			curname=$(cat $DBFILE | grep --colour=never -A 1 "$curstream" | tail -n 1)
			if [ -z "$curstation" ]; then
				curstation="(station not found)"
			fi
		else
			curstation="(station database not found at \"$DBFILE\")"
		fi
	fi

	echo
	if [ ! -z "$curstation" ]; then
               echo -n "   Select  : "
               echo $curstation
 		echo -n "   Station : "
		echo $curname
	fi
	if [ ! -z "$curstream" ]; then
		echo -n "   Stream  : "
		echo $curstream
	fi
	if [ ! -z "$curvolume" ]; then
		echo -n "   Volume  : "
		echo $curvolume
	fi
	echo

        # Info on SPI display
  	sudo bw_tool -a 94 -C
	# Display lines
	# Goto Pos 0 on Line1
  	sudo bw_tool -a 94 -r 17 -v 0
  	sudo bw_tool -a 94 -t $curname
	# Goto Pos 0 on Line 2
  	sudo bw_tool -a 94 -r 17 -v 32
  	sudo bw_tool -a 94 -t "RPi inet radio"

	exit $ERR_OK

Er zijn nog wel wat meer aanpassingen. De source zal ook nog wel wijzigen. Je kunt hem hier downloaden.

Ook moet de file .radiodb aangepast worden en wel op elke 2e regel moet de ‘echte’ en toonbare naam van het station ingevoerd worden.

10gold  	http://82.201.100.23/Radio10Gold
Radio 10 Gold
pi1utr-rr      	http://relay.radioreference.com:80/401514669
PI1UTR - DCS007B

Ja en toen nog een bediening. Toevallig was zoonlief even thuis. Ja de ‘nerd’ die de meest ingewikkelde problemen weet op te lossen. Hij heeft een python script voor me geschreven, waarmee ik niet alleen een eenvoudig script heb wat ik verder uit kan breiden, maar ook een start kan maken met Python, de bij de Raspberry Pi ‘meegeleverde’ programmeertaal.

Het programaatje inetradio.py ziet er als volgt uit:

from subprocess import *
from time import sleep

print "\nRPi inet radio with BitWizard RPi UI board.\n"
call(["/usr/local/bin/radio", "on"])
sleep(1)
call(["/usr/local/bin/radio"])
bank = 1

channel = {
	"00001010": "bnr",
	"00000808": "radio2",
	"00000404": "10gold",
	"00000202": "radio4",
	"00000101": "sky",
	"00003030": "pi1utr-rr",
	"00002828": "pi3utr-rr",
	"00002424": "pi2rtd",
	"00002222": "rx320a"
}
delay = 0
quit = 0
counter = 0
while not quit:
	output = Popen(["/usr/bin/bw_tool", "-a", "94", "-R", "30:i"], stdout=PIPE).communicate()[0].strip()
	if output == "00002121":
		call(["/usr/local/bin/radio", "off"])
		quit = 1
	if output in channel:
		call(["/usr/local/bin/radio", channel[output]])
		sleep(1)
		call(["/usr/local/bin/radio"])
		counter = 0
		delay = 0
	if output == "00002020":
		delay = delay +1
	if delay == 100:
		call(["/usr/local/bin/radio"])
		delay = 0
	if counter == 1000:
		call(["/usr/local/bin/radio"])
	counter = counter + 1

Ook dit programma zal nog sterk gaan veranderen. De sourcecode kun je hier ophalen.

De werking is als volgt:

  1. Bij het starten van inetradio.py wordt de ontvanger aangezet en start hij op het laatst afgestemde station, tenzij het een koude (reboot) start is.
  2. De bediening van de schakelaars is als volgt:
    • schakelaar 1 – shift en bij 2 seconden wordt het display gerefreshed
    • schakelaar 2 – preset 1 en preset 6 bij shift gelijktijdig indrukken
    • schakelaar 3 – preset 2 en preset 7
    • schakelaar 4 – preset 3 en preset 8
    • schakelaar 5 – preset 4 en preset 9
    • schakelaar 6 – preset 5
  3. Toets 1 en toets 6 gelijktijdig is radio uit en bij radio uit, gaat hij weer aan!
  4. Als je ‘handmatig’ van station wisselt met pi@raspberrypi ~ $  radio “zender” dan kun je door een display refresh (2 sec. schakelaar 1) de stationsnaam in beeld krijgen.

LET OP : De juiste stationsnaam komt alleen in beeld als de stream gevonden en gestart kan worden!

Als de radio uit staat (maar het inetradio programma draait wel) dan heb je de volgende functies:

  • schakelaar 2 – datum en tijd
  • schakelaar 3 -
  • schakelaar 4 -
  • schakelaar 5 -
  • schakelaar 6 – inetradio.py programma wordt definitief gestopt

Het geheel draait dus gewoon met Raspbian “wheezy” op een type B versie 2 board. Zoals gezegd zal de programmatuur nog verder verbeteren. Ook is de .radiodb file door mij aangepast.  Voor de goede order, volg de instructies op de hierboven gelinkte sites. Aanvullende source code welke door mij geschreven is / wordt staat hieronder. Misschien wordt het nog wat en komt er gewoon een automatische install van het geheel.

bash script radio
http://pa3ang.nl/rpi/radio

Python programma  inetradio.py
http://pa3ang.nl/rpi/inetradio.py

database met stations .radiodb
http://pa3ang.nl/rpi/.radiodb

suc6, PA3ANG

 

UPDATE  (2 april 2013)

Nu ook mobiel via een WiFi link en draaiend op een Type A board. Dus minder stroomverbruik door de RPi zelf waardoor power overblijft voor het UI boardje. Nu nog een goede 5 volt accu eraan en je hebt een echte portable internetradio.

Ps: Het blijkt dat deze nano WiFi dongles niet stabiel zijn in de hoge 2,4GHz kanalen. Ik heb omgeschakeld van kanaal 13 naar kanaal 2 en nu werkt het lekker stabiel en ook redelijk goed daar waar de veldsterkte laag is. De WiFi start tijdens het booten zelf op (headless gebruik van de RPi) en verbind met het voorkeursnetwerk.

UPDATE  (23 april 2013)

Een nieuwe behuizing en een Type A Raspberry Pi. De behuizing is verkrijgbaar bij mijn vaste leverancier en is super compact voor deze uitvoering van de RPi.

Het wordt steeds mooier! Ook wordt er nog druk gesleuteld aan het script dus we zullen eerdaags een update op de website plaatsen.

 

Mar 23rd, 2013
  1. Wouter
    Jul 30th, 2013 at 20:24 | #1

    Hoi,dank voor je voor het leuke Rp radioproject,ik wil dit ook gaan proberen.
    Ik wil het display ook gaan bestellen maar welke optie moet ik nemen?
    I2C of SPI?
    Misschien dat ik binnenkort nog wat vragen heb als ik er niet uitkom maar natuurlijk eerst even zelf proberen…
    Alvast dank voor je antwoord.
    Met vriendelijke groet,
    W.C.de Poter.

  2. Johan, PA3ANG
    Jul 31st, 2013 at 15:44 | #2

    Hallo Wouter,

    De SPI optie. Hij staat in de lijst van BitWizard als Raspbeery Pi interface. http://www.bitwizard.nl/catalog/product_info.php?cPath=34&products_id=115 dus dat moet hem zijn.

    Succes en ik hoor of lees wel of er verdere vragen zijn.

    Mvg,
    Johan

  3. Aug 3rd, 2013 at 16:00 | #3

    Hoi Johan,

    Het zier er prachtig uit…al mis ik misschien een filmpje waarin blijkt dat ie het ook echt doet.
    Een eerste vraagje: met leerlingen willen we van een werkend voorbeeld een prototype radio maken die we in GHANA van een in GHANA gemaakte buitenkant willen voorzien.
    Voor ons project willen we vervolgens kleurrijke Ghanese internet radio’s verkopen.
    Zoals jij het doet, spreekt me geweldig aan, vrijwel geen losse draadjes! (Overal elders op internet allerlei voorbeelden met bread boards of solderen etc.) Dit kost aan onderdelen dus een kleine € 70.
    doe je er een wifi dongle bij dan € 80.
    Denk je dat het goedkoper kan?
    Tweede vraag: zou je er een luidspreker direct op aan kunnen sluiten, dan wordt het dus een standalone. Zijn de knopjes onder het LCD ook voor volume te gebruiken?

    Graag hoor ik, mag natuurlijk ook op de mail!

    Oh…nog een derde vraag: ik kreeg mijn raspberry pi zonder al teveel problemen aan de gang. Maar programma’s schrijven in Linux of python is nieuw voor mij, al ben ik wel van de goede oude tijd en kon ik indertijd dos commando’s geven en programmeren in html.
    Is het te doen, of wordt het een ramp? Wat denk je?

  4. harm
    Nov 17th, 2013 at 09:14 | #4

    Hallo Johan,

    Bedankt, je hebt mij met je artikel echt enthousiast gemaakt om zelf ook een internet radio te maken. Ik heb jouw script als basis gebruikt en uitgebreid met de volgende functies:

    knop 1:
    Kies functie (Radio, Wekker tijd, Wekker geluid, Wekker aan/uit, Weer, Tijd)

    knop 2:
    indien knop1 == Radio:
    Volgend station kiezen
    indien knop1 == Wekker tijd:
    Uur = Uur+1
    indien knop1 == Wekker geluid:
    Volgend geluid kiezen (geen geluid => actuele radio station=wekker geluid)
    indien knop1 == Wekker aan/uit:
    Toggelen tussen wekker aan en wekker uit
    indien knop1 == Weer:
    Toon temperatuur, windsnelheid, regen (wordt opgehaald via webservice)
    indien knop1 == Tijd:
    Toon tijd (uu:mm)

    knop 3:
    indien knop1 == Radio:
    Vorige station kiezen
    indien knop1 == Wekker tijd:
    Min = min+1

    knop 4:
    Volume verhogen

    knop 5:
    Volume verlagen:

    knop 6:
    Radio aan/uit (dim display bij radio uit en toon tijd)

    Verder laat ik het geluid via een extern usb stickie en 2 speakertjes lopen.
    Dat betekent wel dat je het volume niet meer met met xmms2 kunt aanpassen
    Dat doe ik nu vanuit het Python script met:
    call(["amixer", "cset" ,"numid=4", str(volume)])

    Als volgende stap wil ik alles overzetten naar Python, maar ik weet nog niet hoe ik de aansturing van het lcd display met Python moet doen.

    In ieder geval hartelijk bedankt.

    Mvg,

    Harm

  5. Nov 17th, 2013 at 16:54 | #5

    Hallo Harm,

    Leuk om te lezen dat je enthousiast geworden bent door het blogje. Ik ebn benieuwd hoe je één en ander het opgelost. Ik neem aan momenteel nog met een bash (.sh) programma.

    Het is erg leuk om met een RPi te kunnen spelen en er ook nog iets nuttigs mee te doen.

    Veel succes en bedankt voor je leuke response op het blogje.

    Mvg,
    Johan, PA3ANG

Leave a comment