I am trying to learn about how to talk to satellites and the ARISS via ham radio. What I am wondering is if there is an audio feature I can access for the azimuth. In the sun, I cannot really see the images on the laptop that well, so this would be helpful. I use Gpredict for a satellite tracking program. Any suggestions are always helpful, thank you very much in advance.


1 Answer 1


I just wrote you one.

One of the things Gpredict can do is control antenna rotators (via the hamlib driver library). In this case, you're the rotator, but hamlib can't handle that (as far as I know), so instead we'll use a program that pretends to be hamlib (more precisely, pretends to be rotctld).

Setup instructions (I'm going to assume you're on a unixy system and somewhat comfortable with it; if not I recommend finding someone to help you in person):

  1. Install Twisted, a Python library I used. It should be available through your favorite package manager as well as from their site.
  2. Install some text-to-speech software if you don't have any already.
  3. Change the line COMMAND = 'say' in my program to refer to whatever command your text-to-speech software uses (I hear espeak and spd-say are some other names; say is the command on Mac OS X).
  4. In Gpredict, go to Edit → Preferences → Interface → Rotators → Add New. Put in some name or other and leave the rest of the settings alone.

Usage instructions:

  1. Start my program.
  2. In the "module options" menu accessed by the little button in the upper-right corner of the main window, select Antenna Control. In the Antenna Control window:
  3. Set the Cycle and Tolerance values to control how often it speaks.
  4. Click the Engage button.
  5. Choose your target and click the Track button.

The program:

#!/usr/bin/env python

import os
from twisted.internet import protocol, reactor, endpoints
from twisted.protocols.basic import LineReceiver

COMMAND = 'say'

class RotctlEmulator(protocol.Protocol):
    def __init__(self):
        self.az = 0.0
        self.el = 0.0
        self.__line_receiver = LineReceiver()
        self.__line_receiver.delimiter = '\n'
        self.__line_receiver.lineReceived = self.__lineReceived

    def dataReceived(self, data):

    def __lineReceived(self, line):
        if line == 'p':
            self.transport.write('%.6f\n%.6f\n' % (self.az, self.el))
        elif line.startswith('P'):
            _p, azstr, elstr = line.split()
            new_az = float(azstr)
            new_el = float(elstr)
            self.transport.write('RPRT 0\n')
            self.update(new_az, new_el)
            print 'unrecognized:', line

    def update(self, new_az, new_el):
        # round to degrees
        new_az = int(round(new_az))
        new_el = int(round(new_el))

        if self.az != new_az or self.el != new_el:
            os.spawnlp(os.P_NOWAIT, COMMAND, COMMAND, '%s %s' % (new_az, new_el))
        self.az = new_az
        self.el = new_el

class Factory(protocol.Factory):
    def buildProtocol(self, addr):
        return RotctlEmulator()

endpoints.serverFromString(reactor, 'tcp:4533:localhost').listen(Factory())
  • $\begingroup$ Wow Kevin, I would have said 'try putting shades around the computer screen so you can see it better'. Your approach is a lot more thorough ;) $\endgroup$
    – rclocher3
    Jul 18, 2016 at 16:26

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .