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.
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.
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
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.
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.
Agrega la alerta
Conecta un zumbador a GPIO18 y la OLED al I2C. El script lee aircraft.json cada dos segundos.
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).
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.