R2ZX 137MHz weather satellite receiver


R2ZX weather satellite receiverThe R2ZX
I initially used my Yaesu FT817ND to receive pictures from the NOAA weather satellites but results were rather poor due to the limited IF bandwidth. The R2ZX is a dedicated receiver for APT satellites with sufficient IF bandwidth to accomodate the full signal and additional IF filtering over the R2FX intended to reduce interference from pagers which operate in the same band in the UK. Compensation for doppler shift from the fast moving satellites is achieved by AFC.

The radio is tiny and is capable of operating from the 5v available from USB sockets so could be run portable with just an antenna and laptop. To run on 5v an internal jumper setting is needed which bridges out the inverse voltage protection diode. A polarity error when set like that could be costly as it may well destroy the radio – the instructions specifically warn against this and say the radio will be damaged.

Channel control is achieved by a small pushbutton on the front of the radio. Holding it in will start it scanning. Control is also possible via an RS232 connector and this is how I have mine set up so that the WXtoIMG software can switch to the correct channel for each pass.

One novel feature is the ability to run with two antennae (diversity) and the radio selects the strongest at any given time (it seems to check which to use at the end of each scanline). This is controlled by means of a supplied utility which uses the RS232 port or manually using telnet. The same mechanism is used to set the frequencies for each channel, signal level to halt scan, and audio output level – max 500mv which is fine for driving the line in on most computer soundcards.

Problems encountered
I found that using a vertical with the turnstile can produce poor results – it seems that although the vertical has a higher signal strength at low elevations there is a lot of interference too. When I tried to turn off diversity the utility failed and I had to use a telnet client to do this. I reported the problem and the author was aware of it already and promised a fix sometime.

The other problem is also associated with control via the RS232 port and is more annoying. Occasionally the radio fails to get swapped to the correct channel for the satellite pass. After investigating this using a port monitor it is obvious that WXtoImg is generating the commands too fast for the rudimentary serial port on the R2ZX to handle. This has been reported as a program bug and I’m waiting on a fix. As well as producing a useless image this error also spoils earlier composites. I have now modified the options so that the 2.4KHz pilot tone is required before recording starts.

Missed pass and destroyed composite

The only reason there is anything resembling a picture of the earth is the false colour routines in WXtoIMG applying different colours to presumed land and sea areas from knowledge of what the satellite should have recorded during the pass.

Just recorded noise     Composite ruined by missed pass

With no sign of a program fix I have produced what I hope is a permanent workround. In theory it should be possible to just echo to COM1: from a bat file but that didn’t work. Nor did Qbasic. I have found that Python does work. To talk to a COM port on Windows I found I had to download Python and pySerial which requiried Python windows extensions. Having installed that lot a simple little wxctl.bat file was written and put in the WXtoIMG directory to run the appropriate script (options/recording is used to specify this instead of the radio type).

Just runs my script passing on the parameter which specifies the satellite to record.

c:\Python25\python.exe c:\Python25\Scripts\wxctl.py %1

I have set my R2ZX to have channels 1,2,3 and 4 as the current satellite frequencies.

import sys
channel = '0'

if sys.argv[1] == "NOAA 18":
   channel = '1'
if sys.argv[1] == "NOAA 15":
   channel = '2'
if sys.argv[1] == "NOAA 17":
   channel = '3'
if sys.argv[1] == "NOAA 19":
   channel = '4'

if channel > 0:
   import serial
   ser = serial.Serial()
   ser.port     = 'COM1'
   ser.baudrate = 1200
   ser.bytesize = 8
   ser.parity   = 'N'
   ser.stopbits = 1
   ser.xonxoff  = 0
   ser.rtscts   = 0
   ser.timeout  = 1


This doesn’t overload the R2ZX port with data which the WXtoIMG program does sometimes and so far it has worked perfectly. It is very disappointing that the developer has put so much effort into the program yet is unable or unwilling to correct what appears to be the simple coding error of pushing data to the R2ZX faster than it can handle.

WXtoImg control of the R2ZX was fixed with R2.9.3 This release was primarily for NOAA 19 support and quickly superseded by R2.9.4 also for NOAA 19 support so presumably it didn’t work correctly initially.

Back to the script!! I decided to move my 24×7 operations to an EEE Box 202 which has no serial port. Having tried a number of cheap USB/RS232 cables from Hong Kong sellers on eBay none of which worked but were not worth returning I decided to invest in a £15 Lindy one from Misco when I bought the EEE Box. It worked a treat using HyperTerminal but WXtoImg screws up communicating through it. Fortunately my script works OK so I’ve added NOAA 19 and am running it again.

WXtoImg 2.10.8 The release notes mention further changes to the control of the R2FX/R2ZX.
Certainly the port monitor shows clear differences between how my R2ZX responds to commands from WXtoImg and those same commands typed in through Hyperterm. Typed in the radio responds and that response can be seen. There is no response shown to WXtoImg commands but testing shows that the radio does at least change reception frequency. I am using the R2FX setting rather than R2FX (early) or R2ZX which showed a garbage response to the M command issued (through Hyperterm M shows the radio status including which frequency each channel is set to receive). As I’m once again using a PC with a hardware serial port it’s back to WXtoImg control instead of the script.

A new reason to use the script again. I started using DropBox some time ago and have just realised that I can use it to back up my Cumulus and WXtoImg data so this won’t be lost if I have to do a system restore for any reason. Cumulus is fine as it simply stores everything in its own folder when installed within the DropBox folder. WXtoImg is rather different as it stores its log files in c:\Users\[username]\AppData\Roaming\WXtoImg\ when running Windows 7 (this may be true of Vista and Windows 8 too). This means that just backing up the data files is not quite enough to bring things back up to date from the DropBox archive after a system restore. What I’ve done now is install WXtoImg in the DropBox folder and set all the data directories to the WXtoImg folder too as this causes no conflicts and keeps everything in the one place.  I’ve added a folder I’ve named as appdata there and copied the data into it after each pass as follows.

A few seconds before the start of a pass and again after the pass is completed WXtoImg calls wxctl.bat again with “” as the parameter so I have amended wxctl.bat now to…

c:\python25\python c:\python25\scripts\wxctl.py %1
if %1=="" (
start "Backup Appdata" d:\dropbox\wxtoimg\backup.bat
) else (
echo %1 > d:\dropbox\wxtoimg\pass.txt


Calls the python script to change receiver channel (my slightly different script from that here sets the channel to the pager frequency which I sometimes monitor when there is no pass in progress).

Kicks off the backup script when no satellite parameter is passed and creates pass.txt when one is (i.e. a pass is starting).

The added backup.bat script….

if exist d:\dropbox\wxtoimg\pass.txt (
echo Waiting 150 seconds
ping -n 1 -w 150000 > nul
copy c:\users\mark\appdata\roaming\wxtoimg\*.* d:\dropbox\wxtoimg\appdata\
del d:\dropbox\wxtoimg\pass.txt

If no pass.txt is present the script simply exits – this is what will happen when wxctl.bat was called prior to a pass with just “” as the parameter.

Where a pass.txt is present a pass has just completed. A delay is necessary before backing up the to allow time for WXtoIMG to process the pass data and update its log files with the newly created files. The delay time obviously depends on processor speed and will need to be set by experiment.

Deletes the pass.txt file to show there is no outstanding backup required.

Installing Python
There are plenty of sites dedicated to the Python scripting language so I’ll only include very brief notes on this.

Download and install Python for Windows – www.python.org

Download and install Python Extensions for Windows – PyWin32 Project

To make life easier now is the time to add paths for the python executables and scripts to your path environment variable. Typically you’ll need to right click “My Computer” select properties then click advanced to find the environment variables. The current default you’ll need to add to the end of the path is ;C:\Python25;C:\Python25\Scripts;

Download and install EasyInstall for Python – Easy Install for Python

Use EasyInstall to download and install the pySerial package – open a command prompt (with run as administrator in Vista) and just type easy_install pySerial

Make sure that you get matching versions of Python, the Windows extensions, and EasyInstall. When I downloaded these to install on the EEE Box I found there was no executable for installing EasyInstall 2.6 just an egg package which I couldn’t get to install for some reason so I had to uninstall everything, download version 2.5 of everything and start again.

Some more serial interface commands
(copied from the supplied instruction manual)

The receiver has a serial RS232 interface. Through that it is possible to re-program the memory channels, control the receive frequency or read a RSSI value.

There is no particular software necessary for communication. Just use any terminal software like e.g. Putty.

The baudrate is 1200 bps, 8 data bits, 1 stop bit, no parity, no flow control. Each character you type on the keyboard will be echoed to the monitor. You need a 9 pin Sub-D cable for the connection between receiver and PC.

The syntax for controlling the frequency is easy…
You have to type in the sequence Cxyyy.
Here C means the capital C on the keyboard (ASCII code 43h).
x is the channel number and runs from 0 to 6. The numbers 1 to 6 corresponds to the memory channels 1 to 6. Entering a frequency on channel 0 causes the receiver to jump to that frequency immediately without saving it to any memory location. This is a way e.g. to make a fast programmed scan by the PC.
yyy is the 3-digit frequency value starting with the 1MHz digit and having 10kHz resolution. I.e. 750 means 137.500MHz or 782 is the code for 137.820 MHz. 999 is the highest value and sets the receiver to
139,990MHz. However it is not guaranteed that the PLL still locks on that channel. The lower limit is 400 which means 134.000 MHz.

Entering a M will respond with the frequency allocation table.

With R the receiver returns the current RSSI value. This value is a measure for the received signal strength. It runs from 0 with no signal to an upper limit of approximately 100. The absolute value does not mean much however the slope is well defined and is related accurately to the logarithm of the input voltage.

The entry of Txx determines the threshold value where the scanner stops. xx is an integer number between 00 and 99 and corresponds to the value you get with the R command. Reasonable values lay between 10 and 50. The initial value is 16. This function is useful if you operate the receiver in environments where RF noise exists which otherwise would render the scanner to stop.


 Leave a Reply