The grabber is made from a simple SDR kit, the Soft66Lite, a Behringer UCA202 USB sound card. The SDR receiver is SDR# and the FFT processing and display software is PA2OHH's excellent analysis program LOPORA. The SDR radio has a crystal frequency of 20.250Mhz with a piece of copper soldered to it, inside a homebrew crystal oven.

20 minute grab

24h Archive:
00:00 - 00:20 - 00:40 - 01:00 - 01:20 - 01:40 - 02:00 - 02:20 - 02:40 - 03:00 - 03:20 - 03:40 - 04:00 - 04:20 - 04:40 - 05:00 - 05:20 - 05:40 - 06:00 - 06:20 - 06:40 - 07:00 - 07:20 - 07:40 - 08:00 - 08:20 - 08:40 - 09:00 - 09:20 - 09:40 - 10:00 - 10:20 - 10:40 - 11:00 - 11:20 - 11:40 - 12:00 - 12:20 - 12:40 - 13:00 - 13:20 - 13:40 - 14:00 - 14:20 - 14:40 - 15:00 - 15:20 - 15:40 - 16:00 - 16:20 - 16:40 - 17:00 - 17:20 - 17:40 - 18:00 - 18:20 - 18:40 - 19:00 - 19:20 - 19:40 - 20:00 - 20:20 - 20:40 - 21:00 - 21:20 - 21:40 - 22:00 - 22:20 - 22:40 - 23:00 - 23:20 - 23:40

Stacked grabs


Stacked 6x average values 20 minutes


Stacked 12x average values 10 minutes

24h Archive average stacked 10 minutes:
00:00 - 00:20 - 00:40 - 01:00 - 01:20 - 01:40 - 02:00 - 02:20 - 02:40 - 03:00 - 03:20 - 03:40 - 04:00 - 04:20 - 04:40 - 05:00 - 05:20 - 05:40 - 06:00 - 06:20 - 06:40 - 07:00 - 07:20 - 07:40 - 08:00 - 08:20 - 08:40 - 09:00 - 09:20 - 09:40 - 10:00 - 10:20 - 10:40 - 11:00 - 11:20 - 11:40 - 12:00 - 12:20 - 12:40 - 13:00 - 13:20 - 13:40 - 14:00 - 14:20 - 14:40 - 15:00 - 15:20 - 15:40 - 16:00 - 16:20 - 16:40 - 17:00 - 17:20 - 17:40 - 18:00 - 18:20 - 18:40 - 19:00 - 19:20 - 19:40 - 20:00 - 20:20 - 20:40 - 21:00 - 21:20 - 21:40 - 22:00 - 22:20 - 22:40 - 23:00 - 23:20 - 23:40


Stacked 6x peak values 20 minutes


Stacked 12x peak values 10 minutes

24h Archive peak stacked 10 minutes:
00:00 - 00:20 - 00:40 - 01:00 - 01:20 - 01:40 - 02:00 - 02:20 - 02:40 - 03:00 - 03:20 - 03:40 - 04:00 - 04:20 - 04:40 - 05:00 - 05:20 - 05:40 - 06:00 - 06:20 - 06:40 - 07:00 - 07:20 - 07:40 - 08:00 - 08:20 - 08:40 - 09:00 - 09:20 - 09:40 - 10:00 - 10:20 - 10:40 - 11:00 - 11:20 - 11:40 - 12:00 - 12:20 - 12:40 - 13:00 - 13:20 - 13:40 - 14:00 - 14:20 - 14:40 - 15:00 - 15:20 - 15:40 - 16:00 - 16:20 - 16:40 - 17:00 - 17:20 - 17:40 - 18:00 - 18:20 - 18:40 - 19:00 - 19:20 - 19:40 - 20:00 - 20:20 - 20:40 - 21:00 - 21:20 - 21:40 - 22:00 - 22:20 - 22:40 - 23:00 - 23:20 - 23:40

Long time grabs


8 hours

8 hours archive: 00:00 - 08:00 - 16:00


24 hours

24 hours archive: 1 - 2 - 3 - 4 - 5 - 6 - 7 - 8 - 9 - 10 - 11 - 12 - 13 - 14 - 15 - 16 - 17 - 18 - 19 - 20 - 21 - 22 - 23 - 24 - 25 - 26 - 27 - 28 - 29 - 30 - 31

Receiver hardware

The crystal oven was attached to the underside of the PCB. The crystal was folded over, grounded at one end, then a piece of copper was soldered on top. A 50R thermistor and two 100R resistors were glued to the copper. The control circuit is very simple, the 50R thermistor, 220 ohm and 47 ohm resistors form a potential divider across the 5V supply. The 47 ohm resistor raises the voltage across the thermistor so the transistor switches off at a hotter temperature. This turns on and off the 2SC1815 transistor which controls the 12V supply to the heater resistors. With a 100R thermistor and a single heater resistor, the component count could be reduced to four. A small plastic case made from scraps was glued together and placed over the circuit.

The following two photos show the SDR receiver connected up on the workbench and the development setup.

The grabber was installed into a small aluminium case, the same type as the beacon.

The antenna is an active type based on this design http://www.vlf.it/poggi4/stealthantenna.html

Current hardware status:

Stable at last!! Now experimenting with antennas to find something that is low visual impact, high SNR and compatible with other antennas here.

LOPORA install notes:

LOPORA can be a pain to install, not because of the program itself, but because of pyaudio and portaudio. The automated installers don't work using regular python 3 and pip. I tried to get it all working, it required a huge install of a Visual Studio SDK and compiler and still didn't work. Also you have to choose versions of python and the libraries that work together. It's a nightmare. This is how to get it working in a painless way:

- Download LOPORA and unpack it
- Install Anaconda, specifically miniconda: https://conda.io/miniconda.html
- Run 'Anaconda Prompt' as administrator
conda install pillow numpy paramiko pyaudio
cd 'wherever-you-unpacked-it'
LOPORA-v5a.py

I modified LOPORA for SFTP capability, using the paramiko SFTP library. Here is the replacement function:

def FTPupload():
    global DOFTP
    global FTPfiles
    global FTPhost                      # FTP host
    global FTPuser                      # FTP user
    global FTPdir                       # FTP remote directory
    global FTPpassword                  # FTP password
    global WORKmap                      # The map where the files are
   
    if DOFTP == 0:                      # Extra test
        return
    AUDIOin()
   
    t = time.time()
    T =time.gmtime(t)
    txt = strftime("%H:%M:%S", T)
    txt = txt + "-start FTP upload"
    PrintT(txt)
    PrintT("Files to be uploaded to FTP:")
    n = 0
    while n < len(FTPfiles):            # Print the file names to the Terminal screen for information
        filename = FTPfiles[n]
        PrintT(filename)
        n = n + 1
    if DOFTP > 1:                       # No FTP upload, save WORKmap name, FTP settings and FTPfiles to FTPuploads.txt
        name = "FTPuploads.txt"
        Wfile = open(name,'w')          # Open the file with settings and FTP files for the External FTP upload program
        Wfile.write(WORKmap + "\n")     # Save the workmap
        Wfile.write(FTPhost + "\n")     # Save the FTP settings
        Wfile.write(FTPuser + "\n")
        Wfile.write(FTPdir + "\n")       
        Wfile.write(FTPpassword + "\n")       
        n = 0
        while n < len(FTPfiles):        # Save the FTP file names
            filename = FTPfiles[n]
            Wfile.write(filename + "\n")
            n = n + 1
        Wfile.close()                   # Close the file
        PrintT("No FTP upload, FTP files stored in: " + name)
        return                          # No FTP upload, return from this routine
    ##### Start FTP upload routine if DOFTP == 1
    AUDIOin()
    transport = None
    sftp = None
 
    try:
        # ftp = ftplib.FTP(FTPhost, FTPuser, FTPpassword)           # Open the FTP connection for file uploading with the default time out, works OK for me
       
        transport = paramiko.Transport((FTPhost, 22))          #FTPuser, FTPpassword, cnopts=cnopts)    
        transport.connect(username = FTPuser, password = FTPpassword)
        sftp = paramiko.SFTPClient.from_transport(transport)
        PrintT("Connected and logged in to FTP host")
    except:
        PrintT("ERROR: Cannot connected and log in to FTP host")
    if (sftp):
        AUDIOin()
        # Change FTP directory
        try:   
            if FTPdir != "":
                sftp.chdir(FTPdir)
                txt = "Changed to remote directory: " + FTPdir
                PrintT(txt)
        except:
            PrintT("ERROR: Cannot change to remote directory: " + FTPdir)
           
        # Upload the files
        n = 0
        while n < len(FTPfiles):
            AUDIOin()
            filename = FTPfiles[n]
            storedname = WORKmap + filename
            try:           
                #fup = open(storedname, 'rb')                        # Open the file of the picture to be uploaded
                #ftp.storbinary("STOR " + filename, fup, 8192)       # Store the file (picture)
                sftp.put(storedname, filename)
                #fup.close()
                PrintT(filename + " uploaded")
            except:
                PrintT("ERROR: " + filename + " upload FAILED")
            n = n + 1
    try:
            sftp.close()
            transport.close()
    except:
        pass
    AUDIOin()
    t = time.time()
    T =time.gmtime(t)
    txt = strftime("%H:%M:%S", T)
    txt = txt + "-end FTP upload"
    PrintT(txt)



Add comment


Security code
Refresh