Post Go back to editing

UNABLE TO USE THE FMCOMM BLOCKS IN GNU RADIO 3.10.5

Category: Software
Product Number: SN:00981 S21-0549

I HAVE TRIED ALL POSSIBLE INSTALLATION PROCEDURES BUT STILL GETTING THE IIO ERROR CONSISTENTLY. I HAVE USED THE FOLLOWING LINK TO INSTALL DEPENDENCIES AND THEN INSTALLED GNU RADIO 3.10.5.

https://wiki.analog.com/resources/tools-software/linux-software/gnuradio#download_and_build_libiio

AFTER THE INSTALLATION I AM FACING THE FOLLOWING ERROR:

<<< Welcome to GNU Radio Companion 3.10.5.0 >>>

Block paths:
/usr/share/gnuradio/grc/blocks

Loading: "/home/cipl/tyest1.grc"
>>> Done

Generating: '/home/cipl/tyest1.py'

Executing: /usr/bin/python3 -u /home/cipl/tyest1.py

Traceback (most recent call last):
  File "/home/cipl/tyest1.py", line 169, in <module>
    main()
  File "/home/cipl/tyest1.py", line 147, in main
    tb = top_block_cls()
  File "/home/cipl/tyest1.py", line 99, in __init__
    self.iio_fmcomms2_source_0 = iio.fmcomms2_source_fc32('ip:192.168.1.173', [True, True, False, False], 32768)
AttributeError: module 'gnuradio.iio' has no attribute 'fmcomms2_source_fc32'

>>> Done (return code 1)

PLEASE HELP WITH THE INSTALLATION PROCESS .

THANK YOU

Parents
  • Moved to Virtual Classroom for ADI University Program section.

    Thanks,
    Dragos

  • Can you provide the full python code?

    -Travis

  • #!/usr/bin/env python3
    # -*- coding: utf-8 -*-

    #
    # SPDX-License-Identifier: GPL-3.0
    #
    # GNU Radio Python Flow Graph
    # Title: Adalm-Pluto Radar
    # GNU Radio version: 3.10.4.0

    from packaging.version import Version as StrictVersion

    if __name__ == '__main__':
    import ctypes
    import sys
    if sys.platform.startswith('linux'):
    try:
    x11 = ctypes.cdll.LoadLibrary('libX11.so')
    x11.XInitThreads()
    except:
    print("Warning: failed to XInitThreads()")

    from PyQt5 import Qt
    from gnuradio import qtgui
    from gnuradio.filter import firdes
    import sip
    from gnuradio import analog
    from gnuradio import filter
    from gnuradio import gr
    from gnuradio.fft import window
    import sys
    import signal
    from argparse import ArgumentParser
    from gnuradio.eng_arg import eng_float, intx
    from gnuradio import eng_notation
    from gnuradio import iio
    from gnuradio.qtgui import Range, GrRangeWidget
    from PyQt5 import QtCore

    from gnuradio import qtgui

    class Radar(gr.top_block, Qt.QWidget):

    def __init__(self):
    gr.top_block.__init__(self, "Adalm-Pluto Radar", catch_exceptions=True)
    Qt.QWidget.__init__(self)
    self.setWindowTitle("Adalm-Pluto Radar")
    qtgui.util.check_set_qss()
    try:
    self.setWindowIcon(Qt.QIcon.fromTheme('gnuradio-grc'))
    except:
    pass
    self.top_scroll_layout = Qt.QVBoxLayout()
    self.setLayout(self.top_scroll_layout)
    self.top_scroll = Qt.QScrollArea()
    self.top_scroll.setFrameStyle(Qt.QFrame.NoFrame)
    self.top_scroll_layout.addWidget(self.top_scroll)
    self.top_scroll.setWidgetResizable(True)
    self.top_widget = Qt.QWidget()
    self.top_scroll.setWidget(self.top_widget)
    self.top_layout = Qt.QVBoxLayout(self.top_widget)
    self.top_grid_layout = Qt.QGridLayout()
    self.top_layout.addLayout(self.top_grid_layout)

    self.settings = Qt.QSettings("GNU Radio", "Radar")

    try:
    if StrictVersion(Qt.qVersion()) < StrictVersion("5.0.0"):
    self.restoreGeometry(self.settings.value("geometry").toByteArray())
    else:
    self.restoreGeometry(self.settings.value("geometry"))
    except:
    pass

    ##################################################
    # Variables
    ##################################################
    self.tx_att = tx_att = 70
    self.tone_freq = tone_freq = 500
    self.samp_rate = samp_rate = 2.304e6
    self.rx_gain = rx_gain = 20

    ##################################################
    # Blocks
    ##################################################
    self._tx_att_range = Range(0, 100, 1, 70, 200)
    self._tx_att_win = GrRangeWidget(self._tx_att_range, self.set_tx_att, "'tx_att'", "counter_slider", float, QtCore.Qt.Horizontal, "value")

    self.top_layout.addWidget(self._tx_att_win)
    self._tone_freq_range = Range(1, 1000, 1, 500, 200)
    self._tone_freq_win = GrRangeWidget(self._tone_freq_range, self.set_tone_freq, "'tone_freq'", "counter_slider", float, QtCore.Qt.Horizontal, "value")

    self.top_layout.addWidget(self._tone_freq_win)
    self._rx_gain_range = Range(0, 73, 1, 20, 200)
    self._rx_gain_win = GrRangeWidget(self._rx_gain_range, self.set_rx_gain, "'rx_gain'", "counter_slider", float, QtCore.Qt.Horizontal, "value")

    self.top_layout.addWidget(self._rx_gain_win)
    self.qtgui_time_sink_0 = qtgui.time_sink_c(
    1024, #size
    samp_rate, #samp_rate
    "", #name
    1, #number of inputs
    None # parent
    )
    self.qtgui_time_sink_0.set_update_time(0.10)
    self.qtgui_time_sink_0.set_y_axis(-1, 1)

    self.qtgui_time_sink_0.set_y_label('Amplitude', "")

    self.qtgui_time_sink_0.enable_tags(True)
    self.qtgui_time_sink_0.set_trigger_mode(qtgui.TRIG_MODE_FREE, qtgui.TRIG_SLOPE_POS, 0.0, 0, 0, "")
    self.qtgui_time_sink_0.enable_autoscale(False)
    self.qtgui_time_sink_0.enable_grid(False)
    self.qtgui_time_sink_0.enable_axis_labels(True)
    self.qtgui_time_sink_0.enable_control_panel(False)
    self.qtgui_time_sink_0.enable_stem_plot(False)


    labels = ['', '', '', '', '',
    '', '', '', '', '']
    widths = [1, 1, 1, 1, 1,
    1, 1, 1, 1, 1]
    colors = ['blue', 'red', 'green', 'black', 'cyan',
    'magenta', 'yellow', 'dark red', 'dark green', 'dark blue']
    alphas = [1.0, 1.0, 1.0, 1.0, 1.0,
    1.0, 1.0, 1.0, 1.0, 1.0]
    styles = [1, 1, 1, 1, 1,
    1, 1, 1, 1, 1]
    markers = [-1, -1, -1, -1, -1,
    -1, -1, -1, -1, -1]


    for i in range(2):
    if len(labels[i]) == 0:
    if (i % 2 == 0):
    self.qtgui_time_sink_0.set_line_label(i, "Re{{Data {0}}}".format(i/2))
    else:
    self.qtgui_time_sink_0.set_line_label(i, "Im{{Data {0}}}".format(i/2))
    else:
    self.qtgui_time_sink_0.set_line_label(i, labels[i])
    self.qtgui_time_sink_0.set_line_width(i, widths[i])
    self.qtgui_time_sink_0.set_line_color(i, colors[i])
    self.qtgui_time_sink_0.set_line_style(i, styles[i])
    self.qtgui_time_sink_0.set_line_marker(i, markers[i])
    self.qtgui_time_sink_0.set_line_alpha(i, alphas[i])

    self._qtgui_time_sink_0_win = sip.wrapinstance(self.qtgui_time_sink_0.qwidget(), Qt.QWidget)
    self.top_layout.addWidget(self._qtgui_time_sink_0_win)
    self.qtgui_freq_sink_0 = qtgui.freq_sink_c(
    1024, #size
    window.WIN_BLACKMAN_hARRIS, #wintype
    0, #fc
    samp_rate, #bw
    "", #name
    1,
    None # parent
    )
    self.qtgui_freq_sink_0.set_update_time(0.10)
    self.qtgui_freq_sink_0.set_y_axis((-140), 10)
    self.qtgui_freq_sink_0.set_y_label('Relative Gain', 'dB')
    self.qtgui_freq_sink_0.set_trigger_mode(qtgui.TRIG_MODE_FREE, 0.0, 0, "")
    self.qtgui_freq_sink_0.enable_autoscale(False)
    self.qtgui_freq_sink_0.enable_grid(False)
    self.qtgui_freq_sink_0.set_fft_average(1.0)
    self.qtgui_freq_sink_0.enable_axis_labels(True)
    self.qtgui_freq_sink_0.enable_control_panel(False)
    self.qtgui_freq_sink_0.set_fft_window_normalized(False)

    labels = ['', '', '', '', '',
    '', '', '', '', '']
    widths = [1, 1, 1, 1, 1,
    1, 1, 1, 1, 1]
    colors = ["blue", "red", "green", "black", "cyan",
    "magenta", "yellow", "dark red", "dark green", "dark blue"]
    alphas = [1.0, 1.0, 1.0, 1.0, 1.0,
    1.0, 1.0, 1.0, 1.0, 1.0]

    for i in range(1):
    if len(labels[i]) == 0:
    self.qtgui_freq_sink_0.set_line_label(i, "Data {0}".format(i))
    else:
    self.qtgui_freq_sink_0.set_line_label(i, labels[i])
    self.qtgui_freq_sink_0.set_line_width(i, widths[i])
    self.qtgui_freq_sink_0.set_line_color(i, colors[i])
    self.qtgui_freq_sink_0.set_line_alpha(i, alphas[i])

    self._qtgui_freq_sink_0_win = sip.wrapinstance(self.qtgui_freq_sink_0.qwidget(), Qt.QWidget)
    self.top_layout.addWidget(self._qtgui_freq_sink_0_win)
    self.low_pass_filter_0 = filter.fir_filter_ccf(
    50,
    firdes.low_pass(
    1,
    samp_rate,
    (tone_freq*2),
    250,
    window.WIN_HAMMING,
    6.76))
    self.iio_pluto_source_0 = iio.fmcomms2_source_fc32('' if '' else iio.get_pluto_uri(), [True, True], 32768)
    self.iio_pluto_source_0.set_len_tag_key('packet_len')
    self.iio_pluto_source_0.set_frequency(3500000000)
    self.iio_pluto_source_0.set_samplerate(int(samp_rate))
    self.iio_pluto_source_0.set_gain_mode(0, 'manual')
    self.iio_pluto_source_0.set_gain(0, rx_gain)
    self.iio_pluto_source_0.set_quadrature(True)
    self.iio_pluto_source_0.set_rfdc(True)
    self.iio_pluto_source_0.set_bbdc(True)
    self.iio_pluto_source_0.set_filter_params('Auto', '', 0, 0)
    self.iio_pluto_sink_0 = iio.fmcomms2_sink_fc32('' if '' else iio.get_pluto_uri(), [True, True], 32768, False)
    self.iio_pluto_sink_0.set_len_tag_key('')
    self.iio_pluto_sink_0.set_bandwidth((int(samp_rate/2)))
    self.iio_pluto_sink_0.set_frequency(3500000000)
    self.iio_pluto_sink_0.set_samplerate(int(samp_rate))
    self.iio_pluto_sink_0.set_attenuation(0, tx_att)
    self.iio_pluto_sink_0.set_filter_params('Auto', '', 0, 0)
    self.analog_sig_source_0 = analog.sig_source_c(samp_rate, analog.GR_SIN_WAVE, tone_freq, 1, 0, 0)


    ##################################################
    # Connections
    ##################################################
    self.connect((self.analog_sig_source_0, 0), (self.iio_pluto_sink_0, 0))
    self.connect((self.iio_pluto_source_0, 0), (self.low_pass_filter_0, 0))
    self.connect((self.low_pass_filter_0, 0), (self.qtgui_freq_sink_0, 0))
    self.connect((self.low_pass_filter_0, 0), (self.qtgui_time_sink_0, 0))


    def closeEvent(self, event):
    self.settings = Qt.QSettings("GNU Radio", "Radar")
    self.settings.setValue("geometry", self.saveGeometry())
    self.stop()
    self.wait()

    event.accept()

    def get_tx_att(self):
    return self.tx_att

    def set_tx_att(self, tx_att):
    self.tx_att = tx_att
    self.iio_pluto_sink_0.set_attenuation(0,self.tx_att)

    def get_tone_freq(self):
    return self.tone_freq

    def set_tone_freq(self, tone_freq):
    self.tone_freq = tone_freq
    self.analog_sig_source_0.set_frequency(self.tone_freq)
    self.low_pass_filter_0.set_taps(firdes.low_pass(1, self.samp_rate, (self.tone_freq*2), 250, window.WIN_HAMMING, 6.76))

    def get_samp_rate(self):
    return self.samp_rate

    def set_samp_rate(self, samp_rate):
    self.samp_rate = samp_rate
    self.analog_sig_source_0.set_sampling_freq(self.samp_rate)
    self.iio_pluto_sink_0.set_bandwidth((int(self.samp_rate/2)))
    self.iio_pluto_sink_0.set_samplerate(int(self.samp_rate))
    self.iio_pluto_source_0.set_samplerate(int(self.samp_rate))
    self.low_pass_filter_0.set_taps(firdes.low_pass(1, self.samp_rate, (self.tone_freq*2), 250, window.WIN_HAMMING, 6.76))
    self.qtgui_freq_sink_0.set_frequency_range(0, self.samp_rate)
    self.qtgui_time_sink_0.set_samp_rate(self.samp_rate)

    def get_rx_gain(self):
    return self.rx_gain

    def set_rx_gain(self, rx_gain):
    self.rx_gain = rx_gain
    self.iio_pluto_source_0.set_gain(0, self.rx_gain)


    def main(top_block_cls=Radar, options=None):
    if gr.enable_realtime_scheduling() != gr.RT_OK:
    print("Error: failed to enable real-time scheduling.")

    if StrictVersion("4.5.0") <= StrictVersion(Qt.qVersion()) < StrictVersion("5.0.0"):
    style = gr.prefs().get_string('qtgui', 'style', 'raster')
    Qt.QApplication.setGraphicsSystem(style)
    qapp = Qt.QApplication(sys.argv)

    tb = top_block_cls()

    tb.start()

    tb.show()

    def sig_handler(sig=None, frame=None):
    tb.stop()
    tb.wait()

    Qt.QApplication.quit()

    signal.signal(signal.SIGINT, sig_handler)
    signal.signal(signal.SIGTERM, sig_handler)

    timer = Qt.QTimer()
    timer.start(500)
    timer.timeout.connect(lambda: None)

    qapp.exec_()

    if __name__ == '__main__':
    main()

  • Can you manually specify the context as the IP of your Pluto? Are you able to access Pluto through IP of other tools like IIO-Scope?

    -Travis

  • Im getting the same error while just trying to rx in the FM demod tutorial

Reply Children