Flight Tracker

More Raspberry Pi Projects

Project 7 — ADS-B Flight Tracker

What you will build A live radar map of aircraft overhead, receiving ADS-B transponder signals with a cheap USB dongle and displaying them in a browser
Difficulty Beginner-friendly — one of the most satisfying Pi projects for the effort involved
Time to complete 1 – 2 hours from unboxing the dongle to watching planes on your radar map
Extra hardware RTL-SDR USB dongle (~£15–30), 1090 MHz antenna (included with most kits or ~£10 separately)

What Is ADS-B?

Modern commercial aircraft broadcast their position, altitude, speed, and flight number every second using a radio signal called ADS-B (Automatic Dependent Surveillance–Broadcast) on 1090 MHz. This data is used by air traffic control — but it's also transmitted openly and unencrypted, meaning anyone with the right hardware can receive it.

A cheap RTL-SDR USB dongle — originally designed to receive digital TV broadcasts — can receive these 1090 MHz signals. Combined with software running on your Pi, you get a live radar map of every ADS-B-equipped aircraft within roughly 200–300 km of your antenna.

How it all connects
✈️ Aircraft broadcasts ADS-B at 1090 MHz
──►
📡 Antenna 1090 MHz, vertical ~£10 (or DIY)
──►
🔌 RTL-SDR Dongle USB software-defined radio £15–30
──►
🍓 Raspberry Pi readsb decodes signals tar1090 serves the map
──►
🌐 Browser live radar map on your LAN

What You Will Need

🔌 RTL-SDR dongle Any RTL2832U-based dongle works, but the RTL-SDR Blog V4 (~£30) is the best choice — better sensitivity, lower noise, and a built-in bias tee for powered antennas. Cheap generic dongles from Amazon (~£15) also work but are noticeably worse.
📡 1090 MHz antenna Most RTL-SDR kits include a small whip antenna — it works but is not optimised for 1090 MHz. A dedicated ADS-B antenna (the FlightAware 1090 MHz antenna, ~£20, is excellent) dramatically improves range. Place it as high as possible.
🍓 Any Raspberry Pi Even a Pi Zero 2W works. A Pi 3B+ or 4 is more comfortable and allows running multiple feeders simultaneously. The decoding software is lightweight.
🔧 USB extension cable Move the dongle away from the Pi using a USB extension (0.5–1 m). The Pi generates RF interference that degrades reception if the dongle is plugged directly in.
📍 Your location You'll need your latitude and longitude (to 4–5 decimal places) for the software config. Find yours at latlong.net or in Google Maps (right-click your location).
🏠 Antenna placement The antenna needs a clear view of the sky — ideally on a roof, in a loft, or at a window. Every obstacle (walls, roofs, trees) between the antenna and the horizon reduces range significantly.

Step 1 — Install readsb

readsb is a high-performance ADS-B decoder that reads the raw signal from your RTL-SDR dongle and decodes it into structured flight data. It is the successor to the popular dump1090 family and is actively maintained.

# Add the wiedehopf repository (author of readsb and tar1090)
pi@raspberrypi:~$ sudo apt install -y curl gnupg

pi@raspberrypi:~$ curl -L https://github.com/wiedehopf/adsb-wiki/raw/master/readsb-install.sh | sudo bash
The install script detects your dongle type, installs the correct RTL-SDR drivers, blacklists the DVB-T kernel module (which would otherwise claim the dongle before readsb can use it), and sets up readsb as a systemd service.

If you prefer to install manually:

# Manual install (if the script is unavailable or you prefer step-by-step control)
pi@raspberrypi:~$ sudo apt update
pi@raspberrypi:~$ sudo apt install -y rtl-sdr

# Blacklist the DVB-T driver so it doesn't claim the dongle
pi@raspberrypi:~$ sudo bash -c 'echo "blacklist dvb_usb_rtl28xxu" > /etc/modprobe.d/rtlsdr.conf'

# Add the readsb Debian package repository
pi@raspberrypi:~$ sudo bash -c '(source /etc/os-release; echo "deb [arch=arm64] https://github.com/wiedehopf/readsb-packages/raw/master/apt stable main") > /etc/apt/sources.list.d/readsb.list'

pi@raspberrypi:~$ sudo apt update
pi@raspberrypi:~$ sudo apt install -y readsb

Configure readsb with your location

pi@raspberrypi:~$ sudo nano /etc/default/readsb

Find and set these lines (replace with your actual coordinates and elevation):

RECEIVER="rtlsdr"
DECODER_OPTIONS="--dcfilter --fix"
NET_OPTIONS="--net --net-heartbeat 60 --net-ro-size 1250 --net-ro-interval 0.05 --net-ri-port 0 --net-ro-port 30002 --net-sbs-port 30003 --net-bi-port 30004,30104 --net-bo-port 30005"
JSON_OPTIONS="--json-location-accuracy 2"
LAT=51.5074     # your latitude (positive = North)
LON=-0.1278     # your longitude (negative = West)
ALTITUDE=50     # your elevation in metres above sea level
pi@raspberrypi:~$ sudo systemctl restart readsb
pi@raspberrypi:~$ sudo systemctl status readsb
● readsb.service
     Active: active (running)

Check that the dongle is being detected

pi@raspberrypi:~$ sudo readsb --device-type rtlsdr --device 0 --interactive
Found 1 device(s):
  0:  Realtek, RTL2838UHIDIR, SN: 00000001

Using device 0: Generic RTL2832U OEM
Found Rafael Micro R820T tuner
Sampling at 2400000 S/s.
...

Step 2 — Verify Data Is Flowing

Before installing the web interface, confirm readsb is actually decoding aircraft:

# readsb writes decoded aircraft to this JSON file every second
pi@raspberrypi:~$ watch -n1 'cat /run/readsb/aircraft.json | python3 -m json.tool | head -40'

Or use the raw data stream directly:

pi@raspberrypi:~$ nc localhost 30003 | head -20
MSG,3,1,1,400F3A,1,,,,,,,36000,,,51.23,-0.41,,,0,0,0,0
MSG,4,1,1,4CA7B6,1,,,,,,449,215,,,,,,,0,0,0
MSG,1,1,1,400F3A,1,,,,,BAW123,,,,,,,,0,0,0,0

If you see output like this, readsb is receiving and decoding ADS-B messages. No output means no aircraft in range yet — try pointing the antenna out of a window, or wait a few minutes.

Step 3 — Install tar1090 (Radar Web Interface)

tar1090 is a polished, feature-rich web interface that reads readsb's JSON output and displays it as an interactive radar map. It's fast, beautiful, and runs entirely locally with no internet connection required for the map itself.

pi@raspberrypi:~$ curl -L https://github.com/wiedehopf/tar1090/raw/master/install.sh | sudo bash

The installer sets up tar1090 to run under a lightweight HTTP server on port 8080. Open it in your browser:

http://raspberrypi.local:8080
tar1090 — Live ADS-B Radar
Aircraft visible47
Messages/sec312
Max range248 nm
Tracked (24h)1,204 aircraft
── Active flights ─────────────────────────────
BAW442FL35037,000 ft481 ktBoeing 777
EZY8LHFL28028,500 ft435 ktAirbus A320
RYR4KNFL39039,000 ft466 ktBoeing 737
N812PD---2,400 ft143 ktCessna 172

Configure tar1090 for your location

pi@raspberrypi:~$ sudo nano /etc/tar1090/config.js
// Centre the map on your location
SiteLat  = 51.5074;
SiteLon  = -0.1278;
SiteShow = true;           // show your location as a dot on the map
SiteName = "My Pi";

// Display preferences
DefaultZoom         = 7;    // map zoom level on load (7 shows a wide regional view)
ShowAltitudeChart   = true;
TrackHistorySize    = 200;  // number of trail points per aircraft
PageName            = "My Flight Radar";

Step 4 — Install graphs1090 (Statistics Dashboard)

graphs1090 generates historical graphs of your station's performance — message rates, aircraft counts, range over time, and signal strength. Install it alongside tar1090:

pi@raspberrypi:~$ curl -L https://github.com/wiedehopf/graphs1090/raw/master/install.sh | sudo bash

Access the graphs dashboard at:

http://raspberrypi.local:8080/graphs1090/

After a day of operation you'll see charts showing when aircraft traffic peaks (morning and evening rushes are clearly visible), your maximum detection range, and how different antenna positions affect your message rate.

Step 5 — Feed Data to FlightAware (Optional)

FlightAware, Flightradar24, ADSBexchange, and others aggregate ADS-B data from volunteer feeders worldwide to build their global flight tracking maps. Sharing your local data earns you a free premium account on most of these services — and it genuinely improves flight tracking coverage in your area.

FlightAware 🎁 Free Enterprise subscription (~$89/month value) One of the largest flight tracking services. Their PiAware feeder is easy to install and integrates well with readsb. Clear coverage map shows your contribution area.
Flightradar24 🎁 Free Business subscription (~$500/year value) The most recognisable flight tracking site. Their feeder package fr24feed runs alongside readsb without conflict. MLAT support enhances position accuracy for aircraft without GPS.
ADSBexchange 🎁 No ads, small supporter badge A community-run, unfiltered aggregator — unlike commercial services, ADSBexchange does not remove military or government aircraft from its feed. Popular with aviation enthusiasts.
OpenSky Network 🎁 Research-quality API access Academic network used for aviation research. Provides an open API for researchers and developers. Less useful as a tracking site but valuable for data access.

Install PiAware (FlightAware feeder)

# Add FlightAware's repository
pi@raspberrypi:~$ wget -O /tmp/piaware_bullseye_arm64.deb \
  https://flightaware.com/adsb/piaware/files/packages/raspbian/bullseye/piaware_10.0_arm64.deb
pi@raspberrypi:~$ sudo apt install /tmp/piaware_bullseye_arm64.deb

pi@raspberrypi:~$ sudo piaware-config allow-auto-updates yes
pi@raspberrypi:~$ sudo piaware-config allow-manual-updates yes

pi@raspberrypi:~$ sudo systemctl start piaware
pi@raspberrypi:~$ sudo systemctl enable piaware

Claim your feeder at flightaware.com/adsb/piaware/claim — log in or create a free account and it will automatically detect your running PiAware instance.

Install fr24feed (Flightradar24 feeder)

pi@raspberrypi:~$ wget -O /tmp/fr24feed.deb https://repo-feed.flightradar24.com/linux_arm_binaries/fr24feed_1.0.40-2_armhf.deb
pi@raspberrypi:~$ sudo dpkg -i /tmp/fr24feed.deb

# Run the signup wizard (creates an account and generates your sharing key)
pi@raspberrypi:~$ sudo fr24feed --signup

The signup wizard asks for your email address, location, and MLAT preference. It configures fr24feed to read from readsb's output port automatically.

You can run PiAware, fr24feed, and ADSBexchange simultaneously — they all read from readsb's network output ports without competing. Running all three maximises your coverage contribution and earns the benefits from each service.

Step 6 — Improve Your Range

Once everything is working, antenna placement is the single biggest factor in how many aircraft you can see. Here's what makes the biggest difference:

Antenna height

ADS-B signals travel in straight lines (line-of-sight). Every metre of additional antenna height extends your horizon. A loft-mounted antenna will typically see 2–3× more aircraft than one on a windowsill.

Avoid coax cable runs

Standard coax cable loses signal at 1090 MHz — roughly 6–10 dB per 10 metres of RG58. Use low-loss cable (LMR-400 or equivalent) for runs longer than 2 metres, or use a long USB cable and put the Pi near the antenna instead.

Use a bandpass filter

Strong nearby signals (mobile phone masts, FM radio) can overload the RTL-SDR's tuner and mask weak ADS-B signals. A 1090 MHz bandpass filter (~£10) placed between the antenna and dongle dramatically improves performance in urban areas. The FlightAware 1090 MHz dark blue filter is the standard recommendation.

Build a simple DIY antenna

A quarter-wave ground-plane antenna for 1090 MHz is one of the most cost-effective projects in amateur radio. You need one vertical element of 69 mm and four radial ground elements of the same length, made from stiff wire or a coat hanger. Plenty of build guides exist at rtl-sdr.com.

Troubleshooting

⚠ readsb starts but decodes zero aircraft
First, check the dongle is detected: lsusb | grep RTL — you should see a Realtek entry. If not, try a different USB port or cable. If it shows up but readsb sees nothing, check the DVB-T driver isn't claiming it: lsmod | grep dvb_usb — if it appears, the blacklist file wasn't applied; reboot and try again. Finally, check you have an antenna connected — a bare dongle with no antenna receives almost nothing. Even indoors, a connected antenna should pick up at least a few strong nearby aircraft within minutes.
⚠ "No supported devices found" when readsb starts
The RTL-SDR dongle is not visible to readsb. Most commonly caused by the DVB-T kernel module claiming the device before readsb can. Verify: cat /etc/modprobe.d/rtlsdr.conf — should contain blacklist dvb_usb_rtl28xxu. If the file is missing or empty, create it: sudo echo "blacklist dvb_usb_rtl28xxu" > /etc/modprobe.d/rtlsdr.conf, then reboot. Also try sudo rtl_test — if it finds the device, the issue is readsb's config; if it also fails, the device truly isn't being recognised.
⚠ tar1090 map loads but shows no aircraft
tar1090 can't reach readsb's JSON output. Check readsb is running: sudo systemctl status readsb. Then check the aircraft JSON is being updated: ls -la /run/readsb/aircraft.json — the timestamp should be recent. If tar1090 is looking in the wrong place, check its config: cat /etc/tar1090/nginx.conf for the JSON path. Restart both services: sudo systemctl restart readsb tar1090.
⚠ Dongle overheats and stops working
RTL-SDR dongles run hot, especially cheap generic ones. A dongle that cuts out after 20–30 minutes is almost certainly overheating. Solutions: (1) don't enclose the dongle — leave it hanging in open air; (2) use a USB extension cable so it's away from the Pi's heat; (3) apply a small heatsink to the RTL2832U chip (available cheaply on Amazon); (4) a small 5V USB fan pointed at the dongle works well in warm environments. The RTL-SDR Blog V4 runs significantly cooler than cheap generic dongles.
⚠ Good range locally but feeders show poor stats
PiAware and fr24feed use MLAT (multilateration) to enhance position accuracy for aircraft without GPS. MLAT requires at least 3–4 stations to see the same aircraft simultaneously. If you're in a rural area with few nearby feeders, MLAT coverage will be sparse — that's expected, not a configuration problem. Check your feeder statistics on the respective service's website; the stats shown are for MLAT-resolved positions, not raw ADS-B, so a low MLAT count with a high ADS-B count is normal.
⚠ Strong signals but maximum range seems low
This is almost always an antenna placement or coax issue, not a software issue. Work through this checklist: (1) is the antenna outdoors or near a window with a clear sky view? Walls remove 10–20 dB; (2) are you using RG58 coax longer than 2 metres? Switch to LMR-400 or shorten the run; (3) are you in an urban area with lots of mobile transmitters? Try a 1090 MHz bandpass filter; (4) is the antenna's ground plane correct? A quarter-wave antenna without ground radials performs poorly. Try temporarily placing the antenna on a biscuit tin lid for a makeshift ground plane improvement.

Quick Reference

TaskCommand / URL
Live radar maphttp://raspberrypi.local:8080
Statistics graphshttp://raspberrypi.local:8080/graphs1090/
Restart readsbsudo systemctl restart readsb
View readsb logsudo journalctl -u readsb -f
Check aircraft JSONcat /run/readsb/aircraft.json | python3 -m json.tool | head -30
Raw ADS-B data streamnc localhost 30003 | head
Detect RTL-SDR donglertl_test -t
List USB deviceslsusb | grep RTL
Check DVB-T not loadedlsmod | grep dvb_usb
readsb config/etc/default/readsb
tar1090 config/etc/tar1090/config.js
PiAware feeder statussudo systemctl status piaware
FR24 feeder statussudo systemctl status fr24feed
Claim FlightAware feederflightaware.com/adsb/piaware/claim
RTL-SDR buying guidertl-sdr.com
1090 MHz antenna guidertl-sdr.com ADS-B guide
readsb / tar1090 authorgithub.com/wiedehopf