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
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):
- Install Twisted, a Python library I used. It should be available through your favorite package manager as well as from their site.
- Install some text-to-speech software if you don't have any already.
- Change the line
COMMAND = 'say'
in my program to refer to whatever command your text-to-speech software uses (I hearespeak
andspd-say
are some other names;say
is the command on Mac OS X). - 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:
- Start my program.
- 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:
- Set the Cycle and Tolerance values to control how often it speaks.
- Click the Engage button.
- 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):
self.__line_receiver.dataReceived(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)
else:
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())
reactor.run()
-
$\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$ Commented Jul 18, 2016 at 16:26