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 (là, 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.
Génial comme bidouille, ça fonctionne au poil chez moi.
A noter par contre j’en ai profité pour repartir sur une config propre histoire d’éviter les prises de tête. J’ai donc fait un clean install de Raspbian avant de faire la manip (en récupérant l’image la plus récente sur le site officiel) et j’ai eu besoin de faire un petit update avant (en utilisant sudo apt-get update && apt-get upgrade).
En tous cas merci pour le tuyau !
J’ai du faire ça aussi, ça ne marchait pas sur mes cartes qui servent pour des tests depuis longtemps.
La version RDS marche bien aussi, d’ailleurs, mais j’ai pas réussi à lier AirPlay dessus
J’ai vu avec l’auteur de PiFMRds il a ajouté le piping même en mp3 donc ça marche beaucoup mieux
Yes, encore une fois le lapin me sauve !
Bonjour, je me demande a quoi sert le dernier paramètre, une idée ?
Quelle ligne ? Si c’est la dernière, c’est pour passer en 22 kHz au lieu de 44 kHz, pour limiter l’usage CPU sur le Pi
J’ai réussi à faire marcher ça par contre c’est fragile :)!
J’arrive pas encore a changer de musique sans devoir tout relancer
Bonjour,
Voici un truc qui marche avec PiFmRds (attention uniquement de la diffusion de mp3 pas via le fifo mais a mon avis c’est dans le même genre.)
J’utilise ça dans la voirure, avec un bouton sur un GPIO pour changer de musique au besoin.
#/bin/bash
IFC=’
‘
playlist= »/tmp/playlist.pls »;
musicPath= »/mnt/music »;
function createList {
if [ -e $playlist ]
then
echo « Le fichier $playlist existe »;
lecture
else
echo « Création de $playlist… »;
find $musicPath -type f -name « *.mp3″ > $playlist
lecture
fi
}
function lecture {
#clear
max=$(wc -l $playlist | awk ‘{ print $1}’)
nbmax=$max+1
ligne=$((RANDOM%$nbmax+0))
fichier=$(sed -n »$ligne’p’ $playlist)
echo » « ;
echo « Nombre de mp3: $max »;
echo « Lecture en cours: »
echo « $fichier »;
echo » « ;
echo » « ;
sox -t mp3 « $fichier » -t wav – | sudo ./PiFmRds/src/pi_fm_rds -freq 103.3 -rt « $fichier » -audio –
# Lecture en boucle
lecture
}
createList
Je jette une bouteille à la mer en espérant que quelqu’un m’aide, j’ai passé la journée dans les méandres de Google pour essayer de trouver une solution mais rien ne marche.
Toutes les lignes de codes marchent, aucune erreur etc … Sauf que ni iTunes ni mon iPhone n’arrive à se connecter au signal AirPlay bien qu’il le capte parfaitement …
C’est possible que ça ne fonctionne plus avec les versions récentes d’iOS
URGENT Gros problème!!!
Je peux pas installer Shairport car il manque OpenSSL!
Et quand j’installe OpenSSL il me met un P***** de 404 not found