Hacker des radios pour une exposition / Musée d'Aquitaine

Bonjour à tous, je me présente, Nico, j’ai filmé la dernière Pycon avec mon association, Raffut, et je serai là pour filmer celle qui arrive à Strasbourg.
J’ai aussi un vrai métier, je suis technicien audiovisuel au Musée d’Aquitaine. En Mai, se tiendra une importante exposition sur l’immédiate après-guerre dans la région bordelaise.
Le commissaire d’exposition a proposé une idée intéressante : mettre tout au long du parcours de l’exposition des radios anciennes “hackées” pour diffuser des archives d’époque. En gros on tourne un potard, ça change d’archive sonore, et idéalement ça fait un petit bruit de modulation de fréquence à l’ancienne quand on change de “station”.
L’idée est super, le problème c’est que c’est sur moi que ça tombe, et je ne suis pas du tout compétent pour ce qui est de l’interaction entre le potard et le matériel qui va lire les sons (genre un orangepi, un ESP32 ou équivalent je suppose?). J’ai des notions, j’ai une idée de comment faire, mais j’ai besoin d’aide, je ne pense pas pouvoir devenir une bête de Python en 6 mois.
Je me suis inscrit au Fablab de la fac de Bordeaux, déjà, et je vais donner des nouvelles régulières de l’avancement des travaux ici, mais je prendrai toute lumière que vous pourrez apporter.
Evidemment, l’idée est de détailler ce projet sur un wiki, et rendre tout ouvert à la fin. C’est pour un musée, ça doit être ouvert à tous, réparable, et si possible durable.

1 « J'aime »

Bienvenu ici !

Je ferai ça avec un raspberry pi en effet (ou équivalent), quelque chose avec une prise jack pour ta sortie son quoi.

Pour « lire » ton potar le montage doit être, je pense :

+5v — résistance — potar — gnd
                 \
                  \ - Analog input

l’entrée analogique te donne une mesure entre 0V et 5V, donc avec ce montage tu mesure la tension au bornes du potar. La résistance est là pour réduire l’intensité max.

Plus ta résistance sera grande moins tu gaspillera d’énergie, mais moins tu verras de tension a ses bornes : faut tester, ça dépend de ton potar etc… au doigt mouillé je te dirais de ne pas descendre sous 1k ohm (résistance + potar au minimum), pour avoir 5 mA maximum.

Attention tout ce que je dis là est à prendre avec des pincettes, je suis dev Python, pas électronicien.

Bon un orange pi je ne sais pas mais un Raspbery Pi ça n’a pas d’entrée analogique, il te faut un MCP3008 entre les deux (ton moteur de recherche favoris t’aidera sur le cablage).

Une fois ton truc branché, tu peux la lire via Python, j’imagine qu’une recherche sur ton moteur favoris « read analog input Python raspberry mcp3008 » te donnera des résultats.

Pour le corps du programme, on peut essayer de commencer très simple (sale mais simple) en lançant et en tuant des VLC :

from time import sleep
import os
from subprocess import Popen

class VLCRunner:
    """This class starts and kills VLC as needed."""
    def __init__(self):
        self.vlc_pid = None

    def stop(self):
        """Stop a running VLC by... killing it."""
        if self.vlc_pid:
            os.kill(self.vlc_pid, 15)
            self.vlc_pid = None

    def play(self, file):
        """Play a file (stop VLC first if needed)."""
        self.stop()
        self.vlc_pid = Popen(["vlc", file]).pid

vlc = VLCRunner()

vlc.play('Stup Virus/01 Stupeflip - Intro.flac')
sleep(5)
vlc.play('Stup Virus/02 Stupeflip - The Antidote.flac')
sleep(5)
vlc.play('Stup Virus/03 Stupeflip - Creepy Slugs.flac')
sleep(5)
vlc.stop()

Ensuite il faut réagir au potar, que je n’ai pas, donc je vais le simuler…

Le code ressemble maintenant à ça :

https://p.afpy.org/g3r7/potar.py

et pour simuler le potar j’écris dans le ficher /tmp/potar comme ça j’ai pu tester :

$ echo 0.01 > /tmp/potar
$ echo 0.05 > /tmp/potar
$ echo 0.50 > /tmp/potar
$ echo 0.21 > /tmp/potar

je pense qu’on peut améliorer 1000 trucs, mais si déjà ça te permet d’avoir un truc qui marche c’est un début ?

2 « J'aime »

Merci beaucoup à toi !
C’est un beau début oui. Je vais déjà explorer les pistes que tu mets là, j’ai hâte de m’y mettre. Je donne des nouvelles ici dès qu’on a assemblé quelque chose.

En attendant d’avoir le matériel sous la main tu peux jouer avec :

from pathlib import Path
import tkinter as tk
from tkinter import ttk

root = tk.Tk()
root.title('Fake Potar')

current_value = tk.DoubleVar()

def slider_changed(event):
    Path("/tmp/potar").write_text(str(current_value.get()))

slider = ttk.Scale(root, from_=0.0, to=1.0, orient='horizontal', command=slider_changed, variable=current_value)
slider.pack()

root.mainloop()

pour tester le code du premier programme.

Le premier programme lit un “faux potar” dans /tmp/potar et celui là modifie /tmp/potar avec une jolie UI, comme ça vous pouvez tester vos sons, votre white noise, peaufiner, écouter ce que ça donne, faire évoluer le code, …