International Space Station Tracker/Pointer


Introduction: International Space Station Tracker/Pointer

About: Grady Hillhouse is a professional civil engineer and hobbyist everything else.

There’s a growing movement of people who believe that our space agencies are underfunded and that humanity isn’t paying enough attention to our present accomplishments and future plans in space exploration. Well, I know one way to direct attention to something: Point at it. This is the first prototype of the International Space Station orbit tracking pointer. If that name isn’t explanatory enough, its one job is simply to point directly at the ISS wherever it is in space, a small but constant reminder of what humanity is capable of.

Watch the YouTube video for a quick intro to the project!

Rough parts list:

Step 1: Code

All the code I used for the project can be found at the project repository on GitHub. The code compiles using mbed on the Nucleo F401RE development board.

To use the code, follow the steps below.

1. Create an mbed account at

2. On the GitHub repository, click the "Save Zip" button and download to your hard drive.

3. On mbed, click the "Import" button, then the "Upload" tab. At the bottom, click the "Choose File" button and navigate to the zip file. Click the "Import!" button to import the code as a program in your mbed workspace.

4. You will also need the import the mbed library to your program. Under the import wizard, navigate to the "Libraries" tab, search "mbed", and drag the official mbed library to your program workspace on the left.

5. In the "main.cpp" file, edit the set_time variable on line 68. This is the time that the board will assume every time it is powered up (this is the biggest limitation of the prototype - that it does not have a persistent clock). This value is in Unix time, so you can use to find the current time or convert a time in the future.

6. Also in "main.cpp," enter in the two-line element set of the satellite you wish to track on lines 90 and 91. For the International Space Station, you can use the first entry on this page:

7. Finally, enter your location details into the variables on lines 94 through 96.

8. Compile "main.cpp" using the "Compile" button and save the build file to your Nucleo board.

Step 2: Assembly

For the pointer itself, you only need a stepper motor for azimuth control and a 180 degree servo for elevation. How it looks is up to you! I used a wooden base, and aluminum Actobotics parts to make everything look nice. Everything bolts together, so it’s great for prototyping, and if I get tired of it, I can just take it apart and build something new. I also used a slip ring so that the main shaft can spin indefinitely without twisting up the servo wires. The slipring I bought needed to be "adjusted" so it could fit in the shaft. I used my wood lathe for this, which I'm pretty sure was a violation of the warranty.

Note that if you change the gearing ratio for the stepper motor, you will also need to adjust the code to account for the change.

Step 3: Wiring

Wiring is pretty straightforward.

1. Put the Adafruit motor shield on top of the Nucleo board.

2. Connect the stepper motor to M1 on the motor shield.

3. Connect the servo to S1 on the motor shield.

4. Connect a 9 or 12 volt power supply to the power terminal block on the motor shield.

5. Wire a resistor of 5 to 10 kOhm between pin 4 and the 3.3v pin on the motor shield. Repeat with pin 5. These are pull up resistors for the i2c signal pins (how the motor shield communicates with the Nucleo board).

6. Cut the trace on the motor shield that goes to 5 volts for logic, and solder a jumper to allow the board to run on 3 volt logic.

Step 4: Powering Up

Before powering up, point the arm at true north. The stepper motor doesn't have feedback to know which way it's pointing so it needs to be initialized. Remember that when you power up the board, it assumes the time you have coded into it.

The ISS orbits the earth every 90 minutes so the speed of motion is roughly on the order of a minute hand on a clock: slow enough that it’s not really interesting to watch it, but fast enough that it’s in a new place every time you glance over.

Step 5: Improvements

As I've noted, this is just a first prototype, a proof of concept, and it's not extremely functional or user-friendly. Things I’d I would include in version 2.0:

  • A real time clock with a battery backup. Right now I have to hardcode the time, which means any time power is disconnected, the time needs to be recoded. This is probably the biggest limitation of the system.
  • Switch the servo out with another stepper motor. Having to flip 180 degrees is cumbersome and makes the motion not as smooth. You'd have to have some kind of feedback for this though.
  • Internet connectivity to automatically download the latest orbital data. Right now, the two line element set for the ISS is hardcoded. Just for the sake of accuracy, it would be nice to be able to have the latest parameters as they come out. This would also allow you to track satellites other than the ISS.
  • LCD screen to show relevant information - azimuth and elevation, epoch, straight line distance, etc.

A few of these features have been implemented in a version of the device created by Patrick Ferrell.

For more info, visit my website or YouTube channel.

Digital Life 101 Challenge

Runner Up in the
Digital Life 101 Challenge



    • Creative Misuse Contest

      Creative Misuse Contest
    • Water Contest

      Water Contest
    • Oil Contest

      Oil Contest

    38 Discussions

    A really great project that I would like to build but I am stuck for a parts list for Actobotics. Does anyone have one? Also the author talks of a second version which would have a real time clock and that would help. Any news on that?

    Hi, it is a really nice project and I am trying to reproduce it. I just would like to know how do you do to run the Nucleo board without having it connected to à PC?
    Thank Grady I am a big fan of your work!

    Great project. I'm thinking of making one for the science museum where I volunteer.

    Can you give any more detail on the slip-ring arrangement you used? Did you buy or build?

    2 replies

    I used this:

    I think a homemade slip ring wouldn't be too hard, but just keep in mind that it's not just for power, but signal as well, so it has to be a really good connection.

    I'm hoping to make this for a school project and have little robotics experience. Is it possible to get a more details kit/item list? Thank you.

    Very cool... I know my son would love to build this (Big Space Nut) But he is into the Arduino Boards and I know I would need to help with that part. Has anyone done or have you done an Arduino based design at all?

    1 reply

    The Arduino Uno does not have the memory to hold all the code. The Arduino Mego board could probably handle it just fine.

    A great project,I was thinking could this be modified for a solar tracker that could charge say phones etc .

    Is it a idea that could consider.


    this mechanical SETUP can also work for an antenna tracker for FPV RC plane or helicopter

    this mechanical SETUP can also work for an antenna tracker for FPV RC plane or helicopter

    Have you thought or adapting this for tracking celestial objects? I might give this a try as I would find it useful for astrophography.

    1 reply

    Most celestial objects move at the same speed, so it's not as necessary to have a microcontroller running the show. Also, for astrophotography, you would probably want an equatorial mount for smoother motion. My recommendation if you want to construct an astrophotography mount would be to find something commercially available and try to copy it.

    I'm not frightened by the concept of building a robot from scratch, but navigating GitHub gives me the heebejeebees.

    1 reply

    Haha I know what you mean. I tried to give exact steps so you would know exactly what to do. It's basically just clicking a single button to download all the files.

    Great project!

    I'm working on something similar, different application though. I was wondering why you have chosen for a stepper motor and a servo? Why not 2 of either one?

    4 replies

    I did a stepper for the azimuth so it could do full rotation. I did a servo for elevation since it has internal feedback and doesn't need to be initialized.

    For my tracking device, 90 degrees suffices, hence I use 2 digital servos. However, at its lowest speed (90 degrees in 7.5 sec) the servo movement is rather coarse. I'm thinking that this might be caused by the PWM therefore I'm considering to rewrite my program to use AVR timer interrupts directly.
    Somewhere in the back of my mind, I'm thinking that a stepper motor might run smoother? On the other hand 1200 pulses in 7.5 seconds should give a smooth movement. What are your thoughts?

    The stepper I used has 200 steps per revolution. Most stepper motor drivers can do microstepping, so you can get quite a bit more resolution out of the motor. Plus I geared down at about 4:1, so the stepper resolution is really good (perhaps 4-6 discrete steps per degree of azimuth).

    Great video, excellent project, well done!!

    Alan Knight