Remote SDR v4

“Remote SDR” or “SDR Distant” is a web application allowing to remotely control an amateur radio transceiver between 1 MHz and 6 GHZ. Its first application was the duplex control of a station allowing links to the geostationary satellite QO-100 / Es’Hail 2.

Remote SDR version 4.3 is available on Github.
New features as :

  • Additional audio input / output to connect an external application – SSTV, WSJT (FT8)…
  • Control by Omnirig CAT


  • SDR in reception:
    • RTL-SDR (example: NESDR SMArt from Nooelec) or,
    • HackRF One or,
    • Adalm-Pluto
  • Frequency: 1 MHz to 6 GHz (depending on the chosen SDR)
  • Spectral band processed: 2 MHz on 2048 points (depending on the chosen SDR)
  • Audio: 1 channel
  • Demodulation: NBFM, WBFM, AM, SSB or CW
  • Automatic band scan
  • Equalizer on the audio channel
  • Notch filter
  • Noise filter
  • Hardware:
    • HackRF One or,
    • Adalm-Pluto (common with the receiver) or,
    • NBFM VHF / UHF SA818 module from G-NiceRF
  • Frequency: 1 MHz to 6 GHz (depending on the chosen SDR)
  • Power: 1 dBm to 30 dBm (depending on the chosen SDR)
  • Audio: 1 channel
  • Modulation: NBFM, SSB or CW
  • Transmitter modulation compressor
  • Audio equalizer
  • CTCSS encoder
  • DTMF encoder
  • 1750 Hz encoder
  • Programmable frequency offset for relays
  • Automatic CW Manipulator (Iambic A and Iambic B)
Radio processing
  • Hardware:
    • Orange Pi Zero 2 or Orange Pi One Plus, or
    • Raspberry Pi 4B (2 GB)
  • Software:
    • Operating System: Armbian / Debian Bullseye
    • Web server: Apache 2
    • Signal processing: GNU Radio 3.8
    • Remote SDR (version v3 minimum)
      • Html
      • Javascript
      • Python 3
  • Network interface: wired Ethernet or WIFI
  • Interfacing with Gpredict to compensate the Doppler of low orbit satellites
  • Interfacing with GS-232 type rotator
  • Display and Audio: WEB page on PC, tablet or smartphone


Remote SDR – Adalm-Pluto – Raspberry 4
– Well-known RPI4
– Wifi or Ethernet
– 12 bits of Pluto dynamic
– poor stability in frequency of the Adalm-Pluto

May require the addition of an external oscillator and the extension of the Adalm-Pluto band.

Remote SDR – Adalm Pluto – Opi Zero 2 – Wifi
Avantages Disadvantages
– optimized for cost
– Wifi or Ethernet
– 12 bits of Pluto dynamic
– poor stability in frequency of the Adalm-Pluto

May require the addition of an external oscillator and the extension of the Adalm-Pluto band.

Mixed Configuration HackRF – RTL-SDR – Orange Pi Zero 2
RTL-SDR – HackRF One – Orange Pi zero 2
Avantages Disadvantages
– optimized for cost
– good frequency stability of the TX if a TCXO mounted on the HackRF One
– different frequency coverage of RX and TX
– RX frequency stability depends on the chosen RTL-SDR model
– 8 bits of SDR dynamic
Mixed Configuration HackRF – RTL-SDR – Raspberry Pi 4
Remote SDR – HackRF One and RTL-SDR – Raspberry Pi 4
Avantages Disadvantages
– Well-known RPI4
– good frequency stability of the TX if a TCXO mounted on the HackRF One
– different frequency coverage of RX and TX
– RX frequency stability depends on the chosen RTL-SDR model
– 8 bits of SDR dynamic
Configuration 2 Hack RF One
Remote SDR – 2 HackRF One – Raspberry Pi 4B
Avantages Disadvantages
– Well-known RPI4
– good frequency stability of the TX and RX if a TCXO mounted on the HackRF One or shared between them
– large frequency coverage
– 8 bits of SDR dynamic
Configurations RTL-SDR and SA818
VHF or UHF NBFM Transceiver
VHF and UHF NBFM Transceiver
Avantages Disadvantages
– cost around 100 €
– power 1w HF
– VHF 2m and/or UHF 70cm only
– only NBFM transmission, no SSB

Details on the one band transceiver here.

Details on the two bands transceiver here.

These configurations make it possible to locate the HF part near the antennas, which is essential for links above GHz. In the transmission chain, amplifiers must be added to bring the HF signal to the desired level as well as filtering to ensure that unwanted lines are not emitted. The SDR of the reception chain can be either an HackRF One, an RTL-SDR or a Pluto depending on the frequency band you want to cover. Not all RTL-SDR models cover the same band. The transmission reception is carried out in full-duplex which is essential during satellite connection to hear the return of its own signal.

As of today (October 2021), the Raspberry Pi 4B (2 GB) is a good solution, but there are supply difficulties. The “Orange Pi” are processors similar to the Raspberry Pi running under the Armbian or Debian Operating System. In 2020 I used the Orange Pi One Plus, now in 2021 the Orange Pi Zero 2 also offers a 64-bit / 4-core processor, but also an ethernet or wifi connection. They serve as a web server and perform radio signal processing.

Example Transceiver QO-100

F1ATB QO-100 Transceiver since May 2020

Example UHF Transceiver – Wifi – Orange PI Zero 2

New configuration with the Orange Pi Zero 2 which allows communication via WIFI. No more wired Ethernet link, only 220v near the transmitter / receiver.

Experimental 432 MHz (70 cm) transceiver

Note that you need a USB Hub between the Pluto and the Orange PI One Plus (not for the Orange Pi Zero 2). This corresponds to a system bug.

Code Source et Image

The source code and the image for Orange Pi and Raspberry Pi 4B are available on Github https://github.com/F1ATB/Remote-SDR .

Key points of Remote SDR

In addition to being able to locate the HF treatment near the antennas, other points should be noted such as:

Data rate reduction

An SDR like the Pluto requests 1.4 M samples / s (minimum) * 2 Bytes (16 bits) * 2 channels (I and Q) = 5.6 M Bytes / s for reception. It is the same for the emission. Which gives us more than 10M bytes / second.
With Remote SDR, output on Ethernet or WiFi requires:

  • 10 k samples / s * 2 bytes for the audio in reception
  • 10.24 k sample / s * 2 bytes for the received spectrum
  • 10 k sample / s * 2 bytes for transmit audio
    We are at less than 100 k bytes / s by adding the control data.

There is therefore a reduction of approximately 100 in the communication speed required, which facilitates remote control via internet / ethernet without loss of quality through data compression.

The mini remote computer

Indeed, we have a remote computer which has a GPIO to which it is possible to add functions. For example, controlling an antenna rotor, measuring electrical voltages, temperatures, etc., … It is possible to access the system via the web (Apache server), in SSH to launch an application in terminal mode, or in graphical mode by the desktop and VNC.

Posts Remote-SDR

Orange PI GPIO

Orange Pi Single Board Computer, similar to the famous Raspberry Pi, offer interesting characteristics, given the diversity of models offered.

Orange Pi PC2 H5
Orange Pi Zero

To access the GPIO of an Orange PI, you can use one of the libraries like OPI.Gpio. Unfortunately it does not cover all Orange PI card models. An alternative solution is the Sysfs virtual file system which allows system commands to activate the GPIO pins.

Orange Py PC2 H5 Connector

The PC2 H5 card has a 40-pin connector according to the diagram below.

To attack one of the input or output pins, you have to find the reference of the corresponding GPIO. The table below is valid for the Orange Pi PC2 H5. So if you want to use the physical pin 40, it corresponds to the GPIO 199.

3.3V1718PC7 (NAND_RB1)71

Orange Pi Zero H2 Connector

Orange Pi Zero
Orange Pi Zero Pins GPIO ref

Example Oscillator

For a given pin, there are 3 references:

  • the pin number: 1,2,3…
  • the functional name: PA00,PA01…
  • the GPIO reference: GPIO1, GPIO199….

With the Sysfs virtual files method, you need to know the GPIO number of the pin you want to activate. To do this, search the web for a diagram or a correspondence table.

Below is an oscillator program in python 3. It activates the GPIO199 which corresponds to pin 40 of an Orange Pin PC2 H5 or pin 10 of an Orange Pi Zero H2. Attention, important constraint. You must be root to access the GPIO.

#!/usr/bin/python3  Python 3 environment
#-- coding: utf-8 --
import os              # To execute system command
from time import sleep # this lets us have a time delay
print ("numgpio:"+numgpio)
os.system("echo "+numgpio+" > /sys/class/gpio/export")
os.system("echo out > /sys/class/gpio/gpio"+numgpio+"/direction")

         print ("Square signal around 50Hz . Press CTRL+C to exit")
         while True:
              os.system("echo 0 > /sys/class/gpio/gpio"+numgpio+"/value")
              os.system("echo 1 > /sys/class/gpio/gpio"+numgpio+"/value")

except KeyboardInterrupt:
         # set port/pin value to 0/LOW/False
         os.system("echo 0 > /sys/class/gpio/gpio"+numgpio+"/value") 
         # Clean GPIO
         os.system("echo "+numgpio+" > /sys/class/gpio/unexport")
         print ("Bye from F1ATB.")

to start it, if the program( test.py) is on your desktop:

python3 /home/user/Desktop/test.py

You can enter commands manually from a terminal window.
The …export command activates GPIO 199 which corresponds to pin 40.
The direction command, here out to be output.
The value commands alternately 0 or 1 to make an oscillator.

Then in case of Ctrl-C, we finish properly by releasing the GPIO 199.prement en libérant le GPIO 199.

To overcome the root problem, one solution may be to launch the program when starting up the Orange PI. Switch to root (sudo su) and open the cron jobs file by typing:

crontab -e

Put a line at the bottom of the file:
@reboot python3 /home/xxx/test.py

/home/xxx is the folder where your test.py file is located.

Summary of Sysfs Commands

On Armbian, you see the GPIO hardware exposed in the filesystem under /sys class/gpio.

$ ls /sys/class/gpio
export gpio199 gpiochip0 gpiochip352 unexport

There are the gpio currently used and the GPIO controllers noted “gpiochip”.

The basic steps to use a GPIO pin (here the 199 or pin 40 or 10) from the sysfs interface are as follows:

Activation Gpio199 :

$ echo 199> /sys/class/gpio/export

Pin as input:

$ echo in> /sys/class gpio/gpio199 direction

Pin as output:

$ echo out> /sys /class/gpio/gpio199/direction

Replaying the file to verify the current status :

$ cat /sys/class/gpio/gpio199/direction

Output state:

$ echo 0> /sys/class/gpio/gpio199/value


$ echo 1> /sys/class/gpio/gpio199/value

Reading value in input:

$ cat /sys/class/gpio/gpio199/value

Freeing Gpio:

If you are done using the GPIO pin, just write the pin name to the export file.

$ echo 199> /sys/class/gpio/unexport

The entry for gpio199 will no longer appear in sysfs:
$ ls/sys/class/gpio

Access with Python

The “shell” commands can be used in an application coded in python.

To issue a command such as the activation of a GPIO pin:
os.system(“echo 199> /sys/class/gpio/export”)

To read a state of a gpio pin, we will use file reading:


Beware of activating an output pin attacking a relay that goes “on” with a zero input. The latter will be stuck for a few ms between the passage of the output pin “out” and its setting to 1. To avoid this inconvenience, pass the 2 commands “out” and “1” to the system in a single instruction.

os.system("echo  out > /sys/class/gpio/gpio199/direction ;  echo 1 > /sys/class/gpio/gpio199/value")


  • A pin configured as an output can be read as input to know its state.
  • You cannot pull up or down (pullup, puldown) an entry.
  • This very general solution is applicable to all Orange Pi