Computer & RF Technology

Raspberry PiでRTL-SDRをビルドして使うrevised

以前Raspberry Piでrtl-sdrを使ってリモート受信サーバに仕立てる件について記しましたが、先日追加でもう一台購入してセットアップしてみましたので、最近の状況について書いておきます。今回購入したRaspberry Piは、メモリが512Mbyteと倍増しています。前回は紙箱でしたが、今回はケースに入っていました。

使用するOSは、raspbianというDebian LinuxベースのRaspberry Pi用のディストリビューションです。バイナリイメージが配布されているので簡単にセットアップすることができます。サイトからダウンロードしてSDカードにセットアップします。方法は本家サイトの他、いろいろなところに書かれています。作業にはMac OSXを使いました。

SDカードへのインストールが終了したらRaspberry Piに差してブート、raspi-configによる初期設定が完了したら、OSをアップデートしておきます。

$ sudo apt-get update
$ sudo apt-get upgrade

続いてビルドに必要なツールとライブラリをインストールしておきます。

$ sudo apt-get install autoconf libtool libusb-1.0-0-dev

rtl-sdrのソースをgitで引っ張ってきます。

$ git clone git://git.osmocom.org/rtl-sdr.git

あとは通常のビルド手順を行います。

$ cd rtl-sdr
$ autoreconf -i
$ ./configure
$ make

ビルドが成功したらインストールします。デフォルトではバイナリが/usr/local/binに、共有ライブラリが/usr/local/libにインストールされます。共有ライブラリを認識させるためにldconfigしておきます。またUSBデバイスのパーミッションを適切にするためにudevルールファイルもインストールします。

$ sudo make install
$ sudo make install-udev-rules
$ sudo ldconfig

インストールされるのは以下のコマンドです。以前と比べてrtl_eeprom, rtl_adsbが追加されています。

  • rtl_sdr I/Q信号をファイルに保存
  • rtl_fm 復調して音声信号を出力
  • rtl_tcp リモート受信サーバ
  • rtl_test ドングルの動作テスト
  • rtl_eeprom EEPROMの読み書き
  • rtl_adsb ADS Mode-Bの受信と復調

さっそくドングルを接続して動作確認したいところですが、udevの設定を反映させるために一度リブートしておきます。

$ sudo reboot

再起動後、まずはrtl_testコマンドを実行してみます。うまく動作している場合には以下のような結果となります。

$ rtl_test
Found 1 device(s):
  0:  ezcap USB 2.0 DVB-T/DAB/FM dongle
  
Using device 0: ezcap USB 2.0 DVB-T/DAB/FM dongle
Found Rafael Micro R820T tuner
Supported gain values (29): 0.0 0.9 1.4 2.7 3.7 7.7 8.7 12.5 14.4 15.7 16.6 19.7 20.7 22.9 25.4 28.0 29.7 32.8 33.8 36.4 37.2 38.6 40.2 42.1 43.4 43.9 44.5 48.0 49.6 

Info: This tool will continuously read from the device, and report if
samples get lost. If you observe no further output, everything is fine.

Reading samples in async mode...
lost at least 196 bytes 

まずはRaspberry Pi単体での受信を試してみます。Raspberry Piのオーディオ端子にパワードスピーカを接続し、以下のようにコマンドを入力します。82.5MHzのFM放送を受信する例です。

$ rtl_fm -W -f 82500000 - | aplay -r 32k -f S16_LE -t raw -c 1

うまくいっていれば放送が聞こえてきます。ただし音質はあまり良くないようです。

続いてリモートサーバも試してみます。あらかじめraspberry piのIPアドレスを調べておきます。この例では192.168.3.5です。

$ ifconfig
eth0      Link encap:Ethernet  HWaddr b8:27:eb:33:4d:c1  
          inet addr:192.168.3.5  Bcast:192.168.3.255  Mask:255.255.255.0

rtl_tcpコマンドを起動します。

$ rtl_tcp -a 0.0.0.0
Found 1 device(s).
Found Rafael Micro R820T tuner
Using ezcap USB 2.0 DVB-T/DAB/FM dongle
Tuned to 100000000 Hz.
listening...
Use the device argument 'rtl_tcp=0.0.0.0:1234' in OsmoSDR (gr-osmosdr) source
to receive samples in GRC and control rtl_tcp parameters (frequency, gain, ...).

gqrxでの設定でrtl_tcp={ipaddr}:{port}のようにオプションパラメータを与えます。

gqrxでFM放送を受信してみます。

注意点として、gqrxは受信開始する前からrtl_tcpへの接続を開始するので、gqrxを起動前にrtl_tcpを起動しておく必要があります。さもないとgqrxが固まってしまいます。 以前は、rtl_tcpが落ちる不具合があり、ソースを修正して対応しましたが、現在のソースではそのままで正常に動作します。

前回書いたrtl_tcpの自動起動についても試してみます。update-rc.dを使う方法はobsoleteとのことなので、insservを試してみます。

スクリプトをダウンロードします。

$ curl -O https://raw.github.com/edy555/rtl-sdr/rtltcpFixSegv/rtl_tcp.rc

/etc/init.dにrtl_tcpというファイル名でコピーしてinsservします。

$ sudo install -m 755 rtl_tcp.rc /etc/init.d/rtl_tcp
$ sudo insserv rtl_tcp

うまくいったら、まずはコマンドラインから起動してみます。

$ sudo service rtl_tcp start
Starting RTL-SDR remote server: rtl_tcp.

うまくrtl_tcpが起動しているようなら、OSを再起動後にもrtl_tcpがきちんと起動しているか確認します。

$ service rtl_tcp status
rtl_tcp is running.

サービスを止めるには以下を入力。

$ sudo service rtl_tcp stop

自動起動を止めるには下記のようにします。

$ sudo insserv -r rtl_tcp

以上、いくつかRaspberry Piでrtl-sdrを使用する例を示しました。以前と比べて安定性も良くなっているようです。他のコマンドについては別途試してみたいと思います。

実は今回raspbianのセットアップではまってしまいました。raspbianは2GのSDカード用のイメージとして配布されているのですが、使用した2GのmicroSDHCカードがわずかに容量が足りないようで、ファイルシステムのサイズが不正というエラーでrootfsをマウントできずブートすることができませんでした。十分な容量があれば問題にはなりませんので、4G以上のカードを使用することをお勧めします。

リファレンス

Load more