Matt Edholm 037ce3e193 Implement story 2.2: coordinate projection and base map loading
Add MapBounds dataclass and equirectangular project() function in
projection.py, basemap.load() forcing pixels into memory via .copy(),
and full test coverage for both modules (4 new tests). All quality
gates pass: 67 tests, ruff clean.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-22 23:10:38 -04:00
2026-04-22 21:18:42 -04:00

planeMapper

A wall-mounted ADS-B radar display in a picture-frame form factor. Receives live aircraft positions via RTL-SDR, renders them on an OpenStreetMap base map centred on a home airfield (~100nm radius), and refreshes a 6-colour e-ink display every 60 seconds.

Designed to sit on a desk or hang on a wall — always on, no interaction required, no glare.

Hardware

Item Notes
Raspberry Pi Zero 2W Deployment target. Build and test on Pi 5 first.
Nooelec NESDR Smart v5 RTL-SDR dongle 0.5PPM TCXO, SMA input. Needs micro-USB OTG adapter on Zero 2W.
FlightAware 1090MHz ADS-B antenna Purpose-built for 1090MHz, 5.5dBi
Waveshare 7.3" 6-colour e-ink HAT E-Ink Spectra 6, 800×480, 40-pin GPIO, SPI

Software Stack

  • dump1090 — decodes ADS-B from RTL-SDR, serves JSON at http://localhost:8080/data/aircraft.json
  • Python + Pillow — fetches JSON, renders map image
  • Waveshare Python library — SPI driver for the e-ink HAT
  • OpenStreetMap tiles — base map, pre-cached for the local area

Pipeline

RTL-SDR dongle
  → dump1090
    → JSON feed (positions, headings, altitudes, callsigns)
      → Python renderer (Pillow)
        → map image
          → Waveshare SPI driver
            → e-ink display

Refresh loop runs every 60 seconds.

Map Design

  • Centred on home airfield, ~100nm radius
  • OpenStreetMap base tiles (pre-cached)
  • Aircraft plotted as rotated arrows aligned to heading
  • Short track line behind each aircraft
  • Callsign and altitude label per aircraft
  • Colour-coded by altitude band (6 colours match display palette)
  • Home airfield marked

Colour Bands (altitude)

The Waveshare E-Ink Spectra 6 supports black, white, red, yellow, blue, and green — mapped to altitude bands TBD during development.

Build Order

  1. RTL-SDR + dump1090 — confirm aircraft visible in JSON feed
  2. Base map — render OSM tiles at correct scale, 100nm radius
  3. Aircraft overlay — pull live positions, draw heading arrows and labels
  4. E-ink output — push image via Waveshare library, set 60s refresh loop
  5. Polish — airspace overlays, altitude colour coding, frame and mount

Notes

  • E-ink only draws power on refresh — very low idle draw, suits always-on use
  • Pi Zero 2W runs the full stack comfortably given the relaxed 60s refresh cycle
  • OTG adapter required to connect RTL-SDR dongle to the Zero 2W's single micro-USB port
  • Lat/lon to pixel coordinate conversion is the trickiest part of the renderer
S
Description
ADS-B radar display on a Waveshare 7.3" 6-colour e-ink screen
Readme 6.1 MiB
Languages
Python 98.5%
Groovy 1.5%