International Space Station Tracker/Pointer

Written by: roboguru

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

Picture of 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

Picture of 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

Picture of 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

Picture of 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.