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.