D’AirPlay à la radio FM avec un Raspberry Pi

Petit montage amusant : transmettre un flux AirPlay vers une radio FM avec un Raspberry Pi. Attention, la diffusion en FM est réglementée et la puissance limitée à 50 nW (50 milliardième de Watt) pour un usage personnel (, page 18). Je n’ai pas de quoi mesurer la puissance, mais elle est sûrement plus élevée, vous êtes prévenus.

L’idée m’est venu en voyant un programme : il permet d’utiliser certaines fonctions des GPIO du Raspberry Pi pour émettre dans la bande FM. On juste besoin d’une « antenne » connectée sur le GPIO 4 (quatrième PIN en partant de P1). J’ai juste utilisé un câble « jumper » branché directement dessus.

Pour la longueur, un 1/16 d’onde devrait être correct : vous divisez 300 par la longueur d’onde en MHz, puis vous divisez le tout par 16 pour obtenir la longueur idéale en mètre pour l’antenne. Pour une fréquence de 107,9 MHz, on a donc ((300/107,9)/16)*100 pour la longueur en cm, soit 17,3 cm environ.

J’ai choisi la fréquence de 107,9 MHz parce qu’elle n’est a priori pas utilisée et qu’on est à la limite du spectre FM.

L’installation

Je suis parti de ce script, destiné à la base à faire un pont entre AirPlay et Sonos (ce qui explique le nom de certaines variables) et j’ai modifié le tout pour l’utiliser avec PiFM. Il faut un Raspberry Pi sous Raspbian et si possible avec une base propre, et on va avoir besoin de tout ça.

sudo apt-get install git build-essential libssl-dev libavahi-client-dev avahi-daemon vlc avahi-utils chkconfig git libao-dev libcrypt-openssl-rsa-perl libio-socket-inet6-perl libwww-perl pkg-config

Premièrement, on installe ShairPort, un programme open source qui émule une borne AirPort.

git clone -b 1.0-dev git://github.com/abrasive/shairport.git
cd shairport
sudo ./configure && sudo make && sudo make install
cd ..
rm -rf shairport

Maintenant, on va installer PiFM.

mkdir pifm
cd pifm
wget http://omattos.com/pifm.tar.gz
tar -xvf pifm.tar.gz
sudo mkdir /usr/local/bin/pifm
sudo cp pifm /usr/local/bin/pifm
rm -r pifm

On va gérer le pont.

sudo adduser shairport
sudo adduser vlc

Au départ, je voulais lancer le tout au démarrage, mais c’est assez instable, si quelqu’un est motivé pour le faire, pas de soucis, mais mes connaissances en Linux sont un peu faibles pour ça. Avec un script, ça ne se lance pas à chaque fois, sans que je trouve la raison exacte.

Donc on va créer les pipes et lancer les commandes manuellement. En gros, le premier pipe va servir pour transmettre le flux entre ShairPort et VLC, qui va convertir le flux et le sortir dans un second pipe qui va être lu par PiFM.

mkfifo /tmp/airplay2fm
chmod 666 /tmp/airplay2fm
mkfifo /tmp/radio
chmod 666 /tmp/radio

On lance ShairPort.

sudo /bin/su - shairport -c "/usr/local/bin/shairport -d -a AirPlayFM -P /home/shairport/shairport.pid -l /home/shairport/shairport.log -e /home/shairport/shairport.err -B \"echo -e 'play\nlogout'|nc localhost 7070\" -o pipe /tmp/airplay2fm"&

Enfin, on lance VLC qui va convertir le flux en un truc valable pour PiFM.

sudo /bin/su - vlc -c "/usr/bin/vlc -d --pidfile /home/vlc/vlc.pid --logfile /home/vlc/vlc.log -I rc --rc-host localhost:7070 --demux=rawaud --rawaud-channels 2 --rawaud-samplerate 44100 /tmp/airplay2fm :sout='#gather:transcode{acodec=s16l,ab=32,channels=1,samplerate=22500}:std{mux=raw,dst=/tmp/radio}' :sout-keep :repeat"

Si tout se passe bien, on voit un périphérique AirPlay qui porte le nom AirPlayFM. Il faut maintenant se connecter dessus (avec un Mac, un appareil iOS, etc.). Pour terminer, on lance PiFM.

sudo /usr/local/bin/pifm/pifm /tmp/radio 107.9 22500

Normalement, si tout se passe bien, ça diffuse le tout sur 107.9 FM. Il est possible de changer la fréquence, mais attention, ça risque de poser des soucis avec les stations existantes.

Si quelqu’un est motivé pour automatiser le tout, ça peut être intéressant. En mettant du Wi-Fi, on pourrait même intégrer le tout dans une voiture…

Niveau performances, un Raspberry Pi sans overlocking gère le tout facilement, tout est fluide au niveau du son.

Pour les personnes motivées, une variante de PiFM supporte le RDS, mais je n’ai pas réussi à lier cette version avec VLC.

J’ai testé avec mon réveil, la seule radio FM que j’ai à la maison, mais ça doit marcher avec n’importe quel appareil.

Je vous proposerais une vidéo d’exemple plus tard, l’iPhone n’est vraiment pas efficace pour capter le son et j’attends une solution efficace pour ça.