第9回「憧れの機能満載デジタル式FMラジオ」



 さまざまな通信・放送手段が発達した今日、ラジオはもう主要メディアとは言えないかもしれません。それでも、我々はラジオが好きです。数十km、ときには数百km先からの電波を見つけ出すチューニングという行為が好きですし、ローファイな雑音まじりのサウンドが好きです。

 今回はラジオを作ります。ブレッドボーダーズではアナログ式のAMラジオを作りました。プロトタイパーズで作るのは、より実用性の高いデジタル式のFMラジオです。我々が欲しいと思う機能を盛り込みました。

 Arduinoをベースにしているので、FMRaduino(エフエム・ラデュイーノ)というプロジェクト名です。パッと見は少し複雑なハードとソフトですが、ブロックごとに分解すればわりと単純です。

 説明はトップダウンに進めようと思います。まず、全体的な仕様を整理してから、構成要素ごとの解説へ移っていきます。

FMRaduinoの全体写真。ブレッドボード1枚の規模にまとめました。ステレオ出力の先にアンプをつなぐ必要があります。Arduinoは市販のものを使わず、互換回路を組み込みました。その回路の説明は最後に行ないます
【動画】使用中の様子です。周波数の入力、プリセット局の選択、ボリュームの設定はキーパッドで行ないます。現在の周波数と変更中の音量は4桁の7セグLEDに表示されます。周波数は可変抵抗を使ってアナログ的に変えることもできます

 数字キーで周波数を入力できるラジオは高級品です。ソニーなど、いくつかのメーカーが生産していますが、どれもそれなりの値段で、気軽に買える機械とはいえません。「キーを叩いて周波数をセットする」という体験を廉価に実現することがFMRaduinoを作った最大の目的です。

 周波数が数字で表示されるラジオは、珍しくありません。しかし、近年はどれも液晶ディスプレイです。7セグLEDで表示してくれるラジオはないのでしょうか? 我々は迷うことなく、7セグを使いました。

 数値入力での選局がメインテーマとはいえ、ダイアルを回す楽しさも捨てがたいものです。補助的に回転式のチューニング機構も実装しました。可変抵抗器(ツマミ付き半固定抵抗)を回すことで、周波数が変わります。音を聴きながらスキャンしたいときに便利です。

 ちょっと特殊な機能としては、電波の強度をスペクトラムアナライザ風に表示する仕組みを作りました。どの周波数が受信可能か、視覚的に把握できます。ハイエンドの広帯域受信機に「スペクトラムスコープ」といった名称で搭載されている、憧れの機能です。本当はこの表示部分もFMRaduinoに持たせたかったのですが、現状はPC側で行なっています。PC側のプログラムはProcessingで書かれているので、Windows、Mac、Linuxなど多くのOSで動作します。

 Processing用スケッチは次のURLからダウンロードできます。
http://www.musashinodenpa.com/arduino/lib/FMSpectrum.pde

 実装したユーザーインターフェイス系の機能を整理すると次のとおりです。

・キーパッドによる周波数入力
・プリセットした周波数の呼び出し(#キー)
・10段階の音量調節(*キー)
・7セグLEDによる周波数表示
・ダイアル式チューニング
・信号強度の出力(PCでグラフ化してスペクトラム表示)

 FMRaduinoのスケッチ全体は次のURLからダウンロードできます。
http://www.musashinodenpa.com/arduino/lib/FMRaduino.pde

簡易スペクトラム表示。周波数を表す縦線が3本ありますね。70MHz、80MHz、90MHzの3本です。黄色の山は電波の強さを表しています。大きな山が2つだけ見えます。東京都内で実行した結果ですが、あまり受信状態の良い環境ではありませんでした。このプログラムはProcessingで書かれていて、PCとFMraduinoをUSBで接続して使用します

■部品表
品名型番数量参考価格(円)入手先
FMラジオ受信モジュール
11,780スイッチサイエンス
AVRマイコンATmega168P-20PU1480
汎用ロジックIC74AC1641100サンエレクトロ
MOSFET2SK29614200
4桁7セグLEDMR-34611250秋葉原で入手
12キー型テンキーパッドJK-42-21630
LED 5mm
121
半固定抵抗器 10kΩGF063P1KB103194マルツ電波
3.5mmステレオジャック
184
電池ボックス 単3×2本用SW付き
189
カーボン抵抗器 330Ω
8

カーボン抵抗器 1KΩ
1

カーボン抵抗器 10KΩ
1

電解コンデンサ 10μF (10V)
2

積層セラミックコンデンサ 0.1μF
2

積層セラミックコンデンサ 10μF
1

 部品のコストは4,000円ほどです(ブレッドボードを除く)。4桁の7セグLEDは見つけにくいかもしれません。部品屋さん巡りが必要になると思います。インターネット経由で入手したい場合はDigi-Keyが確実でしょう。LTC-4627JFが使えるはずです(ピン配置は異なります)。4桁タイプがない場合は、2桁のものを2つ使ってください。

 FM Receiver Breakout Board(以下FMモジュール)は、Airohaの「AR1000」とその周辺部品を、Sparkfunが使いやすいサイズの基板に実装したものです。AR1000(最新版はAR1010)はFMラジオに必要な機能がワンチップ化されていて、mp3プレーヤー等でよく使われているようです。

 FMモジュールに付け加える必要があるのは、電源、アンテナ、オーディオアンプ、そしてチューニング等を行なうためのユーザーインターフェイスです。

 ユーザーインターフェイスはFMモジュールに直接接続するのではなく、マイコンを経由します。マイコンがユーザーの操作を処理して、FMモジュールに伝えることでラジオとして使えるようになります。

 マイコンとFMモジュールはI2Cと呼ばれるシリアル通信の規格を使って接続します。I2Cはわずか2本の配線しか必要としない、小さなマイコンの貴重なピンを節約できる規格ですが、プログラムはちょっとややこしくなります。

今回使ったパーツのなかでもっとも重要なのが、Sparkfunの「FM Receiver Breakout Board」です。これがあったからこそできた、と言っていいでしょう。国内ではスイッチサイエンスが扱っています。写真は、ピンをハンダ付けしたあとのもので、購入時はランドだけの状態です

 ここからは要素ごとに、ハードウエアとソフトウエアを説明していきましょう。

ベースとなる回路です。キーパッドや7セグLEDは含まれていませんが、可変抵抗(VR1)でチューニングが可能ですし、音声も出力されます。スケッチはダウンロードしたものがそのまま機能します。アンテナは、とりあえず50cmほどのビニール線をつなげておきましょう

 Sparkfunのサイトによると、FMモジュールの電源電圧は3.3Vとなっています。データシートを見ると、電源電圧は2.7V~5.5V、入出力端子は1.5V~3.6Vで動作するとあります。1種類の電圧で使うとしたら、2.7V~3.6Vが適性な範囲と判断し、乾電池2本で動作させることにしました。我々がテストしたところ、電池の電圧が2.4Vくらいまで低下しても正常に起動し、動作しました。2.4Vを下回ると雑音が増え、不安定になるようです。

 受信可能な周波数範囲についてもここで説明しておきましょう。データシートには76~108MHzとあります。つまり、テレビの音声周波数も一部カバーしています。しかし、FMRaduinoは93.9MHzを上限として、それより上の値は受け付けていません。これはスケッチを簡単にするため処理を端折っていることが原因ですが、AR1000が0.1MHzステップでしか周波数を設定できないため、95.75MHzといったように、0.05MHz単位で周波数が設定されている日本のテレビ放送には対応できないためでもあります。チップのレンジいっぱいまで使ってみたい人はプログラムを改造してみましょう。

 さて、回路図を見てください。赤い部分の可変抵抗器VR1によってダイアル式のチューニングが可能です。この接続の仕方はAuduinoでたくさん見ましたね。アナログ的な操作をマイコンで読み取る、一番簡単な方法です。

 VR1はArduinoのアナログ入力ピン0(以下Analog0)に接続されています。Analog4と5にも接続されている線があって、FMモジュールへつながっています。アナログ情報をやりとりしているのでしょうか? いいえ、ArduinoのAnalog4と5はアナログ入力だけでなく、I2Cによる通信にも使われるのです。

 Arduinoでは、Wire.hというライブラリを利用することで、比較的シンプルにI2Cを扱うことができます。FMRaduinoスケッチのなかでI2Cによる通信を処理しているのは、おもにwriteReg()とreadReg()という2つの関数です。その内容を見てみると……比較的シンプルと言いましたが、謎のおまじないをいくつも唱えていて意味不明かもしれません。I2Cを使う場合に限らず、マイコンで専用ICを制御しようとすると、このような呪文をたくさんやりとりすることになりがちです。

 面倒ですが、同じスペックのFMラジオをマイコンと専用ICの力を借りずに作ろうとしたら、ものすごく大変なはずです。コンピュータ化によって、なんとか我々の手に負える複雑さに収まっている、という考え方もできそうです。

電話機レイアウトのキーパッド。マトリクス・キーボードという名称で扱っているショップもあります。ブレッドボードにつなぎやすいよう、フラットケーブルをハンダ付けしました
キーパッドをArduinoに接続する方法の1つです。今回はこのピン割り当てでスケッチを組んでいます。端子のレイアウトが異なる場合はありますが、このタイプのキーパッドの内部構造はどれも同じはずです

 次は電話用のキーパッドをArduinoにつなぐ方法を説明します。

 全部で12個のキーがありますね。それぞれのキーはプッシュスイッチです。12個のスイッチをそのままArduinoにつなごうとすると、12本のピンが必要です。それでは多すぎるので、通常はマトリクスを「スキャン」する方法で、押されたボタンを検知します。

 回路図を見てください。キーは7本ある配線の交差点に置かれています。たとえば、3のキーを押すと、Arduinoの6番ピンと9番ピンの間が繋がります。どの交差点が導通しているかを、1つ1つ調べていくことが、ここでいうスキャンです。

 もう少し具体的に説明しましょう。DIGITAL 6のピンがLOWのとき、3のキーが押されたらDIGITAL 9はLOWになります。DIGITAL 9がLOWかHIGHかを調べることで、キーの状態がわかるわけですね。このとき問題なのは、押されていないキーにつながっているDIGITAL 10、11、12です。押されていないということは接点が離れている、つまりピンがどこにもつながっていないことです。本来、そういうピンの状態をArduinoは認識できないのですが、内部プルアップという機能を有効にしておくことで、つながっていないピンはHIGHとみなされます。

 整理すると、DIGITAL 6がLOWのとき、3のキーが押されると、DIGITAL 9だけがLOWになり、10、11、12はプルアップの効果でHIGHとなります。このとき、DIGITAL 7、8はHIGHにしておくことが大事です。もし6、7、8が全部LOWだとしたら、3が押されたのか、2が押されたのかわかりません。1本だけをLOWにするのがポイントです。

 このように、ピンの状態を変化させつつ、チェックを繰り返していけば全部のキーの状態がわかります。文章よりもコードがいいという人は、キーパッド関係の処理が集約されているinitKeypadとscanKeypadをご覧ください。

7セグLEDまわりの回路図です。第5回で登場した74AC164を使ってドライブしています。この7セグはカソードコモンです。4桁が一体になっているものが手に入らない場合は、2桁のものを並べてください
東芝のMOSFET「2SK2961」。今回初登場の部品です。7セグをダイナミック点灯させるためのカソード側のスイッチとして機能します。1個50円程度で入手できる使いやすい素子です。データシートはこちら(PDF)

 周波数を表示する7セグLEDの回路です。これによく似た回路は、第5回「LEDディスプレイをPCにつないでみよう」で紹介しました。やっていることは同じです。セグメントの数が半分なので、74AC164も1つで済んでいます。第5回ではカソード側にトランジスタアレイを使用しましたが、今回はMOSFETで組んでみました。Arduinoなどのマイコンで大きな電流をコントロールしたいときに便利な素子です。

 MOSFETはMetal-Oxide-Semiconductor Field-Effect Transistorの略です。長いですね。日本の辞書には「モスフェット」とも記載されています。カタカナでこう書くと通じない気がしますが、店頭で「モスフェットどこですか? 」と尋ねたときは通じました。

 トランジスタアレイを余分に買った人は、それを半分使ってもいいでしょう。8素子あるうちの4素子だけ使用するという意味です。

 なお、上の回路図は、7セグLEDに対する接続を簡略に記述しています。使用するLEDのセグメントa~dpを74AC164のa~hに接続してください。

ユーザーインターフェイスが完成しました。キーを打つと、LEDに数字が表示されます。それだけでもワクワクします

 最後に説明する構成要素が「Arduino互換回路」です。頭脳にあたるこの部分こそが最重要とも言えるのですが、情報量が多いので、後回しにしました。

 市販のArduinoを使う代わりに、自分でArduino互換回路を組むメリットは次の3点でしょう。

(1) 数百円の出費でArduinoが手に入る
(2) 作品に組み込むときチップ1個分のスペースで実装できる
(3) 回路の仕組みがよくわかり応用しやすい

 とくに大事なのは、(1)のコスト面でのメリットではないでしょうか。

 Arduinoは入手しやすい価格ですが、作品ごとに数千円を投じるのは、いくつも作りたいものがある人にとっては負担です。プロトタイパーズではこれまでにArduinoを使った作例を3つ紹介していますが、すでにArduinoボードのコストが1万円を超えています。自作のためには投資がいくらか必要とはいえ、このペースで消費するならば、すぐに元が取れそうです。

 もちろん、今回の回路を市販のボードと組み合わせて作ることもできます。自作はまだ必要ない、という人は「Arduino Pro 328 3.3V/8MHz」などの3.3V版のArduinoボードを使用してください。通常の5V電源のArduinoでは、FMモジュールを壊す恐れがあります。

Atmelの8ビットマイコン「AVRシリーズ」の1つ「ATmega168」。これはDIPタイプなので正確な型番は「ATmega168-20PU」です。「-20PU」以外の型番はもっと小さいパッケージを示し、ブレッドボードでは使えません

 Arduinoの核となる部品がATmega168です。少し前まではすべてのArduinoボードがこのチップを使っていました。いまはメモリサイズが倍のATmega328Pが主流です。また、ATmega168Pも使えます。

 ATmega168は共立電子スイッチサイエンスマルツ電波などで入手できます。ATmega328Pは千石電商スイッチサイエンス、ATmega168Pは秋月電子で取り扱っています。

 1つここで注意していただきたいのは、部品屋さんから買ってきたチップは、そのままではArduinoとして機能しない、という点です。まずブートローダと呼ばれるプログラムを書き込む必要があります。そのためには書き込むための手段が必要です。

 ここでは、しかるべきブートローダが書き込まれたATmega168があるという前提で、Arduino互換回路の説明を進めます。そのあとで、Arduinoブートローダの書き込み方の例を紹介します。

Arduino互換機の回路図です。初代LilyPad Arduinoに近い構成です。ATmega168のピン名の表記は、Arduino流になっています。D1はDIGITAL1、A1はANALOG1の意味で、(p)が付いているのはPWM出力対応ピンです。この回路に、FMモジュールやキーパッドなどの回路を付け加えていくと、FMRaduinoになります
スケッチの書き込みやPCとの通信に使うUSBインターフェイスを取り付ける場合は、このような回路になります。SparkfunのFTDI BASIC(3.3V版)の使用を想定していますが、FT232RL搭載のUSBシリアル・インターフェイスならば、どれでも使えます。ただし、電源電圧には注意してください。通常、インターフェイスからは5Vが供給されますが、3.3Vの端子も用意されている場合があります。どちらもそのままではFMraduinoの電源とすることはできません
USBインターフェイス付きの回路を、小さいブレッドボードの上に組むと、こんな感じです。小さな黒いタクトスイッチが1つ写っていますね(列17のあたりです)。これはテストに使ったものをはずし忘れただけですので無視してください。余談ですが、我々はこのArduino互換回路を「Musasuino」(ムサシーノ)のと呼んでいます
SparkfunのFTDI BASIC。5V版と3.3V版があります。使い道が広いのは5V版なのですが、3Vで動作するFMRaduinoと組み合わせる場合は3.3V版のほうが便利です(そのまま書き込みができます)。電圧の選択は常に悩みどころです
FTDI BASICを接続してスケッチを書き込み中。この回路は消費電力が小さいので、USBインターフェイスから電源を取っています。FMRaduinoにUSBインターフェイスを取り付けるのではなく、書き込みは別のブレッドボード上で行なうようにするのも1つの手です。これならばUSB給電で動作させることもできます

 この自作Arduinoは初代LilyPad Arduinoと互換性があります。

 Arduino IDEでボードを選択する際は「LilyPad Arduino w/ATmega168」をチェックします。ATmega328Pを使った場合は「LilyPad Arduino w/ATmega328P」です。

 現行のLilyPadには水晶発振器がついていますが、初代にはありませんでした。ブレッドボードでは扱いにくいため、この回路も外付けの水晶を使っていません。チップに内蔵された発振器で動作しています。これ以上切り詰めることができないくらい、簡素な回路です。これでもちゃんとArduinoとして使えるのが面白いところです。

 ただし、動作の安定は保証できません。内蔵発振式のArduinoボードが無くなったのには何か理由があるのかもしれません(通信が安定しないとか? )。自作互換機固有の問題にハマって時間を無駄にしないようにしてください。市販の安定したボードを併用して、作っているものが双方で動くことを確認しながら進めるのが確実です。

AVRマイコン用純正ツール「AVRISP mkII In-System Programmer」。多くのショップで扱っていて、入手は容易です。ここではブートローダをATmega168へ書き込むために使います

 そしていよいよブートローダの説明です。

 ブートローダとは、マイコンが起動した直後に実行されるプログラムで、Arduinoの場合は、まずPC側からスケッチの書き込み要求が来ているかをチェックし、来ていればスケッチを受け取り、要求がなければ前回書き込まれたスケッチを実行します。それだけが仕事の小さなプログラムですが、とても重要です。

 先ほど、「しかるべきブートローダが書き込まれたATmega168」と言いました。もっと正確に言うと、内蔵8MHzで動作するよう設定され、8MHzのATmega168用に作成されたブートローダが書き込まれたATmega168が必要です。買ってきたばかりのチップはそうなっていません。

 ブートローダ書き込み済みのATmegaチップも販売されていますが、我々の知るかぎりでは、それらはすべて16MHz用で、内蔵8MHz仕様のものは見たことがありません。自分で用意する必要があります。

 そのために必要なのが、書き込み機(ライタ)と書き込みソフトです。ここではもっとも手堅い方法だと我々が考える、純正の「AVRISP mkII」と「AVR Stduio」を使ったやり方を説明します。もっと廉価な互換ライタが各社から販売されていますし、Arduinoボードをライターとして使うテクニックもあります。「arduino ブートローダ」で検索すると、いろいろな方法が見つかると思います。

 それではまず、AtmelのサイトからAVR Studioをダウンロードして、インストールしてください。URLは次のとおりです。
http://www.atmel.com/dyn/Products/tools_card.asp?tool_id=2725

 その際、ユーザー登録を求められます。法人を前提にしたフォームですが、個人でも問題ありません。最後の年間使用数と納期を尋ねる質問では、一番近いと思う値を選択すればいいでしょう。我々は最低の1,000個と最長の1年を選択しました。もちろん、1,000個も使いませんが、それが最小値でした。

Atmelのダウンロードぺージを開くと、たくさんのツールが並んでいます。AVR Studioの最新版を選択してください。2009年7月時点ではAVRStudio417setupが最新でした。この次の画面でユーザー登録をし、ダウンロードページへと進みます

 AVR Studioをインストールしたら、起動する前にAVRISP mkIIを準備します。USBケーブルでWindowsマシンに接続してください。

 接続するとウィザードが開きます。デバイスドライバのインストールに関する質問には「はい、今回のみ接続します」→「ソフトウェアを自動的にインストールする」でOKです(Windows XPでのみチェックしました)。

 AVRISP mkIIは、「生きている」回路に接続して使います。電源が繋がっていないといった理由でマイコンが動作していない状態では書き込みもできません。

 ここでは、先ほどのArduino互換回路に接続することにします。

AVRISP mkIIから出ているケーブルの先には6ピンのコネクタ(メス)がついています。これをATmega168に接続します(緑の矢印を参照)。コネクタから線を6本引き出す必要があります。2×3のピンヘッダにビニール線をハンダ付けしてしまうのが早いでしょう

 AVRISP mkIIの接続がすべて正常なら、ケース表面のLEDが緑色に点灯します。赤色の場合は、書き込み対象の回路(ターゲット)の電源が入っていないか、接続が間違っている可能性があります。

 緑ランプを確認したら、AVR Studioを起動して、ブートローダの書き込みにかかります。あと少しです。

AVR Studio起動直後のダイアログ。Cancelを押して、スキップします
大きなウインドウが開きます。プログラミング環境です。ここも素通りして、書き込みツールを起動する「CON」と書かれたアイコンをクリックします
ライタを1つ選んで接続します。AVRISP mkIIとUSBを選択して、Connectボタンを押してください
書き込みツールのウインドウが開きました。タブがたくさんありますが、使うのはMain、Program、Fusesの3つです。まずMainタブでターゲットのチップを選択します。ATmega168と168Pは異なるターゲットです。完全に一致する型番を指定してください。次にRead Signatureボタンを押して、ターゲットから情報を取得します。自分が選んだ型番と取得した情報が一致すると「Signature matches selected device」と表示されます。これで第一段階完了。もし「Warning」が表示されたときは、ターゲットと設定が一致していません。そのまま進めると、マイコンが使えなくなってしまう可能性があります。必ず一致させてください
次はProgramタブへ移って、ブートローダを書き込みます。ブートローダはArduino IDEに付属しています。IDEがインストールされているフォルダがarduino-0016だとしたら、arduino-0016→hardware→bootloaders→atmegaとたどっていくと、「ATmegaBOOT_168_pro_8MHz.hex」というファイルが見つかります。これが今回書き込むべきブートローダです。このファイルを選択し、Programボタンを押してください。数秒後にOKが表示されたら、書き込み完了です
ブートローダを書き込んだだけでは、正しく動作しません。フューズと呼ばれる設定情報を変更する必要があります。Fusesタブを開き、写真のとおり設定してください。BOOTSZ、BOOTRST、CKDIV8、SUT_CKSELあたりを確認し、良ければProgramボタンを押します。OKが出れば、書き込み作業はすべて終了です。ようやくFMRaduinoの心臓部ができあがりました

 マイコンにプログラムや設定情報を書き込む作業は気を遣います。慣れてくるとサクサクできるのですが、慣れてきたころに間違う性質の作業でもあります。うっかり誤った設定を書き込んでしまうと、Arduinoとして動作しないばかりか、うんともすんとも言わないマイコンになってしまうことがあります。もし、そうなった場合、今回紹介したツールと部品だけでは復旧できません。ネット上には、このあたりのトラブルに対する情報がいろいろありますので、Googleを駆使して対処することになると思います。

 FMRaduinoの今後の課題は入れ物です。使いやすくてかっこよく、持ち運びに適したケースを思案中です。キーパッドをキレイに処理するためにはどうすればいいでしょう。ケース加工用のツールから勉強が必要そうです。

 さて、連載第5回から(途中、デジットさんの取材記をはさんで)、4回に渡って紹介したArduinoプロジェクトはいかがでしたか。

 これまでよりも回路の規模が大きかったので、「大変そうだ」と感じた人もいるかもしれません。すべてを取り込もうとせず、自分がやってみたい部分だけ、つまみ食い的に利用していただければ、理解が容易で、結果もすぐに得られると思います。

 Arduinoを深掘りするのはひとまず終了とし、次回からは、大阪取材の成果をお伝えします。