Computer & RF Technology

Raspberry Pi 2でFMトランスミッタを試してみる

Raspberry PiをFMトランスミッタにするハックを以前紹介しました。GPIOポートに短いリード線を接続するだけで、FMラジオに音声を飛ばすことができていました。ところが、新しいRaspberry Pi 2でうまくいかないとのコメントを頂いたので、試してみたところたしかに指摘の通り動作しませんでした。Raspberry Pi 2で動作させる方法を探してみたところ、既に方法が公開されていました。以前紹介した手順とは少し差がありますので、あらためて方法を紹介したいと思います。

Raspberry PiとRaspberry Pi 2の大きな違いは、採用されているプロセッサです。一般的なアプリケーションプログラムを使う限りは、ほぼ互換で動作するのですが、直接IOを操作するタイプのプログラムは、互換性が保てないようです。

Raspberry PiによるFMトランスミッタpifmは、まさに周辺IOを直接操作するタイプのプログラムですので、互換性がありません。物理アドレス空間に割り当てられているペリフェラルのベースアドレスが異なっていることが大きな違い(Raspberry Piは0x20000000 だが、Raspbery Pi 2は0x3f000000)になっているのだそうです。

試しにpifm.cのベースアドレス部分を書き換えてRaspberry Pi 2で試してみたのですが、動作しませんでした。書き換えが不十分なのか、他にも非互換の部分があったのかもしれません。

Webで情報を探してみたところ、Redditにスレッドがあり、Raspberry Pi2用のFMトランスミッタのコードが既にgithubで公開されていました。簡単に試す手順を説明します。

Raspberry PiのコンソールまたはSSHからログインしておきます。まずソースコードをgithubからコピーしてきます。

$ git clone [https://github.com/markondej/fm_transmitter.git](https://github.com/markondej/fm_transmitter.git)

手元にコピーできたらディレクトリに入ってビルドします。せっかくコアが4つあるので並列コンパイルのためmakeに-jオプションを指定しておきます。

$ cd fm_transmitter
$ make -j 4

ビルドはこれだけで完了です。

アンテナを接続しておきます。pifm.cの場合と同じくGPIO4に短いリード線を接続します。1ピン分のピンソケットにリード線をハンダ付けしておいて、Raspberry Piのピンヘッダの7番ピンに差し込みます。

準備ができたらさっそく動作させてみます。テスト用のWAVファイルが入っているのでこれで試します。直接ペリフェラルを操作するので、sudoを付けて実行する必要があります。

$ sudo ./fm_transmitter star_wars.wav 80.0

近くにあるFMラジオを80.0MHzにチューニングするとスターウォーズのテーマが流れてくるはずです。

ファイル以外で試してみます。ファイル名として-(ハイフン)を指定すると、標準入力から読み込むようになっています(これは一般的なUNIX的仕様です)。USBサウンドアダプタを接続し、そのマイク入力をFMトランスミッタで飛ばす例です。

$ arecord -D hw:1,0 -c1 -d 0 -r 44100 -f S16_LE | sudo ./fm_transmitter - 80.0

現状のコードでは、WAVファイルから読み込んだ場合は、サンプリングレートを自動的に認識しますが、標準入力の場合は44.1kHz固定1チャネルになるようです。このあたりの仕様がまだまだ開発途上という感じです。実際標準入力からの読み込みはつい先月追加されたもののようです。

githubにはいくつかフォーク(分岐)したプロジェクトがあるようで、ステレオなどを実験したコードも公開されているようです。色々試してみると面白いと思います。

ちなみに写真のRaspberry Pi2は、拡張ポートに小型TFT液晶を接続して、あとはUSBキーボードだけのスタンドアロンで使っています。液晶はSPI接続のILI9341という安価な320x240ピクセルの狭い画面ですが、案外実用的に使えます。ちょっとした実験には便利です。

リファレンス

comments powered by Disqus