arduinoでFMラジオ(1)

switch scienceでFMラジオチューナが発売された http://www.switch-science.com/products/detail.php?product_id=551 ので使ってみる。持ち運びを考えると、Arduino miniとかnano, FIOあたりがよさそう。
sparkfunのサイト http://www.sparkfun.com/products/10344Arduino用のスケッチが公開されているが、欧米向け(欧米か!)でそのままでは使えなかった。データシートと格闘してやっと動くようになった。

[必要なもの]
・Arduino
・FMラジオチューナーボード (SFE-BOB-10344)
Si4703というICが載っています。aitendo(\500)でも買えますが、小さいQFNで手半田は難しい。
ピンはVCC,GND,SDIO,SCLK,SEN,RST,GPIO1,GPIO2の8本あり、
そのうち5本繋ぐだけです。
Owly Images

Arduino Si4703
3.3V VCC
GND GND
A4 SDIO
A5 SCLK
D2 RST
A0 可変抵抗(オプション)

周波数の仕組みが国によって違います。
0x05レジスタの7:6bit BAND[1:0]がバンド設定で

BAND[1:0] Band select
00 87.5-108MHz(USA,Europe)
01 76-108MHz(Japan wide band)
10 76-90MHz(Japan)

で設定します。

5:4bitのSPACE[1:0]というレジスタはチャンネルの間隔で

SPACE[1:0] channel spacing
00 200kHz(USA,Australia)
01 100kHz(Europe,Japan)
10 50kHz

となっています。
周波数とチャンネルの対応は
Freq(MHz)=Spacing(MHz)xChannel+76MHz
チャンネルを0x03のCHAN[9:0]に書き込むことで選局するようです。
FM東京の場合は80.0MHzなので
80.0=0.1×40+76
となり、Channelを40とすればよい。

スケッチ Si4703_Example.pdeにおいて、
si4703_init()におけるバンドとチャンネル間隔の設定と、
void gotoChannel(int newChannel)
int readChannel(void)
の周波数の部分を日本向けに変更すると動くようになった。

FM放送の周波数はhttp://homepage3.nifty.com/ysss/radio/FM_frequency.htmlとかで調べて、聴きたい放送局の周波数をいくつか登録しておけばよい。

void gotoChannel(int newChannel)
{
  //Freq(MHz) = 0.100(in JAPAN) * Channel + 76.0MHz
  // 80.0 = 0.1 * Chan + 76.0
  // 4.0 / 0.1 = 40
  newChannel *= 10; // 800*10 = 8000
  newChannel -= 7600; // 8000-7600=400
  newChannel /= 10; // 400/10 = 40

  //These steps come from AN230 page 20 rev 0.5
  si4703_readRegisters();
  si4703_registers[CHANNEL] &= 0xFE00; //Clear out the channel bits
  si4703_registers[CHANNEL] |= newChannel; //Mask in the new channel
  si4703_registers[CHANNEL] |= (1<<TUNE); //Set the TUNE bit to start
  si4703_updateRegisters();

  //delay(60); //Wait 60ms - you can use or skip this delay

  //Poll to see if STC is set
  while(1) {
    si4703_readRegisters();
    if( (si4703_registers[STATUSRSSI] & (1<<STC)) != 0) break; //Tuning complete!
    Serial.println("Tuning");
  }

  si4703_readRegisters();
  si4703_registers[CHANNEL] &= ~(1<<TUNE); //Clear the tune after a tune has completed
  si4703_updateRegisters();

  //Wait for the si4703 to clear the STC as well
  while(1) {
    si4703_readRegisters();
    if( (si4703_registers[STATUSRSSI] & (1<<STC)) == 0) break; //Tuning complete!
    Serial.println("Waiting...");
  }
}

int readChannel(void)
{
  si4703_readRegisters();
  int channel = si4703_registers[READCHAN] & 0x03FF;
  //Freq(MHz) = 0.1(in Japan) * Channel + 76.0MHz
  // X = 0.1 * Chan + 76.0

  channel *= 1; // 40*1 = 40
  channel += 760; // 40+760=800
  return(channel);
}

オリジナルのファイルを日本国内用に改変したものをここに置きます。デフォルトの周波数は80.0MHz(TOKYO FM)です。
ソースファイルをそのままアップロードできないので、拡張子をpdfに偽装しています。右クリックでダウンロード後、拡張子をpdeに変えてください。
Si4703a
シリアルモニタを開くと、いくつかの操作ができます。
長くなるので、とりあえずここまで。次はLCDに周波数を表示したり、もう少し手を入れてみます。

広告
カテゴリー: Arduino

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中

カテゴリー
2011年3月
« 1月   5月 »
 123456
78910111213
14151617181920
21222324252627
28293031  
%d人のブロガーが「いいね」をつけました。