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 !!
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.
Instructions pour l'installation ici.
Configuration du Wifi là.
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.