APRS0ISS: Automatic Frequency Switching Project for ISS Passes with Pi Zero 2 W and RTL-SDR
Shortly before starting amateur radio, I became interested in Software Defined Radio (SDR) due to various expectations like being able to visualize signals in the air, essentially “seeing” the FM radio broadcasts I’d listened to for years while tuning in. Before long, I bought a Chinese RTL-SDR radio with a USB interface and started using it.
After diving into amateur radio activities, my enthusiasm for radio listening with the SDR faded, and the device was eventually tossed into a drawer. It was destined for its eternal resting place—the infamous “box full of cables stored for a lifetime”—until I discovered APRS.
At the time I encountered APRS, there was no easily accessible digipeater or iGate station in my vicinity that I could reach with a handheld radio and its stock antenna. This prompted the question: “Why don’t I set up my own iGate station?” With that, the SDR and the Raspberry Pi Zero 2 W emerged from the drawer. Alongside Direwolf, it took on the role of our neighborhood’s “local tough guy,” serving as our iGate.
As someone who first got connected to the internet in the early 2000s, I get uneasy when I see an internet-connected device with a single purpose (in other words, sitting idle). I always think: Why shouldn’t it utilize its free time as well?
It was during one such moment that an idea sparked: Why shouldn’t the iGate listen to the ISS’s APRS frequency, 145.825 MHz, when it passes overhead? When there’s no pass, it could monitor our neighborhood on 144.800 MHz, but during a pass, it could tune into the ISS and push any captured packets to the internet. Like a parent, I didn’t want it to be withdrawn; I wanted it to both “play ball in the neighborhood” and “have friends abroad” :). Thus, the APRS0ISS project was born.
The hardware requirements for the project:
- Raspberry Pi Zero 2 W
- RTL SDR Dongle
The software requirements:
- Direwolf installed on Raspbian (or Raspberry Pi OS).
- The main control software to track ISS passes (my custom Python script).
- Two different Bash service files for listening to 144.800 MHz and 145.825 MHz.
- A Crontab entry for the automatic startup of the control software.
To track ISS passes in real-time, I first needed an API-supported service. I created an account on n2yo.com and obtained an API key. After registering and obtaining the key, you can find the API details at https://www.n2yo.com/api/. The website specifies hourly limits for API usage. While it emphasizes that a maximum of 100 queries can be made per hour for a specific location, querying for passes once every two days is sufficient for me, so I don’t even come close to the defined limit.
It is worth detailing the API’s function here: The API allows the main control software to determine the exact day and time of an ISS pass over my location (which I manually enter) by querying for the next two days.
You can find the detailed installation and configuration settings for the software in the README.md file I prepared on the APRS0ISS GitHub repository.
The system entered the testing phase and began logging on September 18, 2025. As seen from the log records below (or attached logs), the ISS was heard and recorded during every observable pass.
Unfortunately, while APRS.fi lists the stations heard by the ISS, it does not explicitly feature stations that hear the ISS, stating: “Only stations from which a position packet has been heard are shown here. The range statistics show some extra long hops, because some digipeaters do not correctly add themselves to the digipeater path. Please check the raw packets.”


The APRS0ISS project is now complete, and I hope it will be useful to others who wish to implement it. Please feel free to reach out with any questions, feedback, or criticism regarding the project. Until we meet again on another project!
If you wish to track my iGate in real-time, you can access it via TA1TEC-10.