I’m a long-time space buff and satellites amuse me no end. I will always go out for a space station flyover and I’ve eagerly watched for other satellite passes and iridium flares from Heavens-Above. I had no luck with either so I was excited when I saw people building space station pointers figuring I could use something similar to point to satellites and flares more generally. So, six months later, I have a prototype that serves me well. I can usually spot five or six satellites in an evening and Iridium flares are dead easy.
The heart of the hardware is a couple of hobby servos. The Azimuth servo pans left/right with zero degrees being North and the Altitude servo tilts up and down with zero degrees being the horizon in front,90 degrees being straight up , and 180 degrees being the horizon behind. The azimuth servo is made by futaba and sold by Parallax and has a full 180 degree swing. The Altitude servo is a hitec HS-55 which is lightweight and has a range of about 155 degrees. The combination lets me point anywhere from about 12 degrees above the horizon in any direction. Attached to the altitude servo is a plastic pen barrel with a couple of SMD leds threaded into it. These are powered steadily just to let me see where the pointer is.
There’s also a SparkFun DeadOn real time clock using a DS3234 chip coupled to the Modern Electronics Really Bare Bones Board which runs the show.
The heart of the Software is a library called Plan 13 credited to VE9QRP based on an ancient BBC Basic program written by James Miller. I also use the TimeDate library, Variable Speed Servo library, the Streaming macros and a bunch of the standard ones. Much thanks to the authors.
The prototype runs attached to my laptop which is providing power and monitoring. The laptop also prepares the observing plan using Python scripts to download the data from the Heavens-Above web site – much thanks to them as well.
I haven’t bothered with a schematic because it’s just breadboard connections and a single power supply. I'll post he sketch but it’s my usual, over-thought, under-documented codestravaganza.
The trickiest thing it seemed to me was translating the altitude and azimuth directions given by the plan13 software into pulse widths the servos could eat. I had to worry about the physical limits of the servos and the corresponding pulse widths and switching altitude calculations when the azimuth is “behind” the servos – for example, when the calculation says the satellite is due south and 30 degrees up, I have to point the azimuth server north and run the altitude servo to 180-30 degrees. Add to that the fact that servo makers don’t publish much in the way of specs and the fact that the Futaba servers run backwards compared to the hitec and it’s just a LOT of fun to figure out.
One neat thing in the code is that I started with a command loop driven program where I could put in single character commands like ‘x’ to move the servo to maximum, ‘n’ for minimum. When I needed to get numeric parameters in I cobbled up a little postfix parser so I could put in things like 0,z 30,a to point to 0 azimuth 30 altitude or 18,30,0 19,9,30 l to set the time to 6:30 pm. No error checking of course but really handy in development.
The data to drive a night’s observing session comes from the Heavens-Above web site and is in two parts: There’s an observation plan that lists start and stop time for the satellite passes along with the satellite id and a series of NORAD TLE(two line element) records that define the satellite orbits. Both of these sets of data are compiled into the program as raw ascii and stored in progmem where the sketch peels them out and converts the times and parameters to numeric values. I could have compressed the data and saved the conversion but I want to keep things as transparent as possible. The overall sketch with TLE’s is bulging near the atmega328’s 30K limit though so I may have to compress the data or offload it to an SD card. On the other hand, I have a sanguino somewhere so maybe that…
When it's running autonomously the program picks the first line out of the plan something like "19:44:19 19:55:33 31793" //SL-16 2.7. It waits for the start time then picks out the satellite number ( 31793) and goes through the TLE's looking for it. It loads the orbit data into Plan13 then goes into an update loop where it calls the Plan13 code and moves the servos to point to the location. The pointing is surprisingly close and works very well. One "trick" i used was to ask plan13 for the position where the satellite would be three seconds ahead and point to there before delaying.
I’ve downloaded a couple of iPhone apps that do similar things and they’re cute but I’m still happy with my effort and I plan to continue poking at it. I need a power supply and display separate from my laptop and some sort of box for transport. I’m thinking of a nice wooden box with either drop sides or a flippable lid so the servo mechanism can sit on top. I’d like to integrate a compass, preferably electronic but I’m not sure about accuracy – my iphone compass sucks. I have a 5mw green laser on order and I’ll try a live pointer but the laser does make me nervous. I have an atmel butterfly board somewhere that could maybe be the display. On the software front, the accuracy and pointing are fine now and I need to work on command and control: keeping lists of objects other than satellites to point at, being able to interrupt a satellite track temporarily to point at something else etc.