Rastreo de Vuelos Preciso y Económico: Raspberry Pi Zero Wireless, SDR y FlightAware
Este artículo le muestra dos formas de usar un Raspberry Pi Zero Wireless para rastrear vuelos en su área. También demuestra cómo puede controlar una matriz RGB de 64×64.
El Raspberry Pi Zero Wireless es un microordenador de $10 capaz de muchas cosas. Este artículo le muestra dos formas de usar esta Pi para rastrear vuelos en su área. También demuestra cómo puede controlar una matriz RGB de 64×64 para mostrar números de vuelo.
En este artículo, haré tres proyectos separados usando el Raspberry Pi Zero Wireless. En el Proyecto 1, crearé un dispositivo de rastreo de aviones usando PiAware. En el Proyecto 2, recopilaré datos de dichos aviones. En el Proyecto 3, le mostraré cómo usar el RPi Zero W para controlar una matriz RGB de 64×64.
Proyecto 1: Rastreador de Aviones con Raspberry Pi Zero Wireless
| Parte | Costo | Notas |
|---|---|---|
| Raspberry Pi Zero Wireless | $10 | |
| Receptor SDR | $21 | Muchos otros receptores SDR USB probablemente funcionen |
| Tarjeta microSD de 4GB | $6 | Tarjetas mayores funcionarán |
| Adaptador USB‑a‑MicroUSB | $5 | |
| Hub MicroUSB (opcional) | $8 | El Pi Zero solo tiene puertos microUSB; para conectar accesorios, necesita un hub/convertidor |
| Antena de banda ancha (opcional) | $50 | La antena debe cubrir 1090 MHz |
| Filtro paso‑banda 1090 MHz (opcional) | $20 |
Recursos
- Raspbian Jessie (Guía de Instalación)
- Instalación de PiAware
Este experimento se realizó usando el Raspberry Pi Zero Wireless. Sin embargo, el siguiente código debería funcionar en cualquier Raspberry Pi versión 2 o posterior. Si compra un Pi Zero sin wireless, puede añadirlo con un dongle USB de red inalámbrica.
Paso 1: Preparar la tarjeta SD
Descargue la última Raspbian Jessie a su computadora.
Escriba la imagen en su tarjeta SD (aquí hay guías para Linux, Mac OS y Windows).
Paso 2: Modificar la tarjeta SD
Cree un archivo llamado "ssh" en el directorio raíz de la tarjeta SD. Sin extensión de archivo, sin contenido. Este archivo habilita SSH, lo que le permitirá acceder remotamente a la Pi.
Cree un archivo llamado "wpa_supplicant.conf" con el siguiente contenido. Cambie los valores para YourWifiName y YourWifiPassword al nombre y contraseña que use para conectarse a su red Wi‑Fi.
network={
ssid="YourWifiName"
psk="YourWifiPassword"
key_mgmt=WPA-PSK
}
Paso 3: Instalar y Arrancar
Expulse la tarjeta SD de su computadora e instálela en el Raspberry Pi Zero Wireless. Conecte el Raspberry Pi a una fuente de energía usando el puerto MicroUSB más cercano al extremo de la placa. Espere aproximadamente un minuto para que el Raspberry Pi arranque y se conecte a Wi‑Fi. Con estos archivos de configuración, no hay necesidad de usar teclado, ratón o pantalla con su dispositivo.
Paso 4: Localice su Pi
Identifique la dirección IP de su Pi—esto puede lograrse accediendo a su router y viendo dispositivos conectados, o mediante un escáner IP como Look@Lan (Windows) o nmap (Linux y Mac). Si su dispositivo no aparece dentro de dos o tres minutos, desconecte la energía, retire la tarjeta SD de la Pi, y reinsértela en su computadora y verifique nuevamente los archivos ssh y wpa_supplicant.conf.
Paso 5: Conéctese a su Pi
Windows: Use una herramienta como Putty para conectarse a su Pi. Descargue y ejecute el programa, escriba la dirección IP de su Pi y haga clic en "conectar". Aparecerá una ventana que pregunta sobre el certificado de seguridad—haga clic en "sí".
Linux y Mac: Abra una terminal y escriba "ssh pi@raspberrypi.local" o "ssh pi@ipaddress" (p. ej., "ssh pi@192.168.0.52").
En el prompt, el nombre de usuario por defecto es "pi" y la contraseña por defecto es "raspberry".
Paso 6: Configure su Pi
Escriba "sudo raspi-config" y presione enter.
Cambie su contraseña, zona horaria y localización.
Cuando aparezca el prompt de contraseña, la contraseña actual es "raspberry"; debería cambiarla a algo más seguro para hacer al menos marginalmente difícil hackear su dispositivo. Como nota al margen, en lugar de contraseñas, debería usar certificados para autenticación, pero eso no se discutirá en este artículo.
Luego escriba los siguientes comandos y permita que se ejecuten:
wget https://flightaware.com/adsb/piaware/files/packages/pool/piaware/p/piaware-support/piaware-repository_3.3.0_all.deb sudo dpkg -i piaware-repository_3.3.0_all.deb sudo apt-get update sudo apt-get dist-upgrade -y sudo apt-get install -y piaware fail2ban libio-socket-ssl-perl sudo piaware-config allow-auto-updates yes sudo piaware-config allow-manual-updates yes sudo apt-get install dump1090-fa -y sudo reboot
Después de que la Raspberry Pi haya terminado el proceso de arranque, abra un navegador web en su computadora y navegue a https://raspberrypi.local:8080 (o reemplace raspberrypi.local con la dirección IP de su dispositivo). Haga zoom out y luego zoom in a su ubicación mientras los aviones comienzan a aparecer y luego desaparecen de su pantalla.
Para aumentar el número de aviones, lleve su Pi, SDR y sistema de antena al exterior. Mejoras adicionales se encuentran añadiendo el filtro paso‑banda 1090 MHz y una mejor antena.

Captura de pantalla del receptor PiAware que muestra un área al este de Los Ángeles, California, el 3/14/17 (¡Día de Pi!). Las pistas lineales en la parte superior muestran aviones listos para aterrizar en LAX. También visible es un avión gubernamental volando en círculos.
ADS‑B, PiAware y dump1090
Los transpondedores fijados a las aeronaves les permiten transmitir un identificador octal de cuatro dígitos (Modo‑A AKA "Squawk") identificador más altitud (Modo‑C), un número ICAO único de 24 bits (Modo‑S), y el número ICAO de 24 bits con información adicional (Modo S Extended Squitter). El último modo también se conoce como ADS‑B.
La Vigilancia Dependiente Automática‑Broadcast (ADS‑B) toma la posición de una aeronave (determinada por GPS, GLONASS, etc.), la combina con información de identificación y la transmite a 1090 MHz. A diferencia de los otros códigos de transpondedor, que solo se transmiten como respuesta a una interrogación por una señal de radar, ADS‑B se transmite aproximadamente dos veces por segundo.
PiAware y dump1090 usan una Radio Definida por Software (SDR) sintonizada a 1090 MHz para recibir y decodificar las transmisiones de todas las aeronaves en las cercanías y enviarlas a los servidores de FlightAware. La información se muestra en una página web alojada en la Raspberry Pi en el puerto 8080.

Ilustración de John Macneil, www.aopa.org.
Todas las aeronaves deben estar equipadas con transpondedores ADS‑B Out para el 1 de enero de 2020. Pero, hasta entonces, FlightAware usa multilateración para determinar la ubicación de aviones que no transmiten su latitud y longitud. La multilateración usa la posición conocida de al menos tres receptores y los tiempos de recepción de un mensaje para calcular la posición de un avión.
Proyecto 2: Uso del Pi Zero Wireless para Recopilar Datos de Aviones desde FlightAware.com
FlightAware.com tiene dos Interfaces de Programación de Aplicaciones (API) que permiten minar y utilizar datos: FlightXML y Firehose. Elija entre las dos basándose en el tipo de información que necesite y cuántas consultas necesite cada mes. Para este proyecto, All About Circuits obtuvo acceso gratuito por un mes. Para seguir, necesitará contactar a FlightAware.com para una clave API.
Recursos:
- Documentación Firehose de FlightAware
Paso 1: Probar Conectividad
Conéctese a su Pi Zero por SSH y pruebe conectividad a la API Firehose.
openssl s_client -host firehose.flightaware.com -port 1501 -tls1
Si ve una o dos páginas de detalles de certificación, todo funcionó correctamente.
Paso 2: Obtener Archivos y Datos de Muestra
FlightAware aloja archivos de muestra en GitHub. Comience descargando y editando los archivos de muestra con su nombre de usuario y clave API.
git clone https://github.com/flightaware/firehose_examples.git cd firehose_examples/perl/example1 sudo nano example1.pl
Cambie los campos username y apikey para que coincidan con su información, luego salga ([Ctrl]+[x]) y guarde.
perl example1.pl
Debería ver datos en formato JavaScript Object Notation (JSON):
$VAR1 = {
'aircrafttype' => 'B738',
'heading' => '105',
'pitr' => '1490038420',
'gs' => '334',
'clock' => '1490038413',
....
'hexid' => 'A44591',
'ident' => 'DAL751'
'alt' => '25100',
'lon' => '-117.38051',
'lat' => '33.53288'
};
Paso 3: Configure su Pi para Recopilar Datos
Firehose es acertadamente nombrado en que puede producir una cantidad abrumadora de datos en un período muy corto (~1 GB/día)—llenando su disco y aumentando los cargos a su cuenta. Así que cuando cree un script para reunir información, debería verificarlo a intervalos regulares ya que podría llenar su disco y vaciar su cuenta de gastos muy rápidamente.
Dependiendo del tamaño de su tarjeta MicroSD y lo que espere recopilar, podría necesitar añadir almacenamiento adicional o volver a raspi-config y expandir su sistema de archivos (opción 7, opción A1).
Para mi ejemplo, voy a recopilar datos para un área geográfica de 2° × 2° que incluye LGB, LAX, ONT, SNA, etc. (34° N ± 1°, 118° W ± 1°). Elegí esta región porque aproxima mi área de recepción.

El área de interés va de 33° N a 35° N y 117° W a 119° W.
El siguiente código es example1.pl, con cambios en las líneas 18 y 45. Todas las líneas se muestran a continuación para que los lectores puedan seguir sin tener que descargar el archivo. Cree una copia de example1.pl llamada position.pl y use nano para editar position.pl.
cp example1.pl position.pl sudo nano position.pl
1 #!/usr/local/bin/perl
2
3 use strict;
4 use IO::Socket::SSL;
5 use JSON::PP;
6 use IO::Uncompress::Inflate qw($InflateError);
7 use Data::Dumper;
8
9 my $username = 'allaboutcircuits';
10 my $apikey = 'allaboutcircuitsreallylongapikey';
11 my $compression = 0;
12
13 # Abre la conexión socket TLS a FlightAware.
14 my $sock = IO::Socket::SSL->new('firehose.flightaware.com:1501') or die $!;
15 # print "Connected!\n";
16
17 # Envía el comando de iniciación al socket sin comprimir.
18 my $initcmd = "live version 8.0 user $username password $apikey events \"position\" latlong \"33 -117 35 -119\"";
19 if ($compression) {
20 $initcmd .= " compression compress";
21 }
22 binmode $sock;
23 print $sock "$initcmd\n";
24
25 # Activa compresión, si se solicita.
26 my $zsock;
27 if ($compression) {
28 $zsock = new IO::Uncompress::Inflate $sock
29 or die "IO::Uncompress::Inflate failed: $InflateError\n";
30 } else {
31 $zsock = $sock;
32 }
33
34 # Bucle principal, leyendo líneas de JSON del servidor.
35 my $i = 1;
36 while (my $line = $zsock->getline()) {
37 #print "LINE $i\n";
38 #print "LINE $i: ", $line, "\n";
39
40 my $data = eval { decode_json $line };
41 die "Failed to decode JSON: $line" if !defined($data) || $@;
42
43 print $data->{ident}." \t".$data->{lat}." \t " . $data->{lon} . " \t". $data->{alt}." \n";
44
45 last if ($i++ >= 10);
46 }
47 close $sock;
48
49 # print "All done.\n";
La línea 18 limita la solicitud a aviones en la región geográfica entre 117° W y 119° W (denotado por -117 y -119). La línea 43 se modifica para demostrar un método para enfocar solo los campos de interés. En este caso, apuntaremos al número de vuelo, latitud, longitud y altitud de un avión. La línea 45 solicita 10 aviones del servidor (esta línea puede comentarse en un script final).
Los siguientes dos comandan ejecutan el programa y le permiten monitorear el progreso del programa:
sudo perl position.pl >> position.txt & tail -f position.txt
La primera línea hace que el superusuario use el programa perl para ejecutar el programa position.pl y anexe (>>) la salida al archivo position.txt y el símbolo & hace que el programa se ejecute en segundo plano.
La segunda línea usa el programa tail para seguir (-f) los cambios en el archivo position.txt, lo que le permite monitorear el comando para completación. Cuando termine, use [Ctrl]+[c] para salir de tail. Si ya no está interesado en recopilar datos, use fg para traer el programa position.pl al primer plano y deténgalo o interrumpa con [Ctrl]+[c].
El archivo .zip a continuación contiene programas modificados y salidas que esperan demostrar cómo ligeros cambios en la sintaxis pueden traer diferente información al foco, junto con salida de muestra de los programas.
- arrivals.pl da salida JSON para aviones que acaban de aterrizar (ya sea llegando o saliendo de LAX)
- test_landing.pl da salida legible (p. ej., AAL1155 aterrizó el 03/21/2017 22:00:01)
- position.pl da salida JSON para todos los aviones en el rectángulo geográfico (34° N ± 1°, 118° W ± 1°)
- test_overhead.pl da identificación de vuelo, latitud, longitud y altitud (N721PP 34.36011 -118.37837 18100)
Estos archivos se hicieron con modificaciones menores al example1.pl provisto por FlightAware. Para hacer el suyo propio que capture solo los datos que le interesen, use la documentación de la API Firehose de FlightAware para solicitar la información apropiada en formato JSON, y luego use la sintaxis correcta dentro del archivo para solo mostrar la información que necesita.
Proyecto 3: Uso del Pi Zero Wireless para Controlar una Matriz RGB de 64×64
| Parte | Costo | Notas |
|---|---|---|
| (2) 2× 32×32 matriz RGB display + fuente de alimentación | $75 ($150) | Requiere cuatro matrices 32×32 RGB totales para crear display de 64×64 píxeles |
| Adafruit RGB matrix HAT + reloj RTC | $25 | Datasheets |
| Cable IDC 20‑pin (Hub75) | $7‑$13 | La longitud requerida depende de la configuración de paneles y distancia a la Pi |
| Headers macho 0.1" (40‑pin, 2×20) | $1 | 2.54 mm |
Paso 1: Preparación del HAT de Matriz Adafruit
Suelde los headers macho y hembra en el HAT de Adafruit según las instrucciones en Adafruit.com. Luego suelde un cable o conecte un jumper entre pines 4 y 18. Para este proyecto, no necesita conectar ni el jack de barril DC ni los conectores de tornillo.
Paso 2: Preparación de Raspberry Pi
Suelde los headers macho 2×20 en su lugar.
Paso 3: Preparación de Matriz RGB
Oriente las matrices RGB para que las flechas en la fila inferior apunten hacia abajo y las flechas en la fila superior apunten hacia arriba (ver imagen aquí). Use un cable IDC 2×10 para conectar la salida del HAT de Adafruit a la entrada de la primera placa. Luego conecte la salida de la primera placa a la entrada de la segunda, la salida de la segunda a la entrada de la tercera, etc.

El reverso del panel de matriz RGB. La señal viaja de placa a placa en forma de "C".
Si tiene la suerte de tener un cortador láser o máquina CNC a su disposición, he incluido los planos para una placa trasera que puede sostener las cuatro placas de matriz RGB usadas. Los agujeros de montaje se reemplazan con ranuras para permitir alineación desde un punto central común.

Plantilla para montar cuatro paneles 32×32 y hacer un panel grande 64×64; Varios arreglos de paneles son posibles.
Hughes_4x4RGBMatrix.zip
Documentación Completa y Código Fuente por Hennen Zeller.
Una vez que todas las conexiones eléctricas se han hecho, encienda la Raspberry Pi. Después de aproximadamente un minuto, intente entrar a la Pi con Putty o SSH.
Una vez dentro, escriba lo siguiente para deshabilitar el sonido en la Pi (la documentación indica un conflicto de subsistema de hardware con sonido y el hardware de matriz RGB).
cat << EOF | sudo tee /etc/modprobe.d/blacklist-rgb-matrix.conf blacklist snd_bcm2835 EOF sudo update-initramfs -u
Luego use apt‑get para instalar Python y archivos de imagen.
sudo apt-get install -y build-essential libconfig++-dev python-dev python-imaging libgraphicsmagick++-dev libio-socket-ssl-perl
Obtenga los archivos necesarios para ejecutar la matriz RGB y complílelos.
git clone https://github.com/hzeller/rpi-rgb-led-matrix cd rpi-rgb-led-matrix HARDWARE_DESC=adafruit-hat-pwm make -C examples-api-use sudo examples-api-use/demo -L -D0 cd utils/ HARDWARE_DESC=adafruit-hat-pwm make
Opcionalmente, si también tiene una cámara conectada a su Pi, puede capturar una imagen de 64×64 píxeles y alimentarla al display.
raspistill -w 64 -h 64 -o myimg.png sudo ./led-image-viewer -L -f myimg.png
Las dos líneas anteriores capturan una imagen de 64×64 para el display y usan el programa led-image-viewer (compilado en la sección anterior) para mostrarla en el display grande (-L) para siempre (-f).
¿Qué Sigue?
Ahora tiene una computadora de $10 que puede rastrear (ya sea con antena y receptor SDR o con una llamada API) aviones alrededor de usted y mostrar cualquier información sobre esos que quiera en su display de 64‑píxeles por 64‑píxeles, o en la salida HDMI de la Raspberry Pi Zero W.
Lo que haga con ello está limitado solo por su imaginación.
Dado que este artículo solo introduce las herramientas, el primer paso que recomiendo es leer la documentación para el display y FlightAware y luego abrir los programas de ejemplo de ambos para entender mejor sus capacidades.
Y no olvide que su Raspberry Pi Zero es una instalación Linux funcionando completa con comandos a menudo usados como Cron, Grep y Awk. Cualquier cosa que no esté ya en su Pi está a solo un apt-get install de distancia.
¡Eche un vistazo al vídeo abajo para ver la culminación de estos proyectos!
¡Pruebe este proyecto usted mismo! Obtenga la lista de materiales.
Equipo industrial
- Conectar múltiples sensores DS18B20 1‑Wire a Raspberry Pi para monitorización precisa de temperatura
- Monitorizar eficientemente temperaturas de salas con Raspberry Pi y Nagios
- Centro de Energía Doméstica: Monitorización de paneles solares fotovoltaicos, térmicos y temperaturas con Raspberry Pi y Moteino
- Construya un Controlador Domótico 433 MHz con Sensorflare y Raspberry Pi
- Lectura de Sensores Analógicos con Raspberry Pi y Zabbix: Guía Paso a Paso
- Tu primer proyecto IoT con Raspberry Pi, DHT11 y ThingSpeak
- Construye un sistema aeropónico automatizado con Raspberry Pi y sensor de humedad
- Construye una puerta de enlace LoRa con el módulo RAK831 en Raspberry Pi 3 – Guía paso a paso
- Construya un robot con Raspberry Pi y Python: Guía completa
- Construya un robot con streaming de vídeo controlado por Internet con Arduino y Raspberry Pi
- Pixus Technologies: Radios definidas por software robustas para entornos de misión crítica