PA3GUO Home-made Rotor Controller
Automated Satellite Tracking


Fast passing satellites like RS10/11, MIR, ISS, PCSAT, AO51 require groundstations
to 'follow' with their antenna systems rather quickly, these sats typically appear and
disappear within 10..15 minutes. In that period not only azimuth but also the antenna
elevation (potentially all the way form 0 to the maximum 90 degrees) needs to be adjusted.

This can be done manually, but if one also wants to make a contact at the same time it's much
more comfortable having an automated system is place that does this 'tracking' for you.

Basically it requires two systems:
- a system that (by using kepler sets) calculates the current position of the satellite
- a system that controls the antenna system (horizontal & vertical rotors)

Bertus, PE1KEH, and myself have made such a system ourselves back in 1997.
At that time there were a few, rather expensive and undocumented, other systems available:
the KansasCity tracker in combination with InstantTrack was one of them. None of them for free.
Of course we believed we could also do it ourselves, it looked technically quite challenging
and as a result it was very motivating.

In fact, I started with the antenna control system before, but did not get the full system in place
since I could not get InstantTrack to provide me real time position data (eg to RS232, memory or file).
We have every Sunday evening in our region a socalled "satelliet ronde" led by Nico, PA0DLO.
One evening I addressed my problem, and Bertus stated this should be 'fairly easy': the project was born !

Below you see the results of my part of the system:
a microcontroller based rotor controller system: it works in parallel to the existing rotor controllers:
    Left: power on/off LED and switch, and a microcontroler status 'initialized' LED
    Middle left: horizontal control part (automated tracking on/off, left/right switches + LEDs
    Middle right: vertical control part (automated tracking on/off, down/up switches + LEDs
    Right: RS232 rx and tx LEDs

Rear view:
    Left: RS232 connector
    Middle left: vertical rotor controller connections: gnd/down/up/analog (rotor position)
    Middle right: horizontal rotor controller connections: gnd/left/right/analog (rotor position)
    Middle: fuse
    Right: 220V power input

My system is rather simple: the potentiometer inside the rotor case provides an analog voltage varying
based on its position. For example the left max position can be 2V, its right max position could be 10V.
This voltage is via a potmeter on the micro-controller PCB adjusted to range to a maximum of 4V for
both the veritical and horizontal rotor. You see them on the picture below, next to the DIL dipswitches
that are used to connect/disconnect the analog inputs to/from the micro-controller. On the PCB you also
see an empty, not used DIL socket. The built-in ADC is then used to 'read' the positions based on these voltages.
Close to the rear connectors you see the four little black transistors that switch the relays that are added
to the original rotor controllers, see also the pictures further below.

Top left:
    220/12V transformer
Bottom left:
    12V PCB (using a simple 7805)
Middle / right:
    micro-controller PCB - in the middle the ST6, above that the 4 relay transistors, 7805 for 5V DC
    below the crystal, the MAX232 with its C's, and at the rigth the potmeters mentioned above.


These are my original rotor controllers, but any rotor that uses a potmeter to measure its position can be used:

Rear view: the four connections for down/up/right/ground/analog (potmeter 'position' voltage):

At the bottom you see the two relays that are used to switch the motor (up or down) on:

At the bottom you see the two relays that are used to switch the motor (left or right) on:

So far the 'hardware'. The micro-controller now first needs to be initialized and calibrated.
The rotor needs to be set to its left, and afterwards right max position. The micro-controller is then
instructed to read the analog values, which will be somewhere in the range 0..255 (integer value). With
these known values (hor_range = right_max - left_max level) the actual position can be read:

Current horizontal position is: 360 x (hor_level-left_max_level) / (hor_range)

These maximum positions are also used to prevent the controller moving the rotor beyond its maximum.
In the micro-controller the following tasks are done:
- read on PC request the analog (ver of hor) voltage and send it to the PC
- read from the PC the maximum position values and uses them as protection
- read a target ver of hor position (level) from the PC and move the rotor there

In the PC the following tasks are implemented in the program 'GUO_INIT':
- read the maximum values from file and store them in the micro-controller
- set the micro-controller after that to the state ínitialized (allows the PC to give move commands)

In the PC the following tasks are implemented in the program 'GUO_CTRL':
- read maxima and calibrate the system
- read the (ver of hor) position of the rotor and display it
- give a (ver or hor) position target and instruct the micro-controller to move the rotor there
With this I can via my network (eg a wireless laptop) control my rotors remotely.

In the PC the following tasks are implemented in the program 'GUO_FUNC', which is inserted in 'KEH-TRACK':
- read from the program 'KEH_TRACK' the current satellite position in degrees
- convert this degree (0..360 or 0..90) into a level (0..255)
- if (current rotor position) - (current satellite position) > threshold send a new position to the controller
This is the integrated PC software that with the micro-controller in the box using an up-to-date kepler file
tracks any satellite within a given threshold (0..5 degrees) accurately.

Below you see the complete system operational:

Was is really as simple as initially thought ?
No, not discussed above, but they are implemented, are some more items that appeared very important:
- thresholds are needed to avoid the system oscillating around a target position
- corrections need to be made due to overshoot (after a stop command the rotor takes time to actually stop

But they were all very simple to add, and we have had no serious issues during the implementation.
In fact, Bertus only visited me once during the whole project, all the rest was done by quite separately,
which means we had apparently defined a quite good interface between the two systems.

The results:
- KEH_TRACK by PE1KEH functions as a very basic but quite efficient program for satellite position calculation.
  (I used it to check NOVA during our ARISS contact in April 2004)
- GUO_CTRL by PA3GUO functions very well as a PC/digital control for most rotor systems like Kenpro/Yaesu

Both systems integrated perfectly implement a very accurate automated satellite tracking system.
Accuracy of the system (<5 degrees) is much better as the opening angle of my 145/440 beams.

The only minor: I used in Pascal a very basic, direct serial port command, which does not work under
Windows-XP, so until that is resolved my operating system will remain Windows-2000 professional.

For those interested:
All the PC software (PASCAL) functions