Точный трекинг полетов на бюджете: Raspberry Pi Zero Wireless, SDR и FlightAware
Статья показывает два способа использовать Raspberry Pi Zero Wireless для трекинга полетов в вашем районе. Также демонстрируется, как он может управлять 64×64 RGB матрицей.
Raspberry Pi Zero Wireless — $10 микрокомпьютер, способный на многое. Статья показывает два способа использовать этот Pi для трекинга полетов в вашем районе. Также демонстрируется, как он может управлять 64×64 RGB матрицей для отображения номеров рейсов!
В этой статье я сделаю три отдельных проекта, используя Raspberry Pi Zero Wireless. В Проекте 1 я создам устройство трекинга самолетов с PiAware. В Проекте 2 я соберу данные от этих самолетов. В Проекте 3 я покажу, как использовать RPi Zero W для управления 64×64 RGB матрицей.
Проект 1: Raspberry Pi Zero Wireless трекер самолетов
| Деталь | Стоимость | Примечания |
|---|---|---|
| Raspberry Pi Zero Wireless | $10 | |
| SDR приемник | $21 | Многие другие USB SDR приемники, вероятно, сработают |
| 4GB microSD карта | $6 | Большие карты сработают |
| USB-to-MicroUSB адаптер | $5 | |
| MicroUSB Hub (опционально) | $8 | Pi Zero имеет только microUSB порты; для подключения аксессуаров нужен хаб/конвертер |
| Широкополосная антенна (опционально) | $50 | Антенна должна покрывать 1090 МГц |
| 1090 МГц полосовой фильтр (опционально) | $20 |
Ресурсы
- Raspbian Jessie (Руководство по установке)
- PiAware Установка
Этот эксперимент сделан с Raspberry Pi Zero Wireless. Однако следующий код должен работать на любом Raspberry Pi версии 2 или новее. Если вы покупаете Pi Zero без wireless, можете добавить его с wireless USB сетевым донглом.
Шаг 1: Подготовка SD карты
Скачайте последний Raspbian Jessie на ваш компьютер.
Запишите образ на SD карту (вот гайды для Linux, Mac OS и Windows).
Шаг 2: Модификация SD карты
Создайте файл с именем «ssh» в корневой директории SD карты. Без расширения файла, без содержимого. Этот файл включает SSH, позволяя удаленный доступ к Pi.
Создайте файл с именем «wpa_supplicant.conf» со следующим содержимым. Измените значения YourWifiName и YourWifiPassword на имя и пароль, которые вы используете для подключения к вашей Wi-Fi сети.
network={
ssid="YourWifiName"
psk="YourWifiPassword"
key_mgmt=WPA-PSK
}
Шаг 3: Установка и загрузка
Извлеките SD карту из компьютера и установите в Raspberry Pi Zero Wireless. Подключите Raspberry Pi к источнику питания через MicroUSB порт, ближайший к краю платы. Подождите примерно минуту для загрузки Raspberry Pi и подключения к Wi-Fi. С этими конфигурационными файлами нет необходимости использовать клавиатуру, мышь или дисплей с вашим устройством.
Шаг 4: Найдите ваш Pi
Определите IP адрес вашего Pi — это можно сделать, войдя в роутер и посмотрев на подключенные устройства, или через IP сканер вроде Look@Lan (Windows) или nmap (Linux и Mac). Если устройство не появляется в течение двух или трех минут, отключите питание, извлеките SD карту из Pi и вставьте обратно в компьютер и дважды проверьте файлы ssh и wpa_supplicant.conf.
Шаг 5: Подключение к вашему Pi
Windows: Используйте инструмент вроде Putty для подключения к вашему Pi. Скачайте и запустите программу, введите IP адрес вашего Pi и нажмите «connect». Появится окно, спрашивающее о сертификате безопасности — нажмите «yes».
Linux и Mac: Откройте терминал и введите «ssh pi@raspberrypi.local» или «ssh pi@ipaddress» (например, «ssh pi@192.168.0.52»).
На промпте, имя пользователя по умолчанию «pi», пароль по умолчанию «raspberry».
Шаг 6: Настройка вашего Pi
Введите «sudo raspi-config» и нажмите enter.
Измените пароль, часовой пояс и локализацию.
Когда появится запрос пароля, текущий пароль «raspberry»; вы должны изменить его на что-то более безопасное, чтобы сделать хотя бы немного сложнее взломать ваше устройство. С другой стороны, вместо паролей вы должны использовать сертификаты для аутентификации, но это не будет обсуждаться в этой статье.
Затем введите следующие команды и позвольте им выполниться:
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
После завершения загрузки Raspberry Pi, откройте веб-браузер на вашем компьютере и перейдите на https://raspberrypi.local:8080 (или замените raspberrypi.local на IP адрес вашего устройства). Уменьшите масштаб, затем увеличьте в ваше местоположение, как самолеты начинают появляться и исчезать с вашего экрана.
Чтобы увеличить количество самолетов, возьмите ваш Pi, SDR и антеннную систему на улицу. Дальнейшие улучшения найдены добавлением 1090 МГц полосового фильтра и лучшей антенны.
Наконец, создайте аккаунт FlightAware.com и ассоциируйте ваш приемник с вашим FlightAware.com аккаунтом.
ADS-B, PiAware и dump1090
Транспондеры, прикрепленные к самолетам, позволяют им вещать четырехзначный октальный идентификатор (Mode-A AKA "Squawk") идентификатор плюс высота (Mode-C), 24-битный уникальный ICAO номер (Mode-S) и 24-битный ICAO номер с дополнительной информацией (Mode S Extended Squitter). Последний режим также известен как ADS-B.
Automatic Dependent Surveillance-Broadcast (ADS-B) берет позицию самолета (как определено GPS, GLONASS и т.д.), комбинирует с идентифицирующей информацией и вещает на 1090 МГц. В отличие от других транспондерных кодов, которые передаются только в ответ на допрос радарным сигналом, ADS-B передается примерно дважды в секунду.
PiAware и dump1090 используют Software Defined Radio (SDR), настроенный на 1090 МГц, для приема и декодирования вещания всех самолетов в окрестностях и отправки их на серверы FlightAware. Информация отображается на веб-странице, хостятся на Raspberry Pi на порту 8080.
Все самолеты должны быть оснащены ADS-B Out транспондерами к 1 января 2020. Но до тех пор FlightAware использует мультилатерацию для определения местоположения самолетов, не вещающих свою широту и долготу. Мультилатерация использует известную позицию минимум трех приемников и времена приема сообщения для расчета позиции самолета.
Проект 2: Использование Pi Zero Wireless для сбора данных самолетов с FlightAware.com
FlightAware.com имеет два Application Program Interfaces (API), позволяющих добывать и использовать данные: FlightXML и Firehose. Выбирайте между ними на основе типа информации, который вам нужен, и сколько запросов вам нужно в месяц. Для этого проекта All About Circuits получил бесплатный доступ на один месяц. Чтобы следовать, вам нужно связаться с FlightAware.com для API ключа.
Ресурсы:
- Flight Aware Firehose Documentation
Шаг 1: Проверка связности
Подключитесь к вашему Pi Zero через SSH и проверьте связность с Firehose API.
openssl s_client -host firehose.flightaware.com -port 1501 -tls1
Если вы видите страницу или две деталей сертификации, все сработало правильно.
Шаг 2: Получение примеров файлов и данных
FlightAware хостит примеры файлов на GitHub. Начните с скачивания и редактирования примеров файлов с вашим именем пользователя и API ключом.
git clone https://github.com/flightaware/firehose_examples.git cd firehose_examples/perl/example1 sudo nano example1.pl
Измените поля username и apikey под вашу информацию, затем выйдите ([Ctrl]+[x]) и сохраните.
perl example1.pl
Вы должны увидеть данные в 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'
};
Шаг 3: Настройка вашего Pi для сбора данных
Firehose адекватно названо в том, что оно может производить подавляющее количество данных за очень короткий период времени (~1 ГБ/день) — заполняя ваш диск и увеличивая расходы на ваш аккаунт. Поэтому когда вы создаете скрипт для сбора информации, вы должны проверять его на регулярных интервалах, так как вы можете очень быстро заполнить диск и опустошить счет расходов.
В зависимости от размера вашей MicroSD карты и того, что вы хотите собрать, вам может понадобиться добавить дополнительное хранилище или вернуться к raspi-config и расширить файловую систему (опция 7, опция A1).
Для моего примера я собираю данные для 2° × 2° географической области, включающей LGB, LAX, ONT, SNA и т.д. (34° N ± 1°, 118° W ± 1°). Я выбрал этот регион, потому что он приближает мою зону приема.
Следующий код — example1.pl, с изменениями в строках 18 и 45. Все строки показаны ниже, чтобы читатели могли следовать без скачивания файла. Создайте копию example1.pl под названием position.pl и используйте nano для редактирования 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 # Открытие TLS сокет соединения к FlightAware.
14 my $sock = IO::Socket::SSL->new('firehose.flightaware.com:1501') or die $!;
15 # print "Connected!\n";
16
17 # Отправка команды инициализации на несжатый сокет.
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 # Активация сжатия, если запрошено.
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 # Главный цикл, чтение строк JSON с сервера.
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";
Строка 18 ограничивает запрос самолетами в географическом регионе между 117° W и 119° W (обозначается -117 и -119). Строка 43 модифицирована для демонстрации метода таргетинга только полей интереса. В этом случае мы таргетим номер рейса самолета, широту, долготу и высоту. Строка 45 запрашивает 10 самолетов с сервера (эту строку можно закомментировать в финальном скрипте).
Следующие две команды выполняют программу и позволяют мониторить прогресс:
sudo perl position.pl >> position.txt & tail -f position.txt
Первая строка имеет суперпользователь использует программу perl для запуска программы position.pl и добавления (>>) вывода в файл position.txt и символ & вызывает программу запуска в фоне.
Вторая строка использует программу tail для следования (-f) изменениям в файле position.txt, позволяя мониторить команду на завершение. Когда готово, используйте [Ctrl]+[c] для выхода из tail. Если вы больше не заинтересованы в сборе данных, используйте fg чтобы вернуть программу position.pl на передний план и остановить или прервать с [Ctrl]+[c].
Ниже .zip файл содержит модифицированные программы и вывод, который надеемся демонстрирует, как незначительные изменения в синтаксисе могут привести разную информацию в фокус, вместе с примером вывода программ.
- arrivals.pl дает JSON вывод для самолетов, только что приземлившихся (либо прибывающих, либо улетающих LAX)
- test_landing.pl дает читаемый вывод (например, AAL1155 landed at 03/21/2017 22:00:01)
- position.pl дает JSON вывод для всех самолетов в географическом прямоугольнике (34° N ± 1°, 118° W ± 1°)
- test_overhead.pl дает идентификацию рейса, широту, долготу и высоту (N721PP 34.36011 -118.37837 18100)
Эти файлы сделаны с незначительными модификациями example1.pl, предоставленным FlightAware. Чтобы сделать свой, захватывающий только данные, которые вас интересуют, используйте FlightAware Firehose API документацию для запроса подходящей информации в JSON формате, и затем используйте правильный синтаксис внутри файла для вывода только нужной информации.
Проект 3: Использование Pi Zero Wireless для управления 64×64 RGB матрицей
| Деталь | Стоимость | Примечания |
|---|---|---|
| (2) 2× 32×32 RGB дисплейная матрица + блок питания | $75 ($150) | Требуется всего четыре 32×32 RGB матрицы для создания 64×64 пиксельного дисплея |
| Adafruit RGB matrix HAT + RTC часы | $25 | Datasheets |
| 20-pin IDC кабель (Hub75) | $7-$13 | Необходимая длина зависит от конфигурации панелей и расстояния до Pi |
| 0.1" male хедера (40-pin, 2×20) | $1 | 2.54 мм |
Шаг 1: Подготовка Adafruit Matrix HAT
Припаяйте male и female хедера на Adafruit HAT согласно инструкциям на Adafruit.com. Затем припаяйте провод или присоедините перемычку между пинами 4 и 18. Для этого проекта вам не нужно прикреплять ни DC barrel jack, ни screw terminal коннекторы.
Шаг 2: Подготовка Raspberry Pi
Припаяйте 2×20 male хедера на месте.
Шаг 3: Подготовка RGB матрицы
Ориентируйте RGB матрицы так, чтобы стрелки на нижнем ряду указывали вниз, а стрелки на верхнем ряду — вверх (см. изображение здесь). Используйте 2×10 IDC кабель для соединения выхода Adafruit HAT с входом первой платы. Затем соедините выход первой платы с входом второй, выход второй с входом третьей и т.д.
Если вы достаточно счастливы иметь лазерный резак или CNC станок, я включил чертежи для задней панели, способной удерживать все четыре RGB матричные пластины. Монтажные отверстия заменены на слоты для выравнивания от общей центральной точки.
Hughes_4x4RGBMatrix.zip
Полная документация и исходный код от Hennen Zeller.
После того как все электрические соединения сделаны, включите Raspberry Pi. После примерно одной минуты попытайтесь войти на Pi с Putty или SSH.
После входа введите следующее для отключения звука на Pi (документация указывает на конфликт аппаратной подсистемы со звуком и RGB матричным железом).
cat << EOF | sudo tee /etc/modprobe.d/blacklist-rgb-matrix.conf blacklist snd_bcm2835 EOF sudo update-initramfs -u
Затем используйте apt-get для установки Python и imaging файлов.
sudo apt-get install -y build-essential libconfig++-dev python-dev python-imaging libgraphicsmagick++-dev libio-socket-ssl-perl
Получите необходимые файлы для запуска RGB матрицы и скомпилируйте их.
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
Опционально, если у вас также есть камера, подключенная к вашему Pi, вы можете захватить 64×64 пиксельное изображение и подать его на дисплей.
raspistill -w 64 -h 64 -o myimg.png sudo ./led-image-viewer -L -f myimg.png
Предыдущие две строки захватывают 64×64 изображение на дисплей и используют программу led-image-viewer (скомпилированную в предыдущем разделе) для отображения на Большом дисплее (-L) навсегда (-f).
Что дальше?
Теперь у вас есть $10 компьютер, который может трекать (либо с антенной и SDR приемником, либо с API вызовом) самолеты вокруг вас и отображать любую информацию об них на вашем 64-пиксельном на 64-пиксельном дисплее, или на HDMI выходе Raspberry Pi Zero W.
Что вы сделаете с этим ограничено только вашим воображением.
Поскольку эта статья только вводит инструки, первый шаг, который я рекомендую — прочитать документацию для дисплея и FlightAware и затем открыть примерные программы обоих для лучшего понимания их возможностей.
И не забывайте, что ваш Raspberry Pi Zero — функционирующая Linux установка, завершенная с часто используемыми командами вроде Cron, Grep и Awk. Все, что еще не на вашем Pi, всего в одном коротком apt-get install вдали.
Посмотрите видео ниже, чтобы увидеть кульминацию этих проектов!
Попробуйте этот проект сами! Получите BOM.
Промышленное оборудование
- Pixus Technologies: передовые закаленное SDR для миссионно-критических сред
- Подключение нескольких DS18B20 1-Wire датчиков к Raspberry Pi для точного мониторинга температуры
- Эффективный мониторинг температуры серверных с Raspberry Pi и Nagios
- Домашний энергетический центр: мониторинг солнечных панелей, тепловых коллекторов и температуры комнат на Ra…
- Создание умного домашнего контроллера 433 МГц с Sensorflare и Raspberry Pi
- Чтение аналоговых датчиков с Raspberry Pi и Zabbix: пошаговое руководство
- Создайте свой первый IoT-проект с Raspberry Pi, DHT11 и ThingSpeak
- Создайте автоматизированную аэропоническую систему с Raspberry Pi и датчиком влажности
- Сборка LoRa-шлюза на модуле RAK831 и Raspberry Pi 3 — пошаговое руководство
- Создание робота на Raspberry Pi и Python: полное руководство