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:
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
t = time.time()
T =time.gmtime(t)
txt = strftime("%H:%M:%S", T)
txt = txt + "-start FTP upload"
PrintT(txt)
n = 0
while n < len(FTPfiles): # Print the file names to the Terminal screen for information
filename = FTPfiles[n]
PrintT(filename)
n = n + 1
name = "FTPuploads.txt"
Wfile = open(name,'w') # Open the file with settings and FTP files for the External FTP upload program
Wfile.write(FTPhost + "\n") # Save the FTP settings
Wfile.write(FTPuser + "\n")
Wfile.write(FTPdir + "\n")
Wfile.write(FTPpassword + "\n")
while n < len(FTPfiles): # Save the FTP file names
filename = FTPfiles[n]
Wfile.write(filename + "\n")
n = n + 1
PrintT("No FTP upload, FTP files stored in: " + name)
return # No FTP upload, return from this routine
AUDIOin()
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)
except:
PrintT("ERROR: Cannot connected and log in to FTP host")
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
#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
T =time.gmtime(t)
txt = strftime("%H:%M:%S", T)
txt = txt + "-end FTP upload"
PrintT(txt)