Logo Spiria

Construire une radio Web avec un Raspberry-PI

7 décembre 2015.

Mélange de technologies passées et modernes, cette réalisation est née de l’achat, pour une poignée de dollars lors d’une journée vide-grenier, d’un superbe cabinet (entièrement vide) d’un poste de radio Emerson de 1933. Ainsi, après quelques petits travaux de restoration, nous voila prêts pour l’installation d’un Raspberry-pi ultra-moderne !!

Mélange de technologies passées et modernes, cette réalisation est née de l'achat, pour une poignée de dollars lors d'une journée vide-grenier, d'un superbe cabinet (entièrement vide) d’un poste de radio Emerson de 1933.

Ainsi, après quelques petits travaux de restoration, nous voila prêts pour l'installation d'un Raspberry-pi ultra-moderne !!

decorative

decorative

1. La liste de courses

  • Un rapsberry-PI model A+
  • Une carte SD
  • Un dongle WiFi USB
  • Un interrupteur circulaire 12 positions
  • Un potentiomètre 10K équipé d'un interrupteur
  • Une alimentation 5V 500mA
  • Un KIT Amplificateur basse fréquence

2. Le schéma

decorative

La sortie audio du Raspberry-Pi est branchée sur l'entrée d'un petit amplificateur tolérant une alimentation de 3 à 16V et le réseau est transporté par un dongle WiFi.

On notera que :

  • L'amplicateur n'est pas branché directement au 5V (sous peine d'entendre du bruit issu du CPU). Un petit régulateur (LM7805 ajusté à 4V) et un condensateur de 250uF en sortie permettront de filtrer proprement la ligne.
  • Le potentiomètre (P2) permettant de régler le gain, est également équipé d'un interrupteur qui nous permettra de couper mécaniquement l'alimentation lorsque l'on tourne le bouton à son mimimum.
  • "Ready Indicator" est une LED simplement branchée sur un GPIO qui nous servira pour indiquer si le réseau WiFI est disponible.
  • L'interrupteur rotatif (P1) est branché sur 12 GPIOs qui ont la particularité d'être configurés par défaut en PULL-DOWN sur le Raspberry-PI.

decorative

3. Montage

decorative

decorative

4. Le logiciel

4.1 Installation de Raspbian (wheezy)

Image disponible ici.

Instructions pour l'installation ici.

Configuration du Wifi .

4.2 Installation de mpc/mpc (webradio player)

sudo apt-get install mpd mpc

la liste des commandes mpc est disponible via :

mpc help

plus d'info disponible ici : http://www.musicpd.org/doc/user/

On notera en particulier :

Pour ajouter une webradio à la playlist :

mpc add 

Exemples :

mpc add http://www.radiofeeds.co.uk/bbcradio1.pls # BBC
mpc add http:... # Radio Canada

Pour ajouter un mp3 (apres l'avoir copié dans le bon répertoire de la carte SD) :

mpc update
mpc add 

4.3 Réalisation d'un script pour la séléction de la station de radio

Le principe consiste a réaliser un « deamon unix » qui sonde les gpios, afin d'associer les positions du bouton de sélection des stations (P1) à une position de lecture dans la playlist.

#!/bin/sh
### BEGIN INIT INFO
# Provides:          radio_ctl.sh
# Required-Start:
# Required-Stop:
# Default-Start:     S
# Default-Stop:
# Short-Description: Connect GPIO to mpc playlist
# Description:       Connect GPIO to mpc playlist
### END INIT INFO

daemon_NAME="radio_ctl.sh"
export PIDFILE=/tmp/radio_ctl
PATH="/sbin:/bin:/usr/sbin:/usr/bin"

#install
#---------
#sudo cp radio_ctl.sh /etc/init.d/. && sudo chmod a+x /etc/init.d/radio_ctl.sh
#sudo update-rc.d radio_ctl.sh defaults

#to uninstall
#---------
#sudo update-rc.d -f radio_ctl.sh remove

. /lib/lsb/init-functions

d_start () {
	V=0
	VOLD=0
	echo 23 > /sys/class/gpio/export
	echo 24 > /sys/class/gpio/export
	echo 25 > /sys/class/gpio/export
	echo 12 > /sys/class/gpio/export
	echo 13 > /sys/class/gpio/export
	echo 26 > /sys/class/gpio/export
	echo 19 > /sys/class/gpio/export
	echo 21 > /sys/class/gpio/export
	echo 20 > /sys/class/gpio/export
	echo 22 > /sys/class/gpio/export
	echo 27 > /sys/class/gpio/export
	echo 17 > /sys/class/gpio/export
	while [ true ]
	do
		[ `cat /sys/class/gpio/gpio23/value` = "1" ] && V=1
		[ `cat /sys/class/gpio/gpio24/value` = "1" ] && V=2
		[ `cat /sys/class/gpio/gpio25/value` = "1" ] && V=3
		[ `cat /sys/class/gpio/gpio12/value` = "1" ] && V=4
		[ `cat /sys/class/gpio/gpio13/value` = "1" ] && V=5
		[ `cat /sys/class/gpio/gpio26/value` = "1" ] && V=6
		[ `cat /sys/class/gpio/gpio19/value` = "1" ] && V=7
		[ `cat /sys/class/gpio/gpio21/value` = "1" ] && V=8
		[ `cat /sys/class/gpio/gpio20/value` = "1" ] && V=9
		[ `cat /sys/class/gpio/gpio22/value` = "1" ] && V=10
		[ `cat /sys/class/gpio/gpio27/value` = "1" ] && V=11
		[ `cat /sys/class/gpio/gpio17/value` = "1" ] && V=12	
		if [ $VOLD != $V ]; then
			VOLD=$V
			mpc play $V
			[ $V = 1 ] && echo "station 1"
			[ $V = 2 ] && echo "station 2"
			[ $V = 3 ] && echo "station 3"
			[ $V = 4 ] && echo "station 4"
			[ $V = 5 ] && echo "station 5"
			[ $V = 6 ] && echo "station 6"
			[ $V = 7 ] && echo "station 7"
			[ $V = 8 ] && echo "station 8"
			[ $V = 9 ] && echo "station 9"			
			[ $V = 10 ] && echo "station 10"			
			[ $V = 11 ] && echo "station 11"			
			[ $V = 12 ] && echo "station 12"			
			fi
		sleep 0.1
	done
}


d_stop () {
	if [ -e $PIDFILE ]; then
		kill `cat $PIDFILE`
		rm -f $PIDFILE
	fi
}

case "$1" in

        start)
			if [ -e $PIDFILE ]; then
				log_daemon_msg "Daemon $daemon_NAME already running"
				log_end_msg $?
			else
				log_daemon_msg "Starting system $daemon_NAME Daemon"
				log_end_msg $?				
				d_start &
				echo $! > $PIDFILE
			fi
			;;
			
        stop)
			if [ -e $PIDFILE ]; then
				log_daemon_msg "Stopping system $daemon_NAME Daemon"
				log_end_msg $?
                d_stop
			fi
			;;

        restart|reload|force-reload)
				d_stop
				d_start
                ;;

        force-stop)
               d_stop
                killall -q $daemon_NAME || true
                sleep 2
                killall -q -9 $daemon_NAME || true
                ;;

        status)
                status_of_proc "$daemon_NAME" && exit 0 || exit $?
                ;;
        *)
                echo "Usage: /etc/init.d/$daemon_NAME {start|stop|force-stop|restart|reload|force-reload|status}"
                exit 1
                ;;
esac
exit 0

Mea-culpa : Ce script bash, n'est clairement pas des plus efficace (pooling aux 10ms des GPIO) mais il a le mérite d'être simple et d'avoir été écrit très rapidement.

4.4 Réalisation d'un script pour allumer une LED lorsque le réseau WiFi est disponible

#!/bin/sh
### BEGIN INIT INFO
# Provides:          wlan_led.sh
# Required-Start:
# Required-Stop:
# Default-Start:     S
# Default-Stop:
# Short-Description: led on if router answer to ping
# Description:       led on if router answer to ping
### END INIT INFO

daemon_NAME="wlan_led.sh"
export PIDFILE=/tmp/wlan_led
PATH="/sbin:/bin:/usr/sbin:/usr/bin"

#install
#---------
#sudo cp wlan_led.sh /etc/init.d/. && sudo chmod a+x /etc/init.d/wlan_led.sh
#sudo update-rc.d wlan_led.sh defaults

#to uninstall
#---------
#sudo update-rc.d -f wlan_led.sh remove

. /lib/lsb/init-functions

d_start () {
	echo 18 > /sys/class/gpio/export
	echo out > /sys/class/gpio/gpio18/direction
	while [ true ]
	do
		ping -t1 -w1 -c1 192.168.1.1 > /dev/null
		if [ $? = "0" ]; then
		   echo 1 > /sys/class/gpio/gpio18/value
		else
		   echo 0 > /sys/class/gpio/gpio18/value
		fi	
		sleep 10
	done
}


d_stop () {
	if [ -e $PIDFILE ]; then
		kill `cat $PIDFILE`
		rm -f $PIDFILE
	fi
}

case "$1" in

        start)
			if [ -e $PIDFILE ]; then
				log_daemon_msg "Daemon $daemon_NAME already running"
				log_end_msg $?
			else
				log_daemon_msg "Starting system $daemon_NAME Daemon"
				log_end_msg $?				
				d_start &
				echo $! > $PIDFILE
			fi
			;;
			
        stop)
			if [ -e $PIDFILE ]; then
				log_daemon_msg "Stopping system $daemon_NAME Daemon"
				log_end_msg $?
                d_stop
			fi
			;;

        restart|reload|force-reload)
				d_stop
				d_start
                ;;

        force-stop)
               d_stop
                killall -q $daemon_NAME || true
                sleep 2
                killall -q -9 $daemon_NAME || true
                ;;

        status)
                status_of_proc "$daemon_NAME" && exit 0 || exit $?
                ;;
        *)
                echo "Usage: /etc/init.d/$daemon_NAME {start|stop|force-stop|restart|reload|force-reload|status}"
                exit 1
                ;;
esac
exit 0

Là encore, un script Quick'n Dirty, qui allume une led lorsque le routeur Wifi (ici 192.168.1.1) réponds à un ping.

Le test est effectué toutes les 10 secondes.

5 Conclusion

Voici une courte vidéo qui montre le résultat.