F1TMV
MatérielSDRAnalog DevicesPluto+ (PlutoSDR Plus)Logiciels

GNU Radio

Configuration de GNU Radio avec gr-iio pour le Pluto+

GNU Radio + gr-iio

GNU Radio est l'environnement de développement SDR le plus puissant et flexible.

Installation

Ubuntu/Debian

# Installation depuis les dépôts
sudo apt install gnuradio gr-iio

# Ou compilation depuis les sources (dernière version)
git clone https://github.com/analogdevicesinc/gr-iio.git
cd gr-iio
mkdir build && cd build
cmake ..
make -j$(nproc)
sudo make install
sudo ldconfig

Windows

  1. Télécharger GNU Radio pour Windows
  2. Installer le plugin gr-iio depuis les options

macOS

brew install gnuradio
# gr-iio doit être compilé depuis les sources

Blocs PlutoSDR

PlutoSDR Source (réception)

Paramètres du bloc :

ParamètreValeur exempleDescription
IIO context URIip:192.168.2.1Adresse du Pluto+
Buffer size32768Taille buffer (puissance de 2)
LO Frequency98000000Fréquence centrale (Hz)
Sample Rate2000000Taux d'échantillonnage
RF Bandwidth200000Bande passante RF
Gain Modeslow_attackAGC automatique
Manual Gain50Gain si mode manual

PlutoSDR Sink (émission)

ParamètreValeur exempleDescription
IIO context URIip:192.168.2.1Adresse du Pluto+
LO Frequency144200000Fréquence TX (Hz)
Sample Rate2000000Taux d'échantillonnage
RF Bandwidth200000Bande passante RF
Attenuation10Atténuation TX (dB)

Flowgraph réception FM

#!/usr/bin/env python3
# Récepteur FM simple avec Pluto+

from gnuradio import gr, analog, audio, filter
from gnuradio import iio

class fm_receiver(gr.top_block):
    def __init__(self):
        gr.top_block.__init__(self, "FM Receiver")

        # Source Pluto+
        self.pluto = iio.fmcomms2_source_fc32(
            "ip:192.168.2.1",
            [True, True],  # RX1 activé
            32768
        )
        self.pluto.set_frequency(98000000)  # 98 MHz
        self.pluto.set_samplerate(2000000)
        self.pluto.set_gain_mode(0, "slow_attack")

        # Filtre et démodulation
        self.lpf = filter.fir_filter_ccf(
            10,
            filter.firdes.low_pass(1, 2000000, 100000, 10000)
        )
        self.demod = analog.wfm_rcv(
            quad_rate=200000,
            audio_decimation=4
        )

        # Sortie audio
        self.audio_sink = audio.sink(48000)

        # Connexions
        self.connect(self.pluto, self.lpf, self.demod, self.audio_sink)

if __name__ == '__main__':
    tb = fm_receiver()
    tb.start()
    input('Appuyer sur Entrée pour arrêter...')
    tb.stop()
    tb.wait()

Configuration MIMO (2 canaux)

# Réception MIMO - 2 canaux RX
from gnuradio import gr, iio

class mimo_receiver(gr.top_block):
    def __init__(self):
        gr.top_block.__init__(self)

        # Source MIMO - 2 canaux RX
        self.pluto = iio.fmcomms2_source_fc32(
            "ip:192.168.2.1",
            [True, True],  # RX1 et RX2 actifs
            32768
        )
        self.pluto.set_frequency(2400000000)  # 2.4 GHz
        self.pluto.set_samplerate(2000000)
        self.pluto.set_gain_mode(0, "slow_attack")
        self.pluto.set_gain_mode(1, "slow_attack")

        # Les deux canaux sont disponibles sur les sorties 0 et 1

Full-duplex (TX + RX simultané)

# Transpondeur simple
from gnuradio import gr, iio, blocks

class transpondeur(gr.top_block):
    def __init__(self):
        gr.top_block.__init__(self)

        # RX à 145.500 MHz
        self.rx = iio.fmcomms2_source_fc32(
            "ip:192.168.2.1", [True, True], 32768
        )
        self.rx.set_frequency(145500000)
        self.rx.set_samplerate(48000)

        # TX à 145.600 MHz (décalage +100 kHz)
        self.tx = iio.fmcomms2_sink_fc32(
            "ip:192.168.2.1", [True, True], 32768
        )
        self.tx.set_frequency(145600000)
        self.tx.set_samplerate(48000)
        self.tx.set_attenuation(0, 10)

        # Connexion RX → TX
        self.connect(self.rx, self.tx)

Ressources