■その昔、FMラジオコントローラというものを一回作っています。小型のFMラジオを解体してスイッチ部を露出させ、その接点を電気的に制御することでON/OFFをコントロールするという強引なコンセプトで、狙い通り動かすことはできたのですが、チューニングができないとか、ボリューム制御ができないとかいろいろ不都合があり、それきりになっていました。今回作ろうとしているのはそれではなくて、FMチューナICを制御するものです。そういう意味では、まあ、まとも。
例によってストロベリーリナックスさんでSparkfunのFMレシーバモジュールが扱われていて、これが1チップでFMラジオになっているということらしい。FMラジオチューナーチップというのは他にも幾つかあるのですが、付属回路が必要で何かと面倒だったのですが、これは1モジュールで完結している。ただし、制御用のMCUが外付けで必要、というもの。
参考先のSparkfunの資料も良く読まず2つ発注。なんとなく半田付けに失敗しそうな気がしたので2つ。
届いて気付いたのですが、ランドピッチが2ミリ。ユニバーサル基盤にそのまま載せられないので、思案した結果、ワイヤードにしました。
これを小さなユニバーサル基盤に載せて、まずはいつものブレッドボードでバラック。Sparkfunにあるデータシートによれば、BUSMODのピンをプルダウンするとI2C、プルアップでSPIになるとある。SPIは慣れているので、素直にプルアップ。しかし、あれ、Read/Writeの切り替えはどれだ。BUSENがそれか? しかし、SPIで何やっても読めていない気がするのはなぜだ、とばたばたやっていたら、Sparkfunで公開されているデータシートのチップ(NXPのTEA5767)は初期出荷版のもので、今出荷されているAIOROHのAR1000というチップ向けではないとのこと。なによそれ。
仕方なくサンプルプログラムから引っ張る。一番参考になったのはゆきの研究室さんで公開されているプログラムでしょうか。ただし、I2C版。Sparkfunでも公開されているサンプルもI2C版。もしかして、SPIでは動かせないんじゃないのか。
これまた仕方なくI2Cの通信ライブラリを作る。I2Cはリード・ライトの線がマスタ・スレーブで共用されるので面倒くさい。ACKやらNACKやら、クロックストレッチやらややこしい。
まずはチップ内部のレジスタを読もうとして、一応それらしいデータは出てくるんだけど、本当に読めているのかわからない。ままよと、サンプルプログラムで設定しているレジスタをそのまま(80.7MHzバージョンで、今いる名古屋だとたまたまFM愛知にあたる)つっこんでから読み出すと値がぐちゃぐちゃ。
ただ、レジスタの指定は合っているようなので、書き込みはOKで読み出しがNGらしいということが解った。しかし、本当の本当に書き込めているのか解らんので、あれこれ読み出しをやっていると、どうやらデータ送信後の、スレーブからのACKを待つとその後のリードアウトがずれるということが発覚。ACK待ちのロジックがまずいのだろうけど、面倒なのでACKは待たずに強制的に1クロックかまして終わるようにしたら大丈夫でした。
あとは出力をデカップリングコンデンサ経由でイヤホンにつなげると、あっさり聴こえました。FMの音が、おお、おお。
デカップリングコンデンサはある程度の容量が無いと低音が出ません(自分は知らなかったけど、常識という気がする)。データシートでは10uFの電解コンデンサを使っています。手持ちでちょうどよさげなものが無かったので、自分はたまたまあったOS-CONの47uFを使うことにしました。同じ容量で85℃品の電解コンデンサもあったのですが、音質が変わるようでもなかったので、サイズの小さなOS-CONを使うことに。
このFMラジオ、とりあえずAVR HTTPサーバにつなげてしまおうかと思っています。オペラブルなデバイスとしては手ごろだし、それなりに面白みがあるし、というわけで。