Transformez un Raspberry Pi et une clé RTL-SDR en analyseur de spectre autonome, capable de balayer de 25 MHz à 1,7 GHz avec un waterfall en temps réel.
Une clé RTL-SDR est un tuner TV numérique reconverti en récepteur large bande. Elle capture le signal brut (I/Q) et l'envoie au Raspberry Pi via USB. Des logiciels comme rtl_power ou pyrtlsdr décodent ce signal et produisent un spectrogramme (waterfall).
Le système final doit être capable d'afficher en continu le spectre de 25 MHz à 1,7 GHz, de zoomer sur une fréquence (ex. 433 MHz pour télécommandes) et de démoduler des signaux FM/AM.
Flashez Raspberry Pi OS Lite (sans bureau) ou avec bureau léger selon votre préférence. Activez SSH et configurez le Wi-Fi.
# Téléchargez Raspberry Pi Imager, sélectionnez "Raspberry Pi OS Lite (32-bit)"
# Dans les options (Ctrl+Shift+X), activez SSH et configurez le Wi-Fi
# Flashez la SD, insérez-la et démarrez.
sudo apt update && sudo apt upgrade -y
sudo apt install rtl-sdr librtlsdr-dev python3-pip python3-numpy python3-matplotlib -y
pip3 install pyrtlsdr
# Vérifier que la clé est reconnue
rtl_test
# Vous devriez voir des informations sur le tuner Rafael Micro R820T2.
# Si erreur, vérifiez le câble USB ou l'alimentation.
Ce script capture des tranches de spectre et génère une image du waterfall. Il peut être exécuté en continu et affiché sur l'écran.
#!/usr/bin/env python3
import matplotlib
matplotlib.use('TkAgg') # si vous utilisez l'écran tactile
import matplotlib.pyplot as plt
import numpy as np
from rtlsdr import RtlSdr
import time
# Configuration
CENTER_FREQ = 433e6 # Fréquence centrale (433 MHz)
SAMPLE_RATE = 2.4e6 # Échantillonnage
NFFT = 512
NUM_ROWS = 100 # Nombre de lignes du waterfall
sdr = RtlSdr()
sdr.sample_rate = SAMPLE_RATE
sdr.center_freq = CENTER_FREQ
sdr.gain = 'auto'
fig, ax = plt.subplots()
waterfall = np.zeros((NUM_ROWS, NFFT))
im = ax.imshow(waterfall, aspect='auto', cmap='inferno', vmin=-50, vmax=0)
ax.set_xlabel('Fréquence (MHz)')
ax.set_ylabel('Temps')
freqs = np.linspace(-SAMPLE_RATE/2, SAMPLE_RATE/2, NFFT) / 1e6 + CENTER_FREQ/1e6
ax.set_xticks(np.linspace(0, NFFT-1, 10))
ax.set_xticklabels([f'{f:.2f}' for f in freqs[::NFFT//10]])
plt.ion()
plt.show()
try:
while True:
samples = sdr.read_samples(256*1024)
psd, _ = matplotlib.mlab.psd(samples, NFFT=NFFT, Fs=SAMPLE_RATE/1e6, scale_by_freq=False)
psd_db = 10 * np.log10(psd + 1e-10)
waterfall = np.roll(waterfall, -1, axis=0)
waterfall[-1, :] = psd_db[:NFFT]
im.set_data(waterfall)
fig.canvas.draw()
fig.canvas.flush_events()
time.sleep(0.1)
except KeyboardInterrupt:
pass
finally:
sdr.close()
plt.close()
Vous pouvez faire tourner rtl_power en tâche de fond et servir les données via un mini serveur Python.
# Lancer un scan continu de 88 à 108 MHz (bande FM) et sortie CSV
rtl_power -f 88M:108M:1k -i 2 -g 20 -e 1m scan.csv
# Puis utiliser un script Python pour lire le CSV et générer une image
# ou une page HTML avec JavaScript et canvas.
Pour un vrai confort, vous pouvez installer SPECTRAN ou GQRX qui offrent une interface graphique complète, mais plus lourde.
# Syntoniser 100.0 MHz et sortir le son sur les haut-parleurs
rtl_fm -f 100.0M -M wbfm -s 200k -r 48k | aplay -r 48k -f S16_LE
Réglez la fréquence centrale sur 433 MHz. Lorsque vous appuyez sur un bouton de télécommande, vous verrez une impulsion dans le waterfall.
La clé RTL-SDR monte jusqu'à 1.7 GHz, mais avec un downconverter vous pouvez atteindre les bandes hautes. Sinon, certaines clés étendues montent à 2.2 GHz.
Pour rendre le système autonome, imprimez un boîtier qui intègre l'écran, le Pi, la batterie et la clé SDR. Fixez l'antenne sur un connecteur SMA externe. Ajoutez un bouton d'arrêt et une LED d'état.
Vérifiez que l'antenne est bien vissée et que le gain n'est pas trop bas. Augmentez-le avec l'option -g.
Certains écrans nécessitent des drivers spécifiques (par ex. waveshare). Installez-les selon la doc du fabricant.
Oui, utilisez rtl_sdr -f 433M capture.iq pour enregistrer des échantillons bruts, puis analysez-les plus tard.
En France, l'écoute des bandes de radiodiffusion (FM, DAB+), radioamateurs, bandes ISM (433 MHz) est autorisée. L'écoute des conversations privées (téléphone, PMR cryptées) est interdite.