Friday, 3 January 2014

Another Day Another Arduino Project

Yes another day, another Arduino project (seriously this is a great development environment)

As I mentioned in passing yesterday I have a number of Arduino based projects buzzing around in my head. One of them is to produce a satellite antenna pointer/indicator.

I have used an Android AR tracking solution before (flaky at best) and can see the relevant information in Orbitron or SatPC32 to know where to point the antenna but it is difficult to see a PC screen when stuck out in the middle of the lawn!

My idea is this, I will make a large tripod to which I can attach appropriate antenna as I need, then during the satellite pass it has indicators to show where to point the antenna manually.

I envisage the azimuth indicator to be a large horizontal circle with 36 LEDs positioned at 10 degree intervals, the elevation will be a quarter circle with 20 LEDs positioned at 5 degree intervals. Then during the pass the appropriate LEDs will light and assuming I keep the antenna aligned to these I should in theory get the best signal... Crazy??

Yes I know I could make or buy an azimuth/elevation rotator, eBay is full of low speed high torque geared DC motors with auto-stop/hold and numerous software solutions exist to drive them but this would require a bit more engineering and isn't something I can easily fabricate at the moment. My contraption would be much more rustic being made of rough cut timber!

Bright LEDs are ridiculously cheap and controlling this number from the Arduino will require the use of multiplexer drivers. The popular ones are the MAX 7219/7221

I won't go into the details of exactly what multiplexing is, other than to say that each display element (LED) is driven one at a time but by switching the electronics at high speed combined with the persistence of vision make the viewer believe the entire display is continuously active.

This technique can be used for individual LEDs, an LED grid matrix, or for 7 segment displays. Last night I successfully got a MAX7219 based 8-Digit 7-Segment LED module working.

The next stage was to investigate how an Arduino could calculate the appropriate azimuth and elevation data. Thankfully a library already exists qrpTracker (code is here), within this library is a port of the Plan-13 algorithm first written in Basic by James Miller G3RUH in 1990, subsequently ported to C by Edson Pereira, N1VTN and further updated by Howard Long, G6LVB.

Plan-13 processes keplerian elements, time and (optionally) observer location, and uplink downlink frequencies; it outputs satellite latitude and longitude, azimuth and elevation, and Doppler shifted frequencies. At the standard 16 MHz Arduino clock speed, this code can complete these calculations in approximately 30 ms. This code is reported to be highly accurate, if provided with proper data.

The important data are the observer location (longitude/latitude) and the current time. Step forward my well used GPS module which once lock is achieved can supply that data.

The next is get the appropriate up to date Keplerian twin element sets (TLE) and extract the appropriate information from it and pass that data to the Plan-13 functions.
The standard TLE follows the following format

You need to extract the Epoch Year/Day (including partial data), Inclination, Right Ascension, Eccentricity, Perigee, Mean anomaly and Mean Motion for a calculation (drag/orientation aren't critical) For the moment I have just extracted this manually from the latest TLE and entered it directly into the program.

After just an hour or so of research and programming I have the LED displaying the current azimuth and elevation of the FUNCube-1 satellite (AO73) based on the current position and time derived from the GPS!

The first four digits is the azimuth, the second four the elevation.

The next stage is to sort out the LED disc indicators, build the antenna tripod and formulate a method to upload the appropriate up to date TLE files from the PC which can be stored in the EEPROM of the micro-controller.

1 comment:

Andrew Stancliffe said...

This is exactly what I am trying to archive but with very little success
I am using tinygps++ and reading Lon and lat and bearing to astra2 sat along with land based distance via the serial interface
I am using IDE 1.5.5 could you be so kind as to share the sketch and library as this would really stop me pulling out my hair