Publié le 15 novembre 2013 - par

Streaming de radio FM avec le Raspberry Pi

fm_stream_250C’est SAPO, le principal portail web portugais qui est à l’origine de cette réalisation.  L’objectif est de diffuser en streaming sur Internet les radios locales des pays lusophones.

Le signal FM recueilli par une antenne est transformé par un Raspberry Pi puis injecté sur Internet sous forme de flux audio.2013-11-07-fm-stream-tech-report-1

Présentation

La société ARTICA a été choisie pour mettre en œuvre le Raspberry Pi. Ce sont 18 modules qui sont regroupés dans un rack 19 pouces :

SAPO, le plus grand portail Internet au Portugal, avait besoin d’un système robuste pour diffuser les radios FM dans des pays comme l’Angola, le Cap Vert, le Mozambique et le Timor oriental. Les stations de radiodiffusion classiques y sont toujours très populaires et la demande est forte, même sur le Web. SAPO a donc contacté ARTICA pour la réalisation du projet. 2013-11-07-fm-stream-tech-report-4ARTICA a travaillé en partenariat avec SAPO, IdMind et André Gonçalves de ADDAC System sur une solution de rack 6U pour diffuser les signaux radio sur Internet. Le concept était d’avoir une unité qui pourrait être facilement installée par des personnes non techniques, et ​​placée n’importe où dans le monde pour retransmettre automatiquement les radios locales  sur Internet. Pour faire fonctionner l’ensemble, il faut juste 3 câbles : un câble standard d’alimentation 220V, un câble Ethernet reliant l’appareil à Internet et un câble BNC relié à une antenne de radio.

2013-11-07-fm-stream-tech-report-2Chaque module est conçu avec une puce de récepteur FM de Silicon Labs (Si4705)  silicium, commandé par un Arduino via I2C. Cette puce a été choisie parce qu’elle gère le RDS, permettant de récupérer les méta-données sur la radio écoutée. Elle est aussi conçue d’origine pour se connecter à une antenne externe.

La bibliothèque Arduino permettant de travailler avec ces puces radio sera bientôt open-source. Il reste des cartes de test des récepteurs radio si vous êtes intéressé, n’hésitez pas à entrer en contact avec Artica.

Pour permettre au Raspberry Pi de capturer l’audio du signal radio Artica a conçu un circuit, en partenariat avec André Gonçalves, à partir du circuit intégré USB de capture audio de Texas Intruments PCM2900C.

2013-11-07-fm-stream-tech-report-3

Les LEDs en face avant indiquent en temps normal si le module est alimenté et peuvent également être utilisées par le logiciel de mise au point ou pour afficher toute autre information.

La face avant a été conçue par André Gonçalves. La conception des modules permet une permutation à chaud, ce qui n’était pas une mince affaire à réaliser. Finalement ce sont des connecteurs DIN de FCT Electronics qui ont été utilisés. Les connecteurs nécessaires pour le transfert du signal radio (nécessitant une protection et un isolement), le réseau (8 broches RJ45), une broche analogique pour que le module d’alimentation informer les autres modules qu’il va les éteindre, et une autre broche analogique pour indiquer l’emplacement auquel chaque module est relié. Chaque emplacement dispose d’un diviseur de tension qui lui est propre, permettant à l’Arduino de lire la tension et de savoir où le module est connecté. Le Raspberry Pi obtient une adresse IP unique, fonction de l’emplacement auquel il est connecté.

Le rack support  6U comporte un amplificateur de signal radio général et un répartiteur de signal d’antenne connecté à chacun des modules.

Alimentation

L’unité d’alimentation peut fonctionner jusqu’à une demi-heure sans alimentation secteur. Elle est contrôlée par un Arduino avec un module Ethernet et fonctionne avec une connexion à un serveur TCP.

Le Raspberry Pi qui gère l’émission est toujours connecté au réseau, il diffuse les informations en provenance de l’alimentation. à partir de l’unité de puissance. L’émission est réalisée avec le logiciel icecast.

2013-11-07-fm-stream-tech-report-6

Le premier emplacement est toujours occupé par le module faisant tourner icecast et la surveillance. Dans la partie arrière de chaque slot  il y a  une connexion RJ45 vers un port Gigabit d’un switch 24 ports TP-Link. Le switch est relié à un routeur sans fil TP-Link  configuré avec DD-WRT. Le switch fonctionne en 220V. Par contre, le routeur fonctionne sur 12V, ainsi que l’amplificateur de signal radio, ces deux équipements ne s’arrêtent que lorsque le module d’alimentation piloté par Arduino le décide.

Routeur

Le routeur est un TP-Link TL-WR740N avec OpenWRT, configuré pour se connecter au serveur OpenVPN dès qu’il reçoit une adresse de passerelle via l’interface WAN. Lorsque la connexion est établie, il redirige les ports 22 et 8000 vers le module radio principal avec l’adresse IP 192.168.10.1 afin de permettre à Artica d’accéder à ce module qui relaie les 17 autres modules, afin d’activer le streaming audio. Le port 8000 est attribué à Icecast, le port 22 est réservé pour l’accès de gestion par SSH . De même, le VPN a accès au port 5000 pour la configuration du routeur via HTTP et au port 5001 pour l’accès SSH. Cet accès permet à artica de récupérer l’adresse MAC de la machine.

Modules d’encodage

Les modules d’encodage utilisent le Debian natif du Raspberry Pi, avec quelques modifications pour améliorer les performances du système, la plus importante étant que la partition racine de la SD est en lecture seule. Toutes les configurations de machines sont stockées dans la partition FAT et seule la fréquence de réception est enregistrée dans un fichier. Aucune autre écriture n’est réalisée sur la carte.Tous les modules sont identiques. Seul diffère le module de configuration, qui est choisi en fonction de la position où le module est positionné dans le rack. Le module qui occupe la première position dans le rack assure la fonction de serveur, et exécute icecast pour relayer les 17 autres modules et crée son propre flux en utilisant darkice. Les 17 autres modules utilisent seulement icecast pour créer leur flux en utilisant le même programme, darkice.Pour connaître la position physique du module, Artica utilise un script qui dialogue avec l’Arduino. Le script récupère un nombre compris entre 1 et 18 qui correspond à la position du module dans le rack. C’est à partir de cette information qu’un autre script se charge de configurer l’adresse IP et le nom d’hôte de chaque module.

2013-11-07-fm-stream-tech-report-5 De la même façon sont configurés icecast, darkice et php. Php se charge ensuite de rendre disponible via HTTP les commandes permettant au système de modifier la fréquence de réception et l’état de la machine.

Serveur

Le serveur est composé de deux programmes importants. OpenVPN, qui reçoit les connexions des machines de radio. Et Icecast, qui relaie l’Icecast de sa propre machine. Lorsque la connexion est établie, un script établit une connexion SSH à l’adresse IP attribuée à la machine pour être en mesure d’obtenir l’adresse MAC du routeur. Cette adresse MAC est stocké dans un fichier pour indiquer que la machine est opérationnelle et un script est lancé pour reconstruire le fichier de configuration de Icecast. Le serveur a la même clé RSA que le client de sorte que la connexion SSH se fait sans intervention. 2013-11-07-fm-stream-tech-report-7 Écoutez un des flux en cliquant ici  (en direct de la radio FM populaire à Luanda, en Angola, capturé et encodé par un des streamers FM de SAPO dans ce pays.).

Conclusion

Cette superbe réalisation prouve une fois de plus (mais était-ce nécessaire) que le Raspberry Pi trouve non seulement sa place sur l’établi du bricoleur mais aussi dans des réalisations professionnelles de haut niveau comme ce rack de streaming.

Share Button

À propos François MOCQ

Électronicien d'origine, devenu informaticien, et passionné de nouvelles technologies, formateur en maintenance informatique puis en Réseau et Télécommunications. Dès son arrivée sur le marché, le potentiel offert par Raspberry Pi m’a enthousiasmé j'ai rapidement créé un blog dédié à ce nano-ordinateur (www.framboise314.fr) pour partager cette passion. .

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Complétez ce captcha SVP * Time limit is exhausted. Please reload CAPTCHA.