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 つのサービスの上位プランを同時に得られるのが美味しいところです。
| サービス | フィーダーに提供されるプラン | 通常価格(執筆時点) |
|---|---|---|
| Flightradar24 | Contributor(Business 相当) | $49.99/月(年払いで $499.99) |
| FlightAware | Enterprise | $89.95/月 |
設置環境
設置場所は都心(港区)のマンションで、地上高はおよそ 20m です。周りはビルだらけで、地形的には谷の底。ADS-B の受信条件としては、正直かなり悪いです。アンテナは屋外に出しています。
広域を拾うのは最初から諦めて、近隣の旧防衛省ヘリポート周辺をカバーするという局所的なミッションで運用しています。それでも後述のフィルタ付きドングルに替えてからは、70nm(約 130km)先まで届くようになりました。

買ったもの
| 品目 | 役割 | 備考 |
|---|---|---|
| RTL-SDR Blog V4 | 最初のドングル | 汎用の SDR ドングル。最初の 1 ヶ月はこれで受信 |
| 1090MHz ADS-B アンテナ(マグネット基台) | アンテナ | 屋外に設置 |
| Raspberry Pi 3 Model B | 2 台目の受信機 | 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) | OS | 13 (trixie)、kernel 6.18 |
| readsb | ADS-B デコーダー兼ハブ | 3.16.11 |
| tar1090 | ローカルのリアルタイム地図 | 3.16.11 |
| graphs1090(自分のフォーク) | パフォーマンスグラフ | 1.6.0 |
| fr24feed | Flightradar24 フィーダー | 1.0.57-1 |
| piaware | FlightAware フィーダー | 11.1 |
構築手順
1. OS
Raspberry Pi Imager で Raspberry Pi OS Lite(32-bit)を書き込みます。初代 Zero W は ARMv6 なので 64-bit 版は動きません。Imager の設定画面でホスト名・SSH・Wi-Fi を入れておくと、ディスプレイもキーボードも繋がずに済みます。
起動したら SSH で入ってパッケージを最新にします。
sudo apt update && sudo apt full-upgrade -ysudo reboot2. readsb
デコーダーには wiedehopf 氏の readsb を使います。インストールスクリプトが readsb 本体に加えて tar1090 と、緯度経度やゲインを設定する補助コマンドまで入れてくれます。
sudo bash -c "$(wget -O - https://github.com/wiedehopf/adsb-scripts/raw/master/readsb-install.sh)"受信機の緯度経度を設定します。これがないと tar1090 の距離表示や受信範囲の計算ができません。
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(含めない)にしてください
設定を変えたら再起動します。
sudo systemctl restart readsb3. tar1090
tar1090 は readsb の出力をブラウザで地図表示するツールです。readsb のインストールスクリプトが一緒に入れてくれますが、単体でのインストールや更新は以下のコマンドです。
sudo bash -c "$(wget -nv -O - https://github.com/wiedehopf/tar1090/raw/master/install.sh)"http://受信機のIPアドレス/tar1090/ で開けます。

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

使ってみてわかったのは、Flightradar24 の地図は tar1090 より 10 秒ほど遅れて表示されるということです。tar1090 は 1 秒ごとに更新されるので、頭上を通過する機体を見上げながら確認するなら、自宅の tar1090 のほうが圧倒的に向いています。
4. graphs1090
graphs1090 は readsb の統計情報(メッセージレート、受信距離、信号レベルなど)を rrdtool で長期間グラフ化するツールです。本家の wiedehopf 版は作りが古い(jQuery + Bootstrap 時代のまま)ので、フォークしてかなり改造した自分の版を使っています。
sudo bash -c "$(curl -L -o - https://github.com/matsubo/graphs1090/raw/master/install.sh)"http://受信機のIPアドレス/graphs1090/ で開けます。
フォークでの主な変更点は以下のとおりです。
- jQuery と Bootstrap を撤去して素の JavaScript と CSS に書き直しました。約 390KB のライブラリが消え、ライト / ダークテーマの切り替えを付けました
- CPU・メモリ・ディスク・温度などの OS グラフを削除しました。見たいのは ADS-B のグラフだけです
- CDN 依存をゼロにしました。散布図も ECharts をやめて canvas で描いているので、受信機がインターネットに出られなくても表示できます
- 単コア向けのオプション
DRAW_ALLとBOOT_DRAW_DELAYを追加し、SD カードへの書き込みも減らしました - shellcheck での修正、XSS や
rm -rfの事故防止などのセキュリティ修正、リポジトリ構成の整理

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] を付けて署名検証を明示的にスキップします。
echo "deb [trusted=yes] https://repo-feed.flightradar24.com flightradar24 raspberrypi-stable" | sudo tee /etc/apt/sources.list.d/fr24feed.listsudo apt updatesudo apt install -y fr24feedインストールしたらサインアップのウィザードを実行します。
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 で確認できます。
fr24feed-statusFR24 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 プランに切り替わります。

なお、統計ページのスクリーンショットを公開するときは、sharing key と LAN の IP アドレスを隠してください。sharing key があれば誰でもあなたの局としてフィードできてしまいます。
6. piaware
FlightAware のフィーダー piaware は、FlightAware の apt リポジトリを登録するパッケージを入れてからインストールします。リポジトリは trixie にも対応しています。
wget https://www.flightaware.com/adsb/piaware/files/packages/pool/piaware/f/flightaware-apt-repository/flightaware-apt-repository_1.3_all.debsudo dpkg -i flightaware-apt-repository_1.3_all.debsudo apt updatesudo apt install -y piaware受信ソースを readsb の Beast TCP に向け、MLAT を有効にします。
sudo piaware-config receiver-type othersudo piaware-config receiver-host 127.0.0.1sudo piaware-config receiver-port 30005sudo piaware-config allow-mlat yessudo piaware-config mlat-results yessudo systemctl restart piaware起動後に piaware-status で接続状態を確認し、表示された feeder ID を FlightAware のサイトで自分のアカウントに紐付け(claim)します。
piaware-statusPiAware 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 局と同期していました。

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

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

1 ヶ月後:バンドパスフィルタ内蔵ドングルに交換
都心はノイズが多いです。FM 放送や携帯電話の基地局など、1090MHz 以外の強い電波がドングルのフロントエンドに流れ込んで、肝心の ADS-B の信号が埋もれます。そこで運用 1 ヶ月後に、1090MHz のバンドパスフィルタを内蔵した ADS-B 専用のドングルに交換しました。
効果は一目瞭然でした。graphs1090 の 180 日グラフで、4 月下旬の交換を境に受信距離が一段跳ね上がっています。

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


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

交換前後の数値をまとめるとこうなります。交換前は 2026 年 4 月 4 日〜17 日の 14 日間、交換後は 2026 年 8 月 5 日〜9 月 4 日の 30 日間の graphs1090 の集計値です。
| 指標 | 交換前(RTL-SDR Blog V4) | 交換後(フィルタ内蔵ドングル) |
|---|---|---|
| 最大受信距離(期間中のピーク) | 41.7nm | 71.4nm(180 日間の最大は 80.8nm) |
| 平均最大距離 | 7.3nm | 28.8nm |
| 受信距離の中央値 | 10.7nm | 19.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 average | 2 前後(単コアなので常時飽和気味) |
| メモリ使用量 | 約 180MB(512MB 中) |
| CPU 温度 | 約 44°C |
| Flightradar24 の uptime | 100% |
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 に弾かれました。wget や curl のデフォルト User-Agent が Bot と判定されるためで、ブラウザの User-Agent を偽装すると通ります。
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 を開く機会すらありません。現場からは以上です。







