Radio FM avec RaspberryPI

Installer un raspbian lite:

1. recup image https://www.raspberrypi.org/downloads/raspberry-pi-os/

2. charger l'image sur le support

sudo dd if=./image.img of=/dev/cible bs=1M status=progress conv=fsync

3. mettre dans le raspberrypi et demarrer

Login: pi

Pwd: raspberry

Attention par defaut le clavier est en qwerty

4. faire les reglages a l'aide du script: sudo raspi-config

Liste rapide des reglages a faire:
  • clavier azerty
  • lang local
  • changer password
  • activer server ssh si pas deja le cas
  • update

Installation des soft

sudo apt-get ffmpeg sox oggfwd lame libsox-fmt-mp3 libsndfile1-dev git vim

Et d'autre si vous avez besoin.

Le temps que cela s'install on fait l'antenne…

Préparation de l'antenne

1. Il faut brancher un file d'une longueur déterminé sur un port GPIO ( le 4 dans notre application )

Pour calculer la longueur optimal de l'antenne:

Longueur optimale = 300 / Fréquence / 16 * 100

pour une fréquence d'émission sur 107.9:

17.38cm = 300 / 107.9 / 16 * 100

Installation du logiciel d’émission FM

les commandes:

  • cd PiFmRds/src
  • make clean
  • make

Test

Ici j'utilise une web radio mais on peut très bien remplacer par des fichiers locaux.

sox -t mp3 http://hd.lagrosseradio.info/lagrosseradio-metal-192.mp3 -t wav - | sudo /home/pi/PiFmRds/src/pi_fm_rds -audio -

Lancement automatique

Pour que la diffusion radio de lance a chaque démarrage:

1. créer un script avec les commandes a lancer:

vim /home/pi/PiFmRds/src/radio.sh

  • Ajouter la ligne suivante:

sox -t mp3 http://hd.lagrosseradio.info/lagrosseradio-metal-192.mp3 -t wav - | /home/pi/PiFmRds/src/pi_fm_rds -ps 'Ma_Radio' -tr 'BlaBliBlou…60char_max' -audio - &

il n'y a pas de sudo car le script rc.local est lancé en root.

On ajout & a la fin pour lancer en arrière plan et ne pas monopoliser la session

  • Enregistrer quitter:

:wq

2. rendre le script exécutable: chmod +x /home/pi/PiFmRds/src/radio.sh

3. Ajouter la chemin du script dans /etc/rc.local

Voila …

Bonus

Cree un fifo

mkfifo rds_ctl

Obtenir l'artiste et le titre de la grosse radio metal

vim get_title_gross_radio.pl

#!/usr/bin/perl
use Modern::Perl;
use Mojo::DOM;
use Text::Trim;
use Data::Printer;
 
my $DEBUG = 0;
 
# recup page des infos sur la musique diffusée
my $html = qx(wget https://www.lagrosseradio.com/_include/ajax_global.php -nv -q -O -);
p $html if $DEBUG;
 
# Nettoyage et mise en forme des datas
my $dom = Mojo::DOM->new( $html );
my $art_title = $dom->find('div[class="absolute rmetal"] div[class="relative"] a')->map('text');
p $art_title if $DEBUG;
my $a_t;
$art_title->each( sub {
    my ($e, $num) = @_;
    say 'e = '.$e if $DEBUG;
    say 'num = '.$num if $DEBUG;
 
    $a_t  = trim($e) if ( $num == 1 );
    $a_t .= ' - '.trim($e) if ( $num == 2 );
});
 
say $a_t if $DEBUG;
 
# envoi dans la pile fifo
open( my  $fifo, '>', '/home/pi/PiFmRds/src/rds_ctl') or die 'I/O FIFO ERR: open /home/pi/PiFmRds/src/rds_ctl';
#print {$fifo} "TA ON\n";
print {$fifo} "RT ".$a_t."\n";
#print {$fifo} "TA OFF\n";
close( $fifo );

:wq

chmod +x get_title_grosse_radio.pl

Modification du lanceur de radio

  • Ajouter le parametre -ctl rds_ctl a pi_fm_rds
# commande pour la grosse radio
 
# Depot git: https://github.com/ChristopheJacquet/PiFmRds
 
# lancement de la radio en tache de fond
sox -t mp3 https://hd.lagrosseradio.info/lagrosseradio-metal-192.mp3 -t wav - | /home/pi/PiFmRds/src/pi_fm_rds -ps '>METAL<' -ctl rds_ctl  -audio - &
 
_pid=$!
 
# stock le pid
echo $_pid > /tmp/radio.pid
 
# Mise a jour de la pile fifo avec 'Artiste - Titre'
while [ $(ps -p $_pid | sed -ne "s/^\($_pid\).*/\1/p") ]; do
        /home/pi/PiFmRds/src/get_title_grosse_radio.pl
        sleep 10
done

Ajout crontab pour relance auto

sudo crontab -e

* 08-23 * * * test -z $(ps h $(cat /tmp/radio.pid)) && /home/pi/PiFmRds/src/radio.sh 2>&1 >> /tmp/radio.log