こちらの記事について、内容・翻訳・視点・長さなど、皆様のご意見をお送りください。今後の記事製作の参考にしたいと思います。
Thank you! Your feedback has been received.
There was a problem submitting your feedback, please try again later.
こちらの記事の感想をお聞かせください。
安価なSDR受信器とPoE対応のラズパイ 3B+で無線機を構築
無線通信において、潜在的な電波障害を避けつつベストなパフォーマンスで効率よく受信するには、周囲の開けた場所、例えば庭、屋根、屋根裏部屋、屋上など、電源のとれないような不便な場所にアンテナを設置するのが理想的だ。特に、HF(High Frequency; 短波)、LF(Low Frequency; 長波)、VLF(Very Frequency; 超長波)の信号を受信するためにはとても大事なことである。特大アンテナで遠くの電波も受信したいのならなおさら最初の設置場所は充分に条件の良いところがよいだろう。
一般的な解決策としては、理想的な場所にアンテナを設置し、そこから長い同軸ケーブルを引っ張って無線機につなぐことが挙げられる。しかしこの方法は、同軸ケーブルの長さによってはロスや非常に大きなノイズの発生原因となってしまうことがある。そこでもう少し改良した改善策は、アンテナの近くに無線機を設置し、遠隔で操作する方法だ。以前であればこういった方法は、実現性が薄かった。電源がなかったり遠隔制御システムの構築が非常に手間だったからだ。
しかし、近年は無線機能のソフトウェア化(SDR: Software-defined radio ソフトウェア無線)が進んできこと、端末の遠隔操作が非常に簡単に実現できること、不便な場所でもPoE(Power-over-Ethernet)で電源供給できることなどから、現実的なソリューションになりつつある。そこで今回はPoEに対応したラズパイ3B+からSDR端末をリモート制御する方法を試してみた。
PoEはEthernetケーブルを通じて長距離の電源供給と通信が可能な技術である。通常、屋外に機器を設置する場合、電気工事士の資格が必要であるが、PoEであれば屋外に設置した端末に室内から電力を供給しつつ遠隔操作が可能だ。こうすることで安全な場所から無線機を制御できるプラットフォームができた。
無線受信器 SDRPlay RSP2
無線スペクトルプロセッサ(Radio Spectrum Processor; RSP) SDRPlay シリーズ は安価なSDR受信機だ。USBインタフェースを備えており、1kHz ~ 2GHzの周波数に対応している。現在3つのバージョンが利用できる。
- RSP1A (150-395): 元のRSP1を改善したバージョン
- RSP2 (124-9619): 2つのRF(受信)入力(x1 追加同軸, x1 Hi-Z接続)、基準クロック I/Oの強化, 雑音指数の改善 など
- RSP2pro (125-7958): RSP2のメタルケースバージョン
RSP1Aは最も安価なバージョンだが、RSP2では雑音指数が改善されており(結果的に感度があがっていると考えることができる)、新たに追加された同軸入力が利用できる(さらにアンテナが複数あれば異なる帯域も利用できるため便利だ)。さらに、3つめの高インピーダンスアンテナを直接利用することもできるのだ。また、基準クロックI/O機能も強化されており、例えばGPS(もしくは地域)によって基準クロックを固定したい場合や、複数のユニットを同期させたい場合などに便利だ。
RSPはUSBから電源を供給することが可能であり、追加の電源ソースが全く必要としない優れものだ。扱いやすいコンパクトさを備えており、Raspberry Pi 3 Model B+に搭載するのに非常に適していると言えるだろう。もちろん、様々な環境に設置することが考えられるため、その本体をカバーする筐体はしっかりしたものでなければならないため、IP(ingress protection; 浸入防護)レートを持っているものが適しているだろう。
ドライバーソフトウェア
RSPハードウェアドライバ/APIのインストールは、こちらからダウンロードし、以下のコマンドを入力するだけで簡単に行うことができる。
pi@3bplus:~ $ chmod +x SDRplay_RSP_API-RPi-2.11.1.run
pi@3bplus:~ $ ./SDRplay_RSP_API-RPi-2.11.1.run
新しいリリースがある場合はファイル名が異なることに注意してほしい
アプリケーション
Raspberry Piのローカル上(端末の中)で動作させることができるアプリケーションとして、私たちはいくつかの手段を選択することができる。SDRplayはdump1090ソフトウェアとしてのアプリケーションをこちらで提供しており、aircraft Mode-Sのトランスポンダ信号を受信することができるものだ。このトランスポンダ信号は飛行機の個体認識や位置、速度などの取得に利用されている。
GNU無線サポート
一般的なSDRレシーバーアプリケーションとして普及しているGqrxなどのたくさんの素晴らしいアプリケーションがGNU Radio SDR ツールキットのトップにビルドされていることをご存じだろうか。もちろん、その他にもたくさんのアプリケーションが利用可能であり(いくつかは研究やエンジニア目的のものも含んでいる)、またGNU Radio Companionと呼ばれるビジュアルエディタも提供されており、信号を処理し、集約したグラフをすぐに表示することができるのだ。
GNU Radioで信号を受信するためには、SDR “source” ブロックが必要だ。もし(法律的な観点も含め)送信できる場合は、”sink” ブロックも必要であることに注意しよう。GrOsmoSDRは様々なSDRハードウェアを提供しており、便利なFFT(高速フーリエ変換)ディスプレイアプリケーションも備えている優れものだ。この記事を執筆している現在では、公開されているフォーク(一時的なバージョン)を利用しなければならず、詳細についてはSDRplayフォーラムで提供されるようだ。
Raspberry Pi上でGNU Radio自体をすべて構築することは、非常に大規模なコードで構成されており、ビルドに長時間かかってしまい、さらに時に問題が発生してしまうためあまりお勧めできない。その代り、パッケージから開発ファイルとGNU Radioをインストールすることを推奨する。そのためのコマンドは以下を参照して欲しい。
pi@3bplus:~ $ sudo apt-get install gnuradio gnuradio-dev
次にgr-osmosdrの構築を行ってみよう。今回利用しているバージョンにおいては、どんな小さなアプリケーションをインストールしたい場合には毎回ビルドを実行しないといけない。例えばGqrxをRaspbianパッケージリポジトリからインストールする場合、gr-osmosdrのリポジトリパッケージが参照されるため、この場合には自身でこのビルドを実行しなければならない。これは明らかにSDRplayのサポート対象外だろう。
SoapySDR サポート
SoapySDRとは、モジュラアーキテクチャ型のニュートラルSDRサポートライブラリプラットフォームを提供しているベンダーの一つだ。SoapySDRPlayモジュールはSDRplayハードウェアに追加サポートを行っている。これらをインストールすると、CubicSDRといったSoapySDR APIをサポートするアプリケーションを利用することができるようになる。
以下はそのインストール手順だ。
pi@3bplus:~ $ sudo apt-get install cmake swig libavahi-client-dev
pi@3bplus:~ $ mkdir src
pi@3bplus:~ $ cd src
pi@3bplus:~ $ git clone https://github.com/pothosware/SoapySDR.git
pi@3bplus:~ $ cd SoapySDR
pi@3bplus:~ $ mkdir build
pi@3bplus:~ $ cd build
pi@3bplus:~ $ cmake ../
pi@3bplus:~ $ make
pi@3bplus:~ $ sudo make install
SoapySDRPlayモジュールのインストールについては以下だ。
pi@3bplus:~ $ cd ../..
pi@3bplus:~ $ git clone https://github.com/pothosware/SoapySDRPlay.git
pi@3bplus:~ $ cd SoapySDRPlay
pi@3bplus:~ $ mkdir build
pi@3bplus:~ $ cd build
pi@3bplus:~ $ cmake ..
pi@3bplus:~ $ make
pi@3bplus:~ $ sudo make install
SDRplayがドライバインストール時に接続されていた場合は、一度抜いたのちに再度接続しよう。
pi@3bplus:~ $ SoapySDRUtil --find
これでインストールが完了したはずだ。SoapySDRを利用して、次のようにハードウェアが正しく認識されていることが確認できるようになった。
では、これでSoapySDRが私たちのハードウェアを認識できるようになったことを確認できたので、次にCubicSDRもしくはそのほかのAPIをサポートしたアプリケーションをビルドしよう。実は、SoapySDRの素晴らしい特徴の一つとしてSDRハードウェアの遠隔操作を実現するリモートストリーミング機能がある。そこで、先にこのリモートストリーミング機能について触れておこう。
リモートストリーミング
SoapySDR リモートサポート機能によって、SDRハードウェアが搭載されたコンピュータを、そのほかのコンピュータ上で動作するアプリケーションから遠隔操作が可能になる。これにより遠隔からチューニングや、設定を変更出来るようになり、アンテナの選択やゲイン(利得)のセットなどを遠隔から制御できるようになるのだ。SDRハードウェアが接続されたコンピュータはサーバとなり、クライアントであるアプリケーションが動作するコンピュータへサンプリングされたそのままのデータが送信され、まるでリアルタイムに受信しているかのようにモニタすることができる。
これはRaspberry Pi上で動作するSDRアプリケーションを実行し、電波を復調した結果をネットワーク経由でそのほかのコンピュータに送信するのとは全く異なるものだ。SoapySDRのリモート操作では、Raspberry PiとSDRplay RSPは比較的“dumb (暗黙的)”なネットワークリソースの共有となるのだ。これは例えばプリンタやスキャナをネットワーク上で複数端末が共有するようなものと考えてもらえれば良いだろう。
オプションのSoapyRemoteのインストールについては以下だ。
pi@3bplus:~ $ cd ../..
pi@3bplus:~ $ git clone https://github.com/pothosware/SoapyRemote.git
pi@3bplus:~ $ cd SoapyRemote
pi@3bplus:~ $ mkdir build
pi@3bplus:~ $ cd build
pi@3bplus:~ $ cmake ..
pi@3bplus:~ $ make
pi@3bplus:~ $ sudo make install
ここまで問題ない場合、以下のコマンドでサーバを手動で実行できるはずだ。
pi@3bplus:~ $ SoapySDRServer --bind
これにより、何も問題なく実行できたかどうか確認できるはずだ。もし問題がある場合などはターミナルに表示されるデバッグメッセージなどを参考にしてほしい。クライアントのマシンが接続されると、同様にターミナルの表示で確認できる。
では次に、SoapySDRとSoapyRemoteをクライアントマシンへとインストールしよう。今回、クライアントマシンとしては、(サーバとは別の)Raspberry Piや、もしくは一般的なノートパソコンが利用できる。このクライアントマシンは直接信号を受信するためのハードウェアと接続しているわけではないので、SoapySDRPlayのソフトウェアは必要ないことを覚えておこう(これは最初に利用したRaspberry Pi、つまりサーバだけに必要だ)。
一度SoapySDRとSoapyRemoteを2つめのクライアントマシンとしてのRaspberry Piにインストールすると、以下のコマンドのようにSoapySDRUtilを使って、まるでクライアントにハードウェアが接続されているかのようにアクセスできることが分かるだろう。
andrew@snow:~$ SoapySDRUtil --find="remote=3bplus.local"
ただし、上記のコマンドのにあるfindオプションのように、サーバのホストネームもしくはIPアドレスを指定する必要があることに注意しよう。わからない場合はサーバのRaspberry Piでifconfigコマンドなどを利用して調べてほしい。
ここまで計画通り進んでいるだろうか?問題がなければ、遠隔にあるハードウェアが検出され、SoapySDRServerプロセスが接続状態にあることを教えてくれるはずだ。
ネットワークを介してストリーミングRFのサンプリングを行うためには豊富なリソースがひつようだ。そのため、より大きなO/Sバッファが必要だ。そのため、以下の2つのコマンドを /etc/sysctl.conf
の最後に追記してほしい。
net.core.rmem_max=104857600
net.core.wmem_max=104857600
追記はクライアントマシンとサーバの両方に行ってほしい。起動時にこの設定が反映されるはずだ。
pi@3bplus:~ $ sudo systemctl enable SoapySDRServer
本体を再起動しなくとも、上記コマンドを入力すると新しいパラメータでサーバプロセスのみを再起動できる。
テスト
動作をテストするため、今回私たちはCubicSDRをインストールすることにした。mDNS開発ライブラリ (libvashi-client-dev)が両方のLinuxマシン(Raspberry Pi)にインストールされていたためだ。これにより、CubicSDRが自動的に遠隔にあるSDRをネットワーク上から見つけることができるのだ。上のスクリーンショットをみて気付いた人もいるかもしれないが、今回私たちはパケットの最大送信単位(MTU; Maximum Transmission Unit)を通常よりも大きな4096に設定している。これはアップグレードされた新しいRaspberry Pi 3 Model B+がサポートしている“ジャンボフレーム”を利用することで可能だ。この設定については以下のコマンドを入力すると反映されるはずだ(もちろんPi 3 Model B+を利用している場合)。
pi@3bplus:~ $ sudo ifconfig eth0 mtu 4096
これについてもクライアントとサーバの両方のマシンで設定可能であれば設定しよう。細かいことだが、上記のコマンドではインタフェースがeth0となっているので、ご自身の環境に合わせたインタフェースを選択してほしい。
最後に、スペクトルディスプレイで信号を覗いてみる。クライアントマシンから(もちろん)“遠隔”にラジオのチューニングを行い、FM変調(この信号もクライアントマシンに転送される)を聞いてみよう。
まとめ
ハードウェアとSoapySDRの組み合わせによって、様々な利用において柔軟性をもたらしてくれることをお分かり頂けただろう。いくつかのアプリケーションとあわせて利用すれば、Raspberry Piと搭載されたRSPによってデジタル信号処理が簡単に可能であることが伝わったはずだ。これにより、ネットワークを介して音楽やビデオ、その他のデータをデジタル信号から復調することができる。例えば、あなたが(飛行機に乗るなどして)aircraft Mode-Sの電波を受信したとしよう。これまでの技術でも、そのデータをMQTTもしくはweb APIを利用してデータベースや、ディスプレイに送信することができた。もちろん、音声と動画についても同じようにストリームが可能である。
しかし、今回紹介した方法でRaspberry PiとRSPの“dumb (暗黙的)”なサーバとして利用し、「生のデータ」をそのままリアルタイムに送信、同時に遠隔操作できることも非常に便利だ。例えば、複数のアプリケーションを頻繁に切り替えて利用する場合や、GNU Radio Companionで新しいアプリケーションの開発を行う場合だ。
あなた自身が開発したい環境に合わせた新しい方法の選択肢の一つにしてほしい。
コメント