Raspberry PiをFMトランスミッタとするハックについての解説をトランジスタ技術2014年7月号特集に寄稿しましたが、若干こちらで補足したいと思います。
海外のサイトでは既に何度か紹介されていますが、GPIO端子に短いアンテナ線を接続してコマンドを実行するだけでFMラジオで受信可能なFM電波が放射されるというハックです。
Raspberry PiのMPUとして使用されているBRM2835というSoC(System on Chip)にはさまざまなペリフェラル(周辺機能)が用意されています。通常はGPIOやUART, I2Cデバイスを接続するために使用されています。これらの端子の一部には、クロックを生成する機能がありこれを使用してキャリアの生成と、周波数変調(FM)を行います。仕組みの解説については記事を参照していただければと思います。
まず以下のように、20cmくらいの電線に、メスピンヘッダを一本切り出してハンダ付けしたものを用意しました。これがアンテナになります。
そしてこれをRaspberry Piの拡張コネクタ7番ピン(GPIO4=GP0CLK)に接続します。ハードウェアの準備はこれだけです。
Raspberry Piの拡張端子に、各端子名を記入した紙を差し込んであります。実験に便利です。
Raspberry Piにpifmコマンドをダウンロードしておきます。
$ mkdir pifm
$ cd pifm
$ wget https://www.omattos.com/pifm.tar.gz
$ tar xfz pifm.tar.gz
ダウンロードしたパッケージにはソースコードだけではなく、実行ファイルやサンプル音声ファイルが含まれていますので、すぐに動作させることができます。コマンドの引数で、再生するWAVファイルと、送信周波数をMHz単位で指定します。管理者権限が必要なためsudoが必要です。
$ sudo ./pifm sound.wav 80.0
これだけで、sound.wavに記録されている音声が80.0MHzのFM電波として周辺に放射されてしまいます。周辺の置いたFMラジオを80.0MHzにチューニングすることでスターウォーズのテーマが聞こえてくるはずです。
ファイルを用意さえすればどんな音声でも送信することが可能です。フォーマットは16bitリニアPCM(リトルエンディアン)、サンプリングは22.05kHzであればOKです。
このコマンドには、ステレオの機能もあります。下記のようにコマンドにstereoを指定するだけです。
$ sudo ./pifm sound.wav 80.0 stereo
上の写真ではスマートフォンのラジオ機能を使っています。海外仕様のFMラジオにはRDS(Radio Data System)に対応しており、これを試してみたかったからです。残念ながら動作を確認することはできませんでした。
pifmは標準入力から音声を受け取ることが可能です。一般的なコマンドのように、ファイル名の代わりにハイフン(-)を指定することで標準入力から読み込みを行います。ですので、WAVファイル以外のファイルを使う場合には、コマンドで変換してパイプで接続すればOKです。たとえばmp3などの場合はmpg321等のコマンドで変換します。下記のコマンドのようにします。
$ sudo apt-get install mpg321
$ mpg321 c2.mp3 -s | sudo ./pifm - 80.0 44100 stereo
録音されたファイルを再生するのではなく、マイクから音声を取り込んでFMを送信することも可能です。いわゆるワイアレスマイクのように使えます。USBタイプのサウンドアダプターをラズベリーパイに接続することで、arecordコマンドで音声を取り込んでデータ化することが可能です。フォーマットが適切になるようオプションを指定します。
下記のコマンドを入力します。
$ arecord -D plughw:1,0 -f S16\_LE -r 22050 | sudo ./pifm - 80.0
マイクのようにその場で再生させた場合、若干の処理遅延が生じることがわかると思います。
他にもインターネットストリーミングラジオを再生することも可能です。BBCのストリーミングで試みましたが、mplayerコマンドを使用して下記のコマンドで再生させることができました。
$ sudo apt-get install mplayer
$ mplayer -ao pcm:waveheader:fast:file=/dev/stdout -playlist "https://bbc.co.uk/radio/listen/live/r4.asx" -really-quiet | sudo ./pifm - 80.0 44100 stereo
以上のようにいろいろな音源から送信することが可能です。データにさえなってしまえば自在に操作することができますので、いろいろ応用できると思います。
留意点として、電波の質や電波に関する法規制などいろいろと問題点があると思います。まわりに迷惑をかけたり、法を逸脱することのないよう配慮が必要です。念のため。
今回の寄稿とは別に、Raspberry PiとRTLドングルを使ったSDRについてトラ技2013年11月号に別途小稿を掲載していただいた中で、rtl_fmコマンドを使ったFM放送受信について紹介しました。今回のと合わせてRaspberry PiでのFMの送信と受信のどちらも紹介することができましたので、組み合わせればトランシーバ遊びが可能になるわけです。私はFM放送やRaspberry Piについてそれほどコミットしているわけではないのですが、少々変わった応用として紹介しました。是非遊んでみてください。
追記(2015/8)
Raspberry Pi 2の場合はこちら
リファレンス
- Redditのスレッド https://www.reddit.com/r/raspberry_pi/related/14k5o3/raspberry_pi_fm_transmitter_with_no_additional/
- Turning the Raspberry Pi Into an FM Transmitter (英国インペリアル大学ロボット同好会 https://www.icrobotics.co.uk/wiki/index.php/Turning_the_Raspberry_Pi_Into_an_FM_Transmitter
- BCM2835 ARM Peripheralsデータシート (Broadcom Corporation)
https://www.raspberrypi.org/wp-content/uploads/2012/02/BCM2835-ARM-Peripherals.pdf - makeの記事 https://makezine.com/projects/make-38-cameras-and-av/raspberry-pirate-radio/
- Instructablesの記事 https://www.instructables.com/id/Raspberry-Pi-Radio-Transmitter/?lang=ja