4378 文字
22 分

Raspberry Pi + RTL-SDR で ADS-B 受信局を構築し Flightradar24 と FlightAware にフィードする手順と運用記録

3 秒まとめ#

  • 自宅の Raspberry Pi と RTL-SDR ドングルで航空機の ADS-B 信号を受信し、Flightradar24 と FlightAware に同時フィードしています
  • 見返りに Flightradar24 の Contributor プラン(Business プラン相当、月額 $49.99)と FlightAware の Enterprise アカウント(月額 $89.95)が無料になります(金額は執筆時点)
  • 受信機は初代 Raspberry Pi Zero W(単コア・512MB)で十分動きます。Pi 4 → Pi 3 → Zero W と縮小しながら 5 ヶ月運用中です
  • 運用 1 ヶ月後に 1090MHz バンドパスフィルタ内蔵のドングルに交換したら、最大受信距離が 41.7nm → 71.4nm、同時受信機数が平均 2 機 → 6 機に増えました。都心はノイズが多いのでフィルタは必須です
  • readsb / tar1090 / graphs1090 / fr24feed / piaware の構築手順を全部書きました

どんな人向けの記事?#

  • Flightradar24 の無料プランの広告に耐えかねている人
  • Raspberry Pi と数千円のドングルで何か実用的なものを動かしたい人
  • 都心のマンションで ADS-B を受信すると、どのくらい拾えるのか知りたい人
  • 引き出しで眠っている Raspberry Pi Zero W の使い道を探している人

きっかけ:息子の飛行機ブーム#

構築のきっかけは、息子の「飛行機ブーム」でした。空を見上げては「きー!」と指をさして教えてくれるので、飛来状況を調べるために Flightradar24 を多用していましたが、無料プランの広告の多さに閉口していました。

「データを提供すれば広告フリーの Business プランが手に入る」と知り、エンジニア魂に火がついて受信システムを構築することにしました。

Flightradar24 は自前の受信機からデータをフィードすると、フィードが続いている間は Contributor プラン(Business プラン相当)を無料で使えます。FlightAware も同様に、フィーダーには Enterprise アカウントが提供されます。1 台の受信機で 2 つのサービスの上位プランを同時に得られるのが美味しいところです。

サービスフィーダーに提供されるプラン通常価格(執筆時点)
Flightradar24Contributor(Business 相当)$49.99/月(年払いで $499.99)
FlightAwareEnterprise$89.95/月

設置環境#

設置場所は都心(港区)のマンションで、地上高はおよそ 20m です。周りはビルだらけで、地形的には谷の底。ADS-B の受信条件としては、正直かなり悪いです。アンテナは屋外に出しています。

広域を拾うのは最初から諦めて、近隣の旧防衛省ヘリポート周辺をカバーするという局所的なミッションで運用しています。それでも後述のフィルタ付きドングルに替えてからは、70nm(約 130km)先まで届くようになりました。

tar1090 に表示された 24 時間の受信範囲。谷底のマンションでも北関東や伊豆方面まで届いている

買ったもの#

品目役割備考
RTL-SDR Blog V4最初のドングル汎用の SDR ドングル。最初の 1 ヶ月はこれで受信
1090MHz ADS-B アンテナ(マグネット基台)アンテナ屋外に設置
Raspberry Pi 3 Model B2 台目の受信機Pi 4 から降格。これももったいないので Zero W に交代
Raspberry Pi Zero W現在の受信機初代の単コアモデル。今から買うなら Zero 2 W
1090MHz バンドパスフィルタ + RF アンプ内蔵 RTL2832U ドングル現在のドングル運用 1 ヶ月後に交換。効果は後述

RTL-SDR Blog V4 は ADS-B 以外にも使える定番のドングルです。最初はこれで始めました。

アンテナは 1090MHz 専用のマグネット基台のもの。金属板の上に置くだけで設置できます。

受信機は最初 Raspberry Pi 4 Model B(4GB)で組み、その後 Pi 3 Model B に降格し、最終的に初代 Pi Zero W に落ち着きました。ADS-B の受信だけなら明らかにオーバースペックだったからです。Pi 3 も Pi 4 も、他の用途に回したほうが有意義です。

Pi Zero W は手元にあった初代を使っています。今から買うならクアッドコアの Zero 2 W のほうが良いです。単コアの初代でも動きますが、後述のとおり負荷はギリギリです。

そして運用 1 ヶ月後に買い足したのが、1090MHz のバンドパスフィルタと RF アンプを内蔵した ADS-B 専用ドングルです。これが本記事で一番効いた買い物でした。

構成#

公式のオールインワン・インストーラーに頼らず、デコーダーとフィーダーを疎結合にする構成を採用しました。SDR から上がってくる Raw データを readsb がデコードし、TCP ポート 30005(Beast 形式)で待ち受けます。そこに Flightradar24 用の fr24feed と FlightAware 用の piaware を接続して、1 つの受信機から 2 つのサービスへ同時にデータを提供しています。

graph LR
ANT["1090MHz アンテナ<br/>(屋外・地上高約 20m)"] --> SDR["RTL-SDR ドングル<br/>(1090MHz バンドパス内蔵)"]
SDR -->|USB| READSB["readsb<br/>デコーダー兼ハブ"]
READSB -->|Beast TCP :30005| FR24["fr24feed<br/>→ Flightradar24"]
READSB -->|Beast TCP :30005| PIAWARE["piaware<br/>→ FlightAware"]
READSB -->|JSON /run/readsb| TAR["tar1090<br/>リアルタイム地図"]
READSB -->|stats.json| GRAPHS["graphs1090<br/>パフォーマンスグラフ"]

現在のソフトウェア構成は以下のとおりです。

ソフトウェア役割バージョン
Raspberry Pi OS Lite(32-bit)OS13 (trixie)、kernel 6.18
readsbADS-B デコーダー兼ハブ3.16.11
tar1090ローカルのリアルタイム地図3.16.11
graphs1090(自分のフォーク)パフォーマンスグラフ1.6.0
fr24feedFlightradar24 フィーダー1.0.57-1
piawareFlightAware フィーダー11.1

構築手順#

1. OS#

Raspberry Pi Imager で Raspberry Pi OS Lite(32-bit)を書き込みます。初代 Zero W は ARMv6 なので 64-bit 版は動きません。Imager の設定画面でホスト名・SSH・Wi-Fi を入れておくと、ディスプレイもキーボードも繋がずに済みます。

起動したら SSH で入ってパッケージを最新にします。

Terminal window
sudo apt update && sudo apt full-upgrade -y
sudo reboot

2. readsb#

デコーダーには wiedehopf 氏の readsb を使います。インストールスクリプトが readsb 本体に加えて tar1090 と、緯度経度やゲインを設定する補助コマンドまで入れてくれます。

Terminal window
sudo bash -c "$(wget -O - https://github.com/wiedehopf/adsb-scripts/raw/master/readsb-install.sh)"

受信機の緯度経度を設定します。これがないと tar1090 の距離表示や受信範囲の計算ができません。

Terminal window
sudo readsb-set-location <緯度> <経度>

設定ファイルは /etc/default/readsb です。私の設定はこんな感じです。

RECEIVER_OPTIONS="--device 0 --device-type rtlsdr --gain auto --ppm 0"
DECODER_OPTIONS="--lat xx.xxxx --lon yyy.yyyy --max-range 450 --write-json-every 1"
NET_OPTIONS="--net --net-ri-port 30001 --net-ro-port 30002 --net-sbs-port 30003 --net-bi-port 30004,30104 --net-bo-port 30005"
JSON_OPTIONS="--json-location-accuracy 2 --range-outline-hours 24"

ポイントは以下のとおりです。

  • --gain auto: readsb 内蔵のオートゲイン。強すぎる信号の割合を見ながら自動でゲインを調整してくれるので、手で追い込む必要がありません
  • --net-bo-port 30005: Beast 形式の出力ポート。fr24feed と piaware はここに接続します
  • --range-outline-hours 24: tar1090 に直近 24 時間の受信範囲の輪郭を描かせます
  • --json-location-accuracy 2: tar1090 の JSON に受信機の正確な位置を含めます。LAN 内でしか見ないので 2 ですが、外部に公開するなら 1(約 1km 単位に丸める)か 0(含めない)にしてください

設定を変えたら再起動します。

Terminal window
sudo systemctl restart readsb

3. tar1090#

tar1090 は readsb の出力をブラウザで地図表示するツールです。readsb のインストールスクリプトが一緒に入れてくれますが、単体でのインストールや更新は以下のコマンドです。

Terminal window
sudo bash -c "$(wget -nv -O - https://github.com/wiedehopf/tar1090/raw/master/install.sh)"

http://受信機のIPアドレス/tar1090/ で開けます。

tar1090 のリアルタイム受信画面

個別機体を選択すると、機種・速度・高度・信号強度(RSSI)などの詳細情報が確認できます。下は JAL329(Boeing 787-8)を捕捉したときの画面です。

tar1090 で JAL329 Boeing 787 を捕捉した画面

使ってみてわかったのは、Flightradar24 の地図は tar1090 より 10 秒ほど遅れて表示されるということです。tar1090 は 1 秒ごとに更新されるので、頭上を通過する機体を見上げながら確認するなら、自宅の tar1090 のほうが圧倒的に向いています。

4. graphs1090#

graphs1090 は readsb の統計情報(メッセージレート、受信距離、信号レベルなど)を rrdtool で長期間グラフ化するツールです。本家の wiedehopf 版は作りが古い(jQuery + Bootstrap 時代のまま)ので、フォークしてかなり改造した自分の版を使っています。

Terminal window
sudo bash -c "$(curl -L -o - https://github.com/matsubo/graphs1090/raw/master/install.sh)"

http://受信機のIPアドレス/graphs1090/ で開けます。

matsubo
/
graphs1090
Waiting for api.github.com...
00K
0K
0K
Waiting...

フォークでの主な変更点は以下のとおりです。

  • jQuery と Bootstrap を撤去して素の JavaScript と CSS に書き直しました。約 390KB のライブラリが消え、ライト / ダークテーマの切り替えを付けました
  • CPU・メモリ・ディスク・温度などの OS グラフを削除しました。見たいのは ADS-B のグラフだけです
  • CDN 依存をゼロにしました。散布図も ECharts をやめて canvas で描いているので、受信機がインターネットに出られなくても表示できます
  • 単コア向けのオプション DRAW_ALLBOOT_DRAW_DELAY を追加し、SD カードへの書き込みも減らしました
  • shellcheck での修正、XSS や rm -rf の事故防止などのセキュリティ修正、リポジトリ構成の整理

改造した graphs1090 の画面

Pi Zero W では rrdtool の描画が重いので、/etc/default/graphs1090 でグラフの生成を 1 日 1 回にしています。

DRAW_INTERVAL=86400 # 描画間隔。既定の 60 秒から 1 日に
DRAW_ALL=yes # その 1 回で全期間のグラフをまとめて描く
BOOT_DRAW_DELAY=600 # 起動後 10 分は描画しない(起動処理と重ねない)
enable_scatter=no # 散布図のデータ収集も止める

既定のままだと 60 秒ごとに描画が走り、単コアの Zero W では他の処理が待たされます。1 日 1 回で困ることは何もありませんでした。

5. fr24feed#

Flightradar24 のフィーダー fr24feed は公式の apt リポジトリから入れます。ただし Raspberry Pi OS 13 (trixie) の apt はレガシーな署名のリポジトリを拒否するため、[trusted=yes] を付けて署名検証を明示的にスキップします。

Terminal window
echo "deb [trusted=yes] https://repo-feed.flightradar24.com flightradar24 raspberrypi-stable" | sudo tee /etc/apt/sources.list.d/fr24feed.list
sudo apt update
sudo apt install -y fr24feed

インストールしたらサインアップのウィザードを実行します。

Terminal window
sudo fr24feed --signup

聞かれる項目はメールアドレス、sharing key(新規なら空欄)、MLAT の有無、受信機の種類です。受信機の種類は「ModeS Beast」、接続方式は Network を選び、ホストに 127.0.0.1:30005 を指定して readsb に接続させます。完了すると sharing key が発行され、/etc/fr24feed.ini に書き込まれます。

receiver="beast-tcp"
fr24key="********" # 発行された sharing key。パスワード相当なので公開しない
host="127.0.0.1:30005"
bind-interface="0.0.0.0"
bs="no"
raw="no"
mlat="yes"
mlat-without-gps="yes"

状態は fr24feed-status で確認できます。

Terminal window
fr24feed-status
FR24 Feeder/Decoder Process: running.
FR24 Link: connected [TCP].
FR24 Radar: T-RJTT2257.
FR24 Tracked AC: 7.
Receiver: connected (1253673 MSGS/0 SYNC).

http://受信機のIPアドレス:8754/ にも状態表示の Web 画面があります。データが届き始めると、Flightradar24 のアカウントが自動で Contributor プランに切り替わります。

Flightradar24 の Contributor 表示

なお、統計ページのスクリーンショットを公開するときは、sharing key と LAN の IP アドレスを隠してください。sharing key があれば誰でもあなたの局としてフィードできてしまいます。

6. piaware#

FlightAware のフィーダー piaware は、FlightAware の apt リポジトリを登録するパッケージを入れてからインストールします。リポジトリは trixie にも対応しています。

Terminal window
wget https://www.flightaware.com/adsb/piaware/files/packages/pool/piaware/f/flightaware-apt-repository/flightaware-apt-repository_1.3_all.deb
sudo dpkg -i flightaware-apt-repository_1.3_all.deb
sudo apt update
sudo apt install -y piaware

受信ソースを readsb の Beast TCP に向け、MLAT を有効にします。

Terminal window
sudo piaware-config receiver-type other
sudo piaware-config receiver-host 127.0.0.1
sudo piaware-config receiver-port 30005
sudo piaware-config allow-mlat yes
sudo piaware-config mlat-results yes
sudo systemctl restart piaware

起動後に piaware-status で接続状態を確認し、表示された feeder ID を FlightAware のサイトで自分のアカウントに紐付け(claim)します。

Terminal window
piaware-status
PiAware master process (piaware) is running with pid 1181.
PiAware ADS-B client (faup1090) is running with pid 1369.
PiAware mlat client (fa-mlat-client) is running with pid 20653.
readsb (pid 1019) is listening for ES connections on port 30005.
faup1090 is connected to the ADS-B receiver.
piaware is connected to FlightAware.

readsb がハブになっているので、既存の Flightradar24 のフィードに影響を与えずに追加できました。FlightAware 側は MLAT(複数受信機による位置推定)にも参加していて、4 月の時点で周辺の 171 局と同期していました。

FlightAware の受信機統計ページ

1 ヶ月時点の運用ステータス#

2026 年 3 月 31 日にフィードを開始して、2 週間半ほど経った 4 月 17 日時点の Flightradar24 の統計ページです。1 日あたりの受信機数は 400〜450 機、最大距離は 43nm でした。

Flightradar24 の統計ページ(2026 年 4 月)

graphs1090 で見た 14 日間のグラフはこんな感じです。最大距離のピークが 41.7nm、距離の中央値が 10.7nm。谷底のマンションらしく、近くの機体しか拾えていません。

graphs1090 のパフォーマンスグラフ(2026 年 4 月)

1 ヶ月後:バンドパスフィルタ内蔵ドングルに交換#

都心はノイズが多いです。FM 放送や携帯電話の基地局など、1090MHz 以外の強い電波がドングルのフロントエンドに流れ込んで、肝心の ADS-B の信号が埋もれます。そこで運用 1 ヶ月後に、1090MHz のバンドパスフィルタを内蔵した ADS-B 専用のドングルに交換しました。

効果は一目瞭然でした。graphs1090 の 180 日グラフで、4 月下旬の交換を境に受信距離が一段跳ね上がっています。

ADS-B Range の 180 日グラフ。4 月下旬を境に最大距離が 30〜40nm から 60〜70nm へ

同時に受信できる機数も、メッセージレートも増えました。

ADS-B Aircraft Seen の 180 日グラフ

ADS-B メッセージレートの 180 日グラフ

信号レベルは全体が約 9dB 持ち上がっています。このドングルは RF アンプも内蔵しているので、ノイズフロアごと持ち上がっています。それでも受信距離と機数が伸びたのは、アンプの手前でフィルタが帯域外の信号を落としているからです。

ADS-B Signal Level の 180 日グラフ

交換前後の数値をまとめるとこうなります。交換前は 2026 年 4 月 4 日〜17 日の 14 日間、交換後は 2026 年 8 月 5 日〜9 月 4 日の 30 日間の graphs1090 の集計値です。

指標交換前(RTL-SDR Blog V4)交換後(フィルタ内蔵ドングル)
最大受信距離(期間中のピーク)41.7nm71.4nm(180 日間の最大は 80.8nm)
平均最大距離7.3nm28.8nm
受信距離の中央値10.7nm19.5nm
メッセージレートのピーク41/秒107/秒
同時受信機数(平均 / 最大)2 機 / 9 機6 機 / 23 機
信号レベルの中央値-30.3dBFS-21.3dBFS
ノイズフロア約 -35dBFS約 -30dBFS

Flightradar24 側の統計でも、1 日あたりの受信機数が 400〜450 機から 700〜770 機に、最大距離が 43nm から 68nm になりました。都心で ADS-B を受信するなら、フィルタ付きドングルは最初から買うべきです。

Pi Zero W での 5 ヶ月運用#

受信機は最終的に初代 Raspberry Pi Zero W に落ち着きました。単コア 1GHz、メモリ 512MB という 2017 年のボードです。現在の状態はこんな感じです。

項目
連続稼働9 日以上(執筆時点)
load average2 前後(単コアなので常時飽和気味)
メモリ使用量約 180MB(512MB 中)
CPU 温度約 44°C
Flightradar24 の uptime100%

load average が 2 を超えているのは正直よろしくないですが、readsb のデコード、2 つのフィーダー、MLAT クライアントが同居していても、フィードが途切れたことはありません。graphs1090 の描画を 1 日 1 回に絞ったのが効いています。

とはいえ余裕はないので、これから組む人には Zero 2 W をおすすめします。

まとめ#

ADS-B の受信は、Raspberry Pi Zero W とドングル 1 本で成立します。都心の谷底という最悪の立地でも、フィルタ付きドングルに替えれば 70nm 先まで届きました。

現在は Flightradar24 で T-RJTT2257、FlightAware で site 272777 という局 ID で、世界中の航空ファンにデータを提供しています。

次は JE1WFV(アマチュア無線)としての知見を活かし、アンテナ周りで S/N 比を追い込んで、受信距離の限界に挑戦したいところです。

余談:Pi 4 + Debian 13 で踏んだ 3 つの壁#

最初に組んだ Raspberry Pi 4 Model B(4GB)+ Debian 13 (trixie) aarch64 の環境では、fr24feed の導入で 3 つの壁に当たりました。Raspberry Pi OS ではここまで苦労しませんでしたが、記録として残しておきます。

1. Cloudflare の 403 Forbidden。 get.flightradar24.com からのスクリプト取得が WAF に弾かれました。wgetcurl のデフォルト User-Agent が Bot と判定されるためで、ブラウザの User-Agent を偽装すると通ります。

Terminal window
curl -L -A "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36" [URL]

2. Debian 13 の厳格な署名ポリシー。 apt が SHA1 署名のリポジトリを拒絶します。fr24feed の公式リポジトリは古い署名形式のままなので、[trusted=yes] で署名検証をスキップしました。これは Raspberry Pi OS 13 でも同じです。

3. libssl1.1 の依存関係崩壊。 aarch64 版の fr24feed バイナリは古い libssl1.1 を要求しますが、trixie には libssl3 しかありません。Ubuntu 20.04 のアーカイブから aarch64 用の deb を取ってきて dpkg -i で流し込みました。Raspberry Pi OS(armhf)版の fr24feed は静的リンクされているので、この問題は起きません。

余談:肝心の息子は#

苦労の甲斐あって、ついに広告なしの快適な環境が整ったのですが……肝心の息子の興味は、今や完全に車とトミカへ移行しました。せっかく構築したシステムですが、もはや Flightradar24 を開く機会すらありません。現場からは以上です。

この記事が役に立ったら
GitHub Sponsorsで応援できます

コメント