Skip to main content
Building an ADS-B Ground Station with a Raspberry Pi and PiAware

Building an ADS-B Ground Station with a Raspberry Pi and PiAware

·1144 words·6 mins
Sujal Shah
Author
Sujal Shah
I am a startup veteran & technology executive with a focus on sports, media, and entertainment. I help companies build great software products and teams. I also write about technology, innovation, and random electronics projects.
Table of Contents

Airplanes in the United States, with some exceptions, broadcast their position, call sign, and some limited telemetry using a technology called Automatic Dependent Surveillance - Broadcast, otherwise known as ADS-B. It’s an open, unencrypted standard, so can be easily read by anyone with an interest in tracking airplanes.

Now, I’m a nerd, and I get interested in random things like this for the heck of it. I was already working on a radio-based project, so was already solving the outdoor mounting and antenna problems. I also love air travel. If you’ve ever looked at a map of all the airplanes currently in the air, it’s awe-inspiring. Beyond that, running a station and sharing the data with FlightAware gets you a free enterprise FlightAware account - more info on individual airplanes/tail numbers, stats, and more real-time data.

There are two ways you can go to build this out. First, FlightAware sells a packaged solution called FlightFeeder, you just provide an antenna and mount everything up. The second option is to grab a Raspberry Pi and install PiAware on it. From the title, you can guess which one I went with.

While FlightAware has a packaged Raspberry Pi image for PiAware, I opted to use a plain old installation based on Raspberry Pi OS. My node is based on a Raspberry Pi 5, has an SSD mounted - it’s overkill for this use case. I expect I will make this node do other things over time. I wanted an image I felt comfortable fully customizing.

This was a lot of fun to put together. It’s a very simple project with loads of possibilities to go beyond the basics. The parts list is small, and the software very easy to install.

Parts
#

Here’s the part list for the node itself, and the antenna that goes with this project. To get this outdoors, I’ll refer you to my writeup about my Meshtastic node. This project is in the same enclosure as that project.

Project Specific Parts:
#

Here’s what you need for the basic PiAware setup.

  • Raspberry Pi 5 - I use an 8GB Pi, it’s overkill. 2-16GB boards are now available - (amazon, digikey). It was nice having a full-sized Pi with multiple USB ports.
  • Nooelec RTL-SDR v5 SDR (amazon) - These allow the Pi to receive radio signals. Through software, the radio can be tuned to different frequencies. These are nice, have an aluminum heat sink, and fit nicely side-by-side. We need two in order to receive both types of transponders out there.
  • 1090MHz 978MHz Dual Band ADS-B Antenna (amazon): Antennas have specific features to improve reception at certain frequencies and use cases, so make sure you grab on that supports ADS-B bands. sure you get one that is meant for airplane transponders (will say ADS-B and UAT). This includes an N-Type to SMA cable. If your choice doesn’t, please make sure you get a cable. Something like this on Amazon should work.
  • SMA Female to Dual SMA Male Splitter (amazon) - the lead from your antenna will need to be split to connect to both radios. If your cable ends in an SMA connector, this splitter should work. Match your connectors so there aren’t any surprises.

If you look at the photo below, though, you’ll notice that I added some other parts. Let’s take them by category.

Storage:
#

I prefer using SSDs over Micro-SD cards. As I noted above, this is completely unecessary. A good Micro-SD card will work perfectly fine! This project does NOT write much to the local disk.

  • PCI-e to NVME Hat for Raspberry Pi 5 - I used this Geekworm HAT for this build which mounts on top of the Pi like a normal HAT. I do prefer the NVME bases from Pimoroni these days, though. You can get them on Amazon.
  • Samsung EVO 990 1TB SSD (amazon) - Again, overkill - I use a Samsung EVO 990 for most of my Raspberry Pi builds. Seems to work well with most of the PCIE SSD boards out there.

If you decide to go with a MicroSD card, any Class 10 card aimed at security cameras should do fine. These are usually meant to handle heavy disk activity, will be less likely to fail. My favorites have been Samsung Pro Endurance MicroSD cards.

Power:
#

To power the project, a lot depends on your mounting location and plans. If you follow how I’ve mounted these outdoor projects, I’ve leaned on POE to allow flexibility in mounting locations and the ability to use long runs without sending AC voltage down those wires.

If you decide to just power it with USB, you can grab any USB-C power supply. It’s also handy to have one around for initial setup. If you don’t have one, I trust the Canakit power supplies (amazon). Odds are you probably have a random USB-C power brick lying around. Just make sure it can do USB-C PD with at least 27W at 5volts. Not all of them do, and sometimes it’s not always broken out on the fine print on the charger.

For POE, just keep in mind that the radios take a lot of power. I had to replace my initial POE splitter with one that had a higher power supply, since this Pi couldn’t use a POE Hat (my SSD was mounted on a traditional HAT). With a random POE splitter, the Pi would occassionally stop responding. Diagnosing the issue, I found under-voltage messages in the dmesg logs, so I moved to a POE splitter with a higher power output. I ended up with an “industrial” one (amazon) that had 5A output at 5V. Seems to have stabilized Pi.

Software Setup
#

I use ansible to setup the Pi and configure everything. Here is the role for setting up PiAware. This basically captures the instructions on the PiAware site.

-   block:

    -   name: Check if piaware is installed already
        command: dpkg-query -l piaware
        register: deb_check
        ignore_errors: true

    -   name: Configure and install piaware
        become: true
        ansible.builtin.shell: |
          wget <https://www.flightaware.com/adsb/piaware/files/packages/pool/piaware/f/flightaware-apt-repository/flightaware-apt-repository_1.2_all.deb>
          sudo dpkg -i flightaware-apt-repository_1.2_all.deb
          sudo apt-get update
          sudo apt-get install -y piaware
          sudo piaware-config allow-auto-updates yes
          sudo piaware-config allow-manual-updates yes
        args:
          chdir: "/tmp"
        when: deb_check.rc != 0
        register: piaware_install

    -   name: install dump1090-fa
        ansible.builtin.apt:
          name: dump1090-fa
          state: present
        register: dump1090_fa

    -   name: install dump978-fa
        ansible.builtin.apt:
          name: dump978-fa
          state: present
        register: dump978_fa

    -   name: install piaware-web
        ansible.builtin.apt:
          name: piaware-web
          state: present
        register: piaware_web

    -   name: install rtl-sdr
        ansible.builtin.apt:
          name: rtl-sdr
          state: present

    -   name: Reboot if required
        become: true
        reboot:
        when: piaware_install.changed == true or dump1090_fa.changed == true or dump978_fa.changed == true or piaware_web.changed == true

    become: true

That’s basically it. Find a safe way to get the antenna outside, routed to the Pi. As you can see below, I mounted the whole thing outdoors. Details on the outdoor mount can be found on my Meshtastic project post.

Outdoor enclosure open