Une vieille radio GRUNDIG RTV500 ressuscitée grâce au Raspberry Pi

L’histoire commence le jour où j’ai ouvert un vieux carton du grenier. A l’intérieur, je retrouve la vieille radio des années 70 que j’écoutais quand j’étais ado. Me vint alors le souvenir de la manière si particulière avec laquelle il fallait chercher les stations, vous savez, avec le gros bouton à tourner pour faire bouger le curseur à l’arrière de la face avant illuminée. Et quand la stéréo s’allumait, c’était LE son !

Je tente un branchement. Malheureusement, seul un grand « chhhhhhhhhhhhhh » sort des haut-parleurs. Quel dommage de la mettre à la benne ! A l’heure où France Inter arrête sa diffusion en grandes et moyennes ondes, où Freebox, Squeezbox, applications mobiles et satellites proposent des moyens d’écoute alternatifs aux ondes FM et AM — parfois difficiles à capter en certains lieux —, je décide de lui donner une seconde vie en l’adaptant aux modes de diffusion modernes.

Mais l’objectif principal est de garder son fonctionnement originel d’il y a trente ans. Pas de changements visibles à l’extérieur, les mêmes boutons, les mêmes fonctions. Juste intégrer un Raspberry Pi — un nano-Pc pour les non initiés —, relié aux boutons, voyants et à l’amplificateur d’origine.

Voici une vidéo de son fonctionnement …

Vous croyez que c’est la radio d’origine ? Vu de l’extérieur, en effet. Mais allons regarder de plus près l’intérieur !

Le châssis électronique

Ce châssis est repris par plusieurs appareils de la marque. La carte électronique est sertie dans un châssis métallique soutenant toute la mécanique dédiée à la recherche des stations, ainsi que les éléments de la face avant. Dans sa partie gauche, les éléments de la partie Haute Fréquence y prennent place : condensateur variable, antennes internes et prises d’antennes externes, circuits électroniques de radio-fréquence, ainsi que le sélecteur de gamme d’ondes. A droite, le transformateur d’alimentation, la régulation d’alimentation, les transistors de puissance et l’amplificateur Basse Fréquence.

Tous les détails techniques à propos de ce récepteur AM-FM sont disponibles sur l’excellent site radiomuseum. Cette image vous donne une vue d’ensemble  de l’intérieur.

Toute la partie électronique HF ne fonctionne plus, quelque soit la gamme d’onde. En suivant le schéma électronique, je retire un à un tous les composants correspondants. Je conserve l’amplificateur audio en entier — un bon vieux Push-Pull de puissance — et je le raccorde à la sortie audio du Raspberry avec un jack. Je monte le Raspberry sur un support en plastique blanc, ainsi que ses éléments électroniques annexes, détaillés plus loin.

Un contact de chaque sélecteur est relié au Raspberry Pi.

Le sélecteur de face avant

Chaque bouton du sélecteur en face avant est relié à un port GPIO configuré en entrée avec résistance de pull-up. Ces six contacts renseignent le Raspberry Pi sur le bouton enfoncé.

Cinq des sept boutons sont mutuellement exclusifs. L’enfonçage d’un bouton provoque la libération d’un autre éventuellement enfoncé. Le bouton AUS, qui veut dire Arrêt en allemand, est du type poussoir seulement. Il libère tout bouton déjà enfoncé. L’alimentation en 220v est alors interrompue. Le dernier bouton, intitulé MONO, est un poussoir à bascule indépendant, qui était chargé de forcer la réception en monophonie.

Le bouton de recherche des stations

L’un des challenge de ce projet est de garder le fonctionnement originel du bouton de recherche des stations. Dans les coulisses de l’appareil, il déplace le curseur de la face avant grâce à un système de poulies guidant un fil tendu. Par la même occasion, ce système fait tourner une énorme capacité variable. Pour ne pas modifier le circuit assez complexe du fil tendu, je garde le boitier du condensateur variable, auquel je vais accoupler un encodeur rotatif, de manière à renseigner le Raspberry Pi sur la position du bouton de recherche des stations.

Deux axes traversent le boitier du condensateur. L’un effectue une rotation de 540 degrés, soit un tour et demi, l’autre effectue une rotation de 180 avec un mécanisme de butée. Pour plus de précision, il est évident de coupler l’encodeur rotatif sur l’axe effectuant les 540 degrés de rotation. Cela nécessite d’ajouter à l’autre axe un capteur infrarouge, qui va agir un peu comme un bit de poids fort indiquant si la position du premier se trouve au delà de 360 degrés ou non. Du coup, neuf entrées GPIO sont utilisées, huit pour l’encodeur (se référer au datasheet de l’encodeur pour comprendre pourquoi 8 bits sont utilisés pour seulement 128 valeurs de position), et une pour le capteur infrarouge.  Tout ceci nous permet d’obtenir une valeur de positionnement entre approximativement 0 et 200 sur toute la course du curseur en face avant, soit environ 270mm. La patte commune de l’encodeur est mise à la masse, les entrées GPIO sont configurées en mode pull-up. La LED infrarouge émettrice est connectée à une broche 3.3V du Raspberry Pi avec une résistance de limitation.

Le voyant stéréo

Il est connecté à une sortie GPIO au travers d’un MOSFET. Ce dernier permet d’allumer la véritable ampoule à incandescence alimentée avec du 7V – 150mA, et ce, à partir du 3.3V du port GPIO. J’ai choisi le BS170 à cause de son faible encombrement et de sa tension de déclenchement de 2.1V.

L’indicateur de niveau de réception

Il s’agit d’un galvanomètre classique. Je choisi de le piloter à l’aide d’un MCP4725, un convertisseur DAC commandé par le bus I²C. Il sera en charge de générer la tension nécessaire pour faire déplacer l’aiguille. Comme le DAC travaille entre 0 et 3.3V et que la tension maxi du galvanomètre est de 0.5V, j’ajoute en série une résistance de 680Ω de manière à limiter la tension maximale.

En orange, le MOFSET du voyant stéréo. En rouge, le DAC pilotant l’indicateur de niveau de réception. En vert, notre Raspberry Pi.

L’alimentation

Le Raspberry Pi est alimenté par son propre transformateur, relié en permanence au 220v, même si le sélecteur est en position AUS. Ceci évite d’avoir à attendre le boot de Windows — environ 40s — avant d’obtenir un son, et d’avoir un arrêt sauvage du système d’exploitation à l’extinction.

L’alimentation du Raspberry Pi se loge tout juste au-dessus du transformateur initial.

Le circuit électronique de régulation de la tension est hors service. Bien entendu, comme dans beaucoup de cas, cela provient de la diode Zener, utilisée comme référence de tension. C’est bien sûr une diode Zener assez spécifique, difficile à trouver de nos jours. J’ai cependant réussi à trouver sur internet, outre atlantique, une diode équivalente, mais à des prix exorbitants : 20€ l’unité, hors frais de port. Je décide donc d’adapter un régulateur moderne à LM317 pour fournir l’alimentation générale à toute la carte électronique. Le transistor de puissance dédié à la régulation est alors dessoudé.CKZJ_DTSR_0

Le logiciel

Une application « headed » écrite en C# – UWP fonctionnant sous Windows IoT Core. J’ai choisi une application avec interface graphique pour visualiser ce qui se passe sur le Raspberry Pi pendant la phase de développement, à l’aide d’un écran HDMI classique. Mais en fonctionnement normal, aucun écran ne sera connecté. Il sera néanmoins possible d’utiliser l’application Windows Iot Remote Client pour prendre le contrôle du Raspberry Pi depuis n’importe quel périphérique Windows 10 pour visualiser l’interface graphique WPF, montrant informations et état de fonctionnement.

Les sources de la solution en Visual Studio 2015 sont disponibles ici. Vous y trouverez deux projets et trois librairies. Le projet RTV500Pi est le programme complet qui s’exécute sur ma radio. Toutes les connexions externes doivent être présentes pour faire fonctionner le programme. Vous pouvez bien sûr l’exécuter sur votre carte, mais rien ne se passera car l’encodeur rotatif et les connexions au sélecteur de face avant seront manquantes. Néanmoins, j’ai créé un second projet nommé RadioDemo qui peut être exécuté sur tout périphérique Windows 10. Ce projet comporte une interface graphique en WPF, simulant les commandes de la radio à l’aide de boutons et d’une SlideBar. Pour tout vous avouer, j’utilisais ce projet pour tester le fonctionnement général du programme sur mon Pc avant de l’exécuter à distance sur le Raspberry Pi. Ces projets ne contiennent que peu de code. Toute l’implémentation des classes se situe dans les librairies, de façon à être ré-utilisables facilement dans d’autre projets.

Générer l’audio

Le logiciel est en charge de simuler le son de la vieille radio lorsque l’on tourne le bouton de recherche des stations. Ce comportement est réalisé grâce à deux contrôles de type MediaPlayer. Le premier est un MediaElement reproduisant le flux audio de la web radio. Le second est l’objet BackgroundMediaPlayer jouant en continu un fichier contenant du bruit rose. Le volume de ce dernier est adapté pour produire le son final mixé entre bruit rose et flux de la radio. Plus le curseur se rapproche de la fréquence de la station, plus le bruit rose est atténué, pour disparaître totalement une fois la fréquence atteinte. Cette lecture continue en arrière plan permet d’éviter les clacs audio à chaque initialisation de la carte son du Raspberry Pi, problème bien connu.

Enregistrer sa propre liste de stations de radios

Chaque gamme d’ondes LW, MW, KW, et UKW peut être programmée avec un ensemble de stations de radio en appelant la méthode AddStation() de l’objet Radio, et ce, avant d’initialiser l’objet Radio lui-même à l’intérieur de l’évènement MainPage.Page_Loaded().

public RadioStation AddStation(string name, WaveBand band, byte frequency, string address, bool stereo, byte displayRow, double[] ReceipValues

Voici la description de chaque paramètre :

  • name : le nom de la radio que vous désirez ajouter. Ce nom est simplement affiché sur l’interface graphique, et permet de facilement identifier la radio dans le code source.
  • band : la gamme d’onde où ajouter la station, soit LW, MW, KW, ou UKW.
  • frequency : la fréquence centrale à laquelle la station apparaîtra dans la gamme d’onde. Ce paramètre est un nombre byte représentant la position du bouton de recherche entre 0 et 200.
  • address : l’adresse url du flux de la web radio.
  • stereo : si true, le voyant stéréo s’allumera lorsque la station sera lue.
  • displayRow : sur l’interface graphique, les noms des stations peuvent être affichées sur plusieurs lignes. Par défaut, cette valeur doit être 0, soit un affichage sur la première ligne. Mais si il n’y a pas assez de place pour afficher la station, incrémentez ce paramètre pour faire apparaître le nom sur la ligne suivante.
  • ReceipValues : par défaut, passez un tableau avec ces valeurs :
new double[] { 1, 2, 3, 4, 3, 2, 1 }

Ces valeurs sont utilisées pour simuler le process de recherche de la station en mixant le bruit rose et le flux de la web radio. Elles servent aussi à piloter l’indicateur de force de signal, d’où des valeurs comprises entre 0 et 5. La valeur maximale du tableau correspond à la fréquence centrale du paramètre frequency. Une valeur supérieure à 4 coupe totalement le bruit rose en arrière plan. Donc, si vous souhaitez entendre clairement la station, mettez au moins une valeur supérieure ou égale à 4. A l’inverse, si vous souhaitez simuler une station lointaine avec du bruit, laissez toutes les valeurs en dessous de 4.

Dans le code source de la classe Radio, vous trouverez un ensemble de radios présentes sur la bande FM parisienne, programmées par la méthode statique AddParisRadios(), ainsi que les quatre radios nationales françaises présentes sur les grandes ondes dans la méthode statique AddFrenchLWRadios(). Ces méthodes seront, je pense, utiles pour comprendre la façon dont AddStation() fonctionne.

Player MP3

Le bouton TA/TB était normalement utilisé pour reproduire l’audio d’un appareil externe, un lecteur de cassettes par exemple. Connecté à l’une des entrées externes intitulées TAPE A ou TAPE B, il utilise le RTV500 comme amplificateur. Désormais, ce bouton active un lecteur de fichiers MP3. Au démarrage, la librairie de fichiers musicaux — constituée par défaut des fichiers du dossier Music du profil utilisateur — est scannée pour créer une MediaPlaybackList transmise au contrôle MediaElement. La liste des fichiers audio est lue séquentiellement en boucle. La barre de contrôle du MediaElement est affichée sur l’interface graphique.

Conclusion

Cette radio ressuscitée est désormais installée dans le salon. Elle permet d’écouter musique ou infos disponibles sur internet. Son apparence et son fonctionnement d’antan sont totalement préservés, tout en utilisant les modes de diffusions actuels. Et nul besoin de lire une longue documentation pour savoir comment l’utiliser. Tous le monde sait comment la faire fonctionner de manière intuitive.

L’électronique et le rendu audio sont totalement opérationnels. J’apporterai éventuellement quelques améliorations sur l’interface graphique. J’envisage aussi d’utiliser le bouton MONO comme un bouton d’activation du Bluetooth. Cela permettrait de lire de la musique depuis n’importe quel lecteur de média Bluetooth. Pour cela, il faudra attendre le support des profils Bluetooth adéquats par Windows IoT Core.

Datasheet de l’encodeur Rotatif BOURNS EAW0J-B24-AE0128L

rtv500pi__connexionsrtv500pi__schematicEdit 1

Parce que j’avais besoin d’un Raspberry Pi 3 pour un autre projet, je l’ai remplacé par un Raspberry Pi 2 depuis deux mois. Tout fonctionne correctement. La version de l’OS est la 10.0.14393.321.

Edit 2

A cause de plusieurs changements d’url des radios du groupe Radio France, la liste des stations est maintenant modifiable en éditant le fichier RadioFreqMap.csv stocké dans le dossier Music. Si ce fichier ne peut être lu au démarrage, par exemple lors du premier lancement, le programme charge la liste des radios à l’aide des méthodes statiques AddParisRadios(), AddAddictRadios() et AddFrenchLWRadios(), puis cherche à les enregistrer dans un nouveau fichier RadioFreqMap.csv. Vous avez donc l’assurance d’avoir un fichier .csv correct au départ, que vous pouvez ensuite modifier à volonté. Les colonnes de ce fichier .csv correspondent exactement aux paramètres de la méthode AddStation() décrite plus haut.

2 réflexions au sujet de « Une vieille radio GRUNDIG RTV500 ressuscitée grâce au Raspberry Pi »

  1. Stéphane Robbe

    Pour l’avoir vu et entendu aux deuxièmes rencontres nationales du Rasperry Pi à Nevers, je certifie que ce RTV500 est MAGIQUE (et que son auteur fait mon admiration).

    Répondre

Laisser un commentaire

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