Spiria logo

Intéressé par la technologie (top)?

Vous recevrez hebdomadairement les articles de blogues écrits par nos développeurs, designers et geeks en tout genre.
Intéressé par la technologie?
Vous recevrez hebdomadairement les articles de blogues écrits par nos développeurs, designers et geeks en tout genre.

Construire une radio Web avec un Raspberry-PI

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 !!

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

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.

 

3. Montage

4. Le logiciel

4.1 Installation de Raspbian (wheezy)

Image disponible ici : https://www.raspberrypi.org/downloads/raspbian/

Instructions pour l'installation ici : https://www.raspberrypi.org/documentation/installation/installing-images/

Configuration du Wifi : https://www.raspberrypi.org/documentation/configuration/wireless/wireless-cli.md

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 <web_radio_url>

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 <file.mp3>

 

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.

 

 

 

 

 

 

Cette entrée a été publiée dans IoT, M2M & systèmes embarqués
par Jan D’Orgeville.
Partager l’article