低コストで精度の高いフライト追跡:Raspberry Pi Zero Wireless、SDR、FlightAware
Raspberry Pi Zero Wirelessを使用して、あなたの地域のフライトを追跡する2つの方法を紹介。また、64×64 RGBマトリックスを制御する方法も実演。
Raspberry Pi Zero Wirelessは10ドルのマイクロコンピューターで、多くのことが可能です。この記事では、このPiを使用してあなたの地域のフライトを追跡する2つの方法を紹介します。また、64×64 RGBマトリックスを制御してフライト番号を表示する方法も実演します。
この記事では、Raspberry Pi Zero Wirelessを使用して3つの別個のプロジェクトを行います。プロジェクト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-MicroUSBアダプター | $5 | |
| MicroUSBハブ(オプション) | $8 | Pi ZeroにはmicroUSBポートのみ;アクセサリ接続にはハブ/コンバーター必要 |
| 広帯域アンテナ(オプション) | $50 | アンテナは1090 MHzをカバーする必要あり |
| 1090 MHzバンドパスフィルター(オプション) | $20 |
リソース
- Raspbian Jessie(インストールガイド)
- PiAwareインストール
この実験はRaspberry Pi Zero Wirelessで実施しました。ただし、以下のコードはRaspberry Piバージョン2以降で動作するはずです。ワイヤレスなしのPi Zeroを購入した場合、ワイヤレスUSBネットワークドングルで追加可能です。
ステップ1:SDカードの準備
最新のRaspbian Jessieをコンピューターにダウンロード。
イメージをSDカードに書き込み(Linux、Mac OS、Windows向けガイドあり)。
ステップ2:SDカードの修正
SDカードのルートディレクトリに「ssh」という名前のファイルを作成。拡張子なし、内容なし。このファイルでSSHが有効になり、Piにリモートアクセス可能になります。
「wpa_supplicant.conf」というファイルを以下の内容で作成。YourWifiNameとYourWifiPasswordをご自身のWi-Fiネットワーク名とパスワードに変更してください。
network={
ssid="YourWifiName"
psk="YourWifiPassword"
key_mgmt=WPA-PSK
}
ステップ3:インストールと起動
コンピューターからSDカードをイジェクトし、Raspberry Pi Zero Wirelessに装着。基板端に近いMicroUSBポートを使用してPiを電源に接続。約1分待ってPiが起動しWi-Fiに接続するのを待ちます。これらの設定ファイルにより、キーボード、マウス、ディスプレイなしでデバイスを使用できます。
ステップ4:Piの特定
ルーターにログインして接続デバイスを見るか、Look@Lan(Windows)やnmap(Linux/Mac)などのIPスキャナーでPiのIPアドレスを特定。2〜3分以内にデバイスが表示されない場合は、電源を切り、SDカードを取り出してコンピューターに再挿入し、sshとwpa_supplicant.confファイルを再確認してください。
ステップ5:Piへの接続
Windows:PuttyなどのツールでPiに接続。プログラムをダウンロードして実行し、PiのIPアドレスを入力して「接続」をクリック。セキュリティ証明書について尋ねるウィンドウが表示されたら「はい」をクリック。
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 MHzバンドパスフィルターとより良いアンテナを追加すればさらに改善されます。
最後に、FlightAware.comアカウントを作成し、受信機をFlightAware.comアカウントに関連付けます。
ADS-B、PiAware、dump1090
航空機に取り付けられたトランスポンダーは、4桁の8進法識別子(モードA別名「スクォーク」)識別子と高度(モードC)、24ビット固有ICAO番号(モードS)、追加情報付き24ビットICAO番号(モードS拡張スクォッター)をブロードキャストします。最後のモードはADS-Bとしても知られています。
Automatic Dependent Surveillance-Broadcast(ADS-B)は、航空機の位置(GPS、GLONASS等で決定)を識別情報と組み合わせ、1090 MHzでブロードキャストします。他のトランスポンダーコードがレーダー信号による尋問への応答としてのみ送信されるのに対し、ADS-Bは約秒間2回送信されます。
PiAwareとdump1090は、1090 MHzにチューニングされたソフトウェアデファインドラジオ(SDR)を使用して、近隣のすべての航空機のブロードキャストを受信・デコードし、FlightAwareのサーバーに送信します。情報はRaspberry Piのポート8080でホストされるウェブページに表示されます。
すべての航空機は2020年1月1日までにADS-B Outトランスポンダーを装備することが義務付けられています。それまでの間、FlightAwareはマルチラテレーションを使用して、緯度経度をブロードキャストしない飛行機の位置を特定します。マルチラテレーションは、既知の位置にある少なくとも3つの受信機とメッセージ受信時刻を使用して、飛行機の位置を計算します。
プロジェクト2:Pi Zero WirelessでFlightAware.comから飛行機データを収集
FlightAware.comには、データをマイニングして利用できる2つのAPI(FlightXMLとFirehose)があります。必要な情報の種類と月間クエリ数に基づいて選択してください。このプロジェクトでは、All About Circuitsが1ヶ月間の無料アクセスを許可されました。実践するにはFlightAware.comでAPIキーを取得する必要があります。
リソース:
- FlightAware Firehoseドキュメント
ステップ1:接続テスト
SSHでPi Zeroに接続し、Firehose APIへの接続をテスト。
openssl s_client -host firehose.flightaware.com -port 1501 -tls1
1〜2ページの証明書詳細が表示されれば正常です。
ステップ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
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 GB/日)を生成します。ディスクを満たし、アカウント課金を増やすため、情報収集スクリプトを作成する際は定期的にチェックし、ディスクが急速に満杯になったり経費が枯渇したりしないよう注意してください。
MicroSDカードのサイズと収集したいデータ量によっては、追加ストレージが必要か、raspi-configでファイルシステムを拡張(オプション7、オプションA1)する必要があります。
この例では、LGB、LAX、ONT、SNA等を含む2°×2°の地理的領域(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
必要な編集を行い、[Ctrl]+[x]で終了。
#!/usr/local/bin/perl
use strict;
use IO::Socket::SSL;
use JSON::PP;
use IO::Uncompress::Inflate qw($InflateError);
use Data::Dumper;
my $username = 'allaboutcircuits';
my $apikey = 'allaboutcircuitsreallylongapikey';
my $compression = 0;
# Open the TLS socket connection to FlightAware.
my $sock = IO::Socket::SSL->new('firehose.flightaware.com:1501') or die $!;
# print "Connected!\n";
# Send the initiation command to the uncompressed socket.
my $initcmd = "live version 8.0 user $username password $apikey events \"position\" latlong \"33 -117 35 -119\"";
if ($compression) {
$initcmd .= " compression compress";
}
binmode $sock;
print $sock "$initcmd\n";
# Activate compression, if requested.
my $zsock;
if ($compression) {
$zsock = new IO::Uncompress::Inflate $sock
or die "IO::Uncompress::Inflate failed: $InflateError\n";
} else {
$zsock = $sock;
}
# Main loop, reading lines of JSON from the server.
my $i = 1;
while (my $line = $zsock->getline()) {
#print "LINE $i\n";
#print "LINE $i: ", $line, "\n";
my $data = eval { decode_json $line };
die "Failed to decode JSON: $line" if !defined($data) || $@;
print $data->{ident}." \t".$data->{lat}." \t " . $data->{lon} . " \t". $data->{alt}." \n";
last if ($i++ >= 10);
}
close $sock;
# print "All done.\n";
18行目で、西経117°と119°(-117と-119で表記)の間の地理的領域の飛行機にリクエストを制限。43行目を変更して、関心のあるフィールドのみをターゲットにする方法を実演。この場合、飛行機の便名、緯度、経度、高度をターゲットに。45行目でサーバーから10機の飛行機を要求(最終スクリプトではこの行をコメントアウト可能)。
次の2つのコマンドでプログラムを実行し、進捗を監視:
sudo perl position.pl >> position.txt & tail -f position.txt
1行目はスーパーユーザーがperlを使ってposition.plを実行し、出力をposition.txtに追記(>>)し、&シンボルでバックグラウンド実行。2行目はtailでposition.txtの変更を追跡(-f)し、コマンド完了を監視可能。完了したら[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:地理的長方形(34° N ± 1°、118° W ± 1°)内の全飛行機のJSON出力
- test_overhead.pl:飛行機識別、緯度、経度、高度(例:N721PP 34.36011 -118.37837 18100)
これらのファイルは、FlightAware提供のexample1.plに微修正を加えて作成。自分専用のデータを取得するには、FlightAware Firehose APIドキュメントを参照し、JSON形式で適切な情報を要求し、ファイル内で正しい構文を使用して必要な情報のみ出力するようにしてください。
プロジェクト3:Pi Zero Wirelessで64×64 RGBマトリックスを制御
| 部品 | 費用 | 備考 |
|---|---|---|
| (2) 2×32×32 RGBディスプレイマトリックス + 電源 | $75($150) | 64×64ピクセルディスプレイ作成には合計4枚の32×32 RGBマトリックス必要 |
| Adafruit RGBマトリックスHAT + RTCクロック | $25 | データシート |
| 20ピンIDCケーブル(Hub75) | $7-$13 | 必要長はパネル配置とPiまでの距離による |
| 0.1インチメスヘッダー(40ピン、2×20) | $1 | 2.54 mm |
ステップ1:AdafruitマトリックスHAT準備
Adafruit.comの指示に従って、Adafruit HATにメスとオスのヘッダーをはんだ付け。次にピン4と18の間にワイヤーまたはジャンパーをはんだ付けまたは接続。このプロジェクトではDCバレルジャックもねじ端子コネクタも接続不要。
ステップ2:Raspberry Pi準備
2×20オスヘッダーを所定位置にはんだ付け。
ステップ3:RGBマトリックス準備
RGBマトリックスを配置し、下段の矢印が下向き、上段の矢印が上向きになるようにする(画像参照)。2×10 IDCケーブルでAdafruit HATの出力を最初のボードの入力に接続。次に最初のボードの出力を2番目の入力に、2番目の出力を3番目の入力に、というように接続。
レーザーカッターやCNCマシンがあれば、4枚のRGBマトリックスプレートを保持するバックプレートの図面を同梱しています。取り付け穴はスロットに置き換えられ、共通の中心点からのアライメントを可能にしています。
Hughes_4x4RGBMatrix.zip
Hennen Zellerによる完全なドキュメントとソースコード。
すべての電気接続が完了したら、Raspberry Piの電源を投入。約1分後、PuttyまたはSSHでPiにログインを試みる。
ログインしたら、以下を入力してPiのサウンドを無効化(ドキュメントによるとサウンドとRGBマトリックスハードウェアのハードウェアサブシステム競合があるため)。
cat << EOF | sudo tee /etc/modprobe.d/blacklist-rgb-matrix.conf blacklist snd_bcm2835 EOF sudo update-initramfs -u
次にapt-getでPythonとイメージングファイルをインストール。
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
前の2行で64×64画像を撮影し、ディスプレイに表示。プログラムled-image-viewer(前セクションでコンパイル)を使用して、大画面(-L)に永遠に(-f)表示します。
次のステップ
今や、あなたの周囲の航空機を追跡(アンテナとSDRレシーバー、またはAPIコールで)し、それらについての任意の情報を64ピクセル×64ピクセルディスプレイやRaspberry Pi Zero WのHDMI出力に表示できる10ドルのコンピューターが手に入りました。
それをどう活用するかはあなたの想像力のみによって制限されます。
この記事はツールの導入のみなので、最初のステップとしてディスプレイとFlightAwareのドキュメントを読み、両方のサンプルプログラムを開いて機能をよりよく理解することを推奨します。
また、Raspberry Pi ZeroはCron、Grep、Awkなどのよく使われるコマンドを備えた機能するLinuxインストールであることを忘れないでください。Piにまだないものは、短いapt-get installで手に入ります。
以下のビデオでこれらのプロジェクトの集大成をご覧ください!
このプロジェクトを自分で試してみてください!BOMを入手。
産業機器
- 複数DS18B20 1-WireセンサーをRaspberry Pi接続で精密温度監視
- Raspberry PiとNagiosで室温を効率監視
- ホームエナジーセンター:Raspberry PiとMoteinoで太陽光発電、ソーラー熱、室温を監視
- SensorflareとRaspberry Piで433MHzスマートホームコントローラーを構築
- Raspberry PiとZabbixでアナログセンサーを読み取り - ステップバイステップガイド
- Raspberry Pi、DHT11、ThingSpeakで作る初めてのIoTプロジェクト
- Raspberry Piと湿度センサーで作る自動エアロポニックスシステム
- Raspberry Pi 3 と RAK831 モジュールで LoRa ゲートウェイを構築するステップバイステップガイド
- Raspberry Pi と Python でロボットを構築:完全ガイド
- Arduino & Raspberry Pi でインターネット制御ビデオストリーミングロボットを構築
- Pixus Technologies:ミッションクリティカル環境向け最先端堅牢化SDR