Drones y UAVIngeniero

Caja de conciencia del espacio aéreo: alertas de aviones en tu campo de vuelo

Un receptor ADS-B portátil te avisa con un zumbador cuando un avión o helicóptero pasa bajo y cerca de donde vuelas tu dron.

NivelIngeniero
Tiempo2 h
Costo est.~$192
Pasos5

Los pilotos de dron siempre deben ceder el paso a las aeronaves tripuladas. La mayoría de los aviones comerciales y muchas avionetas y helicópteros transmiten ADS-B, así que un Pi con un RTL-SDR puede vigilar el cielo alrededor de tu campo y avisarte con tiempo. Es una ayuda para tus ojos, nunca un reemplazo.

⚠ SEGURIDAD
Esta caja solo ve aeronaves que transmiten ADS-B. Mantén la línea de vista y cede el paso a toda aeronave tripulada. En EE.UU., los pilotos recreativos deben pasar la prueba gratuita TRUST de la FAA, registrar drones de más de 250 g (0.55 lb), cumplir con Remote ID y mantener la nave a la vista (los pilotos FPV necesitan un observador). Las reglas cambian: revisa faa.gov antes de volar.

Pasos de la misión

  1. Prepara el receptor

    Sigue el proyecto del rastreador de aviones ADS-B para instalar readsb o dump1090-fa con el RTL-SDR y la antena de 1090 MHz.

  2. Hazlo portátil

    Alimenta el Pi con un power bank USB-C y monta la antena lo más alto que puedas con vista despejada del cielo.

  3. Agrega la alerta

    Conecta un zumbador a GPIO18 y la OLED al I2C. El script lee aircraft.json cada dos segundos.

  4. Define tu burbuja

    Escribe las coordenadas de tu campo, un radio de alerta (por ejemplo 5 km) y una altitud (por ejemplo menos de 3,000 pies).

  5. Vuela con ella

    Cuando suene el zumbador, mira hacia arriba, baja y aterriza si hace falta. Recuerda que muchas aeronaves no transmiten ADS-B.

Código

import json, math, time
from gpiozero import Buzzer

FIELD = (27.29, -80.35)        # your field's lat, lon
RADIUS_KM, MAX_FT = 5.0, 3000
FILE = '/run/readsb/aircraft.json'   # dump1090-fa: /run/dump1090-fa/aircraft.json
buzz = Buzzer(18)

def km(a, b):
    la1, lo1, la2, lo2 = map(math.radians, (*a, *b))
    h = math.sin((la2 - la1) / 2) ** 2 + math.cos(la1) * math.cos(la2) * math.sin((lo2 - lo1) / 2) ** 2
    return 6371 * 2 * math.asin(math.sqrt(h))

while True:
    near = []
    for ac in json.load(open(FILE)).get('aircraft', []):
        alt = ac.get('alt_baro')
        if 'lat' in ac and isinstance(alt, int) and alt < MAX_FT:
            d = km(FIELD, (ac['lat'], ac['lon']))
            if d < RADIUS_KM:
                near.append((d, alt, ac.get('flight', ac['hex']).strip()))
    for d, alt, name in sorted(near):
        print('%-8s %4.1f km %5d ft' % (name, d, alt))
    buzz.beep(0.2, 0.2, n=3) if near else buzz.off()
    time.sleep(2)

Code comments are in English, like most libraries and docs — a good habit for makers.

Preguntas

¿Aparece aquí el Remote ID de mi dron?

No. Remote ID usa transmisiones por Wi-Fi o Bluetooth, no ADS-B, y en general los drones no pueden transmitir ADS-B.