This page looks best with JavaScript enabled

Radar scope

 ·  ☕ 4 min read  ·  🦉 Aidan

Overview

This project aimed to be a weekend project, to create a system that can display nearby aircraft. The system will consist of a Raspberry Pi, a software defined radio (SDR), and a display. The SDR will be used to receive ADS-B signals from aircraft, and the Raspberry Pi will process and display the data. The ADS-B signals are sent to FlightRadar24, a public service that tracks aircraft and displays them on a map.

Components

I had most of these on hand, however if purchasing from scratch, the total cost would be roughly $100-150.

ADS-B

Briefly, ADS-B is a system that aircraft use to broadcast their position, speed, and other information. The system is used by air traffic control to track aircraft, and is also used by services like FlightRadar24 to provide real-time tracking of aircraft. The system operates on 1090MHz, and is unencrypted. The SDR dongle is capable of receiving these signals, and the Raspberry Pi is capable of processing them. These signals are rather powerful, around a few hundred watts, so a small antenna is sufficient for reception even from several miles away and indoors.

Hardware

The screen included a stand, and the Raspberry Pi included a case. Assembly was simple, the screen is powered from the one of the Pi’s USB ports, and gets video from the onboard HDMI port. The SDR dongle is also USB, and the antenna included a suction cup which I attached it to the desk with. The telescoping antenna is adjustable, and was adjusted to 27.5cm, which corresponds with the 1090MHz frequency that ADS-B uses.

OS and software

Initially, I used the latest version of Raspbian available, which was based on Debian 12 bookworm. It ships with Wayland out of the box, which with Wayfire nearly worked with this application, but was missing a few features related to hiding the cursor. I made the switch back to X11 with raspi-config. In order to display the Chromium web browser at boot, I added the following line to /etc/xdg/lxsession/LXDE-pi/autostart:

@chromium-browser --kiosk https://flightradar24.com/radarview

Then to hide the cursor I added:

@unclutter -idle 0.1 -root

To prevent the screen from sleeping I added:

@xscreensaver -no-splash

To the start of the file.

After all that, I still wanted to click the fullscreen button on the browser, so I installed xdotool to call xdotool mousemove x y and xdotool click, then created a new .sh script so I could add a delay, and added a line after opening the chromium browser:

@/home/aidan/click_fullscreen.sh

In the end, autostart contained this:

@lxpanel --profile LXDE-pi
@pcmanfm --desktop --profile LXDE-pi
@xscreensaver -no-splash
@chromium-browser --kiosk https://flightradar24.com/radarview
@/home/aidan/click_fullscreen.sh
@unclutter -idle 0.1 -root

And the helper script just had this:

1
2
3
4
5
6
#!/bin/bash
export DISPLAY=:0
sleep 30
xdotool mousemove 781 127
sleep 1
xdotool click 1

Finally, to set up sharing with FlightRadar24, I first prevented the OS from using the dongle as a TV tuner by blacklisting the dvb_usb_rtl28xxu module. Then I followed the instructions at https://www.flightradar24.com/build-your-own. Then I VNC’d into the Pi and logged in to the FlightRadar24 website so the display will be allowed to use the radar scope view as long as that cookie exists. Afterwards I disabled VNC, left the Pi only accessible via SSH public key auth, and configured unattended-upgrades since I wouldn’t be touching the system for a while.

Results

The system works reasonably well for a weekend project, it has been on my desk only ever failing if the internet goes out. Since it’s reset at boot, fixing it is a simple matter of power cycling the Pi. Range is poor, up to 5 miles, as expected by a small antenna, no LNA, and indoors placement. FlightRadar is kind enough to provide contributors with network data exceeding that which they contribute, allowing me to see aircraft in the area beyond the range of my antenna.

Picture of the Pi, antenna, and screen working on a desk

Share on

Aidan McGillivray
WRITTEN BY
Aidan
Intern