1
Help us understand the problem. What are the problem?

More than 1 year has passed since last update.

posted at

Si4730をArduinoで制御 DSP ラジオモジュール


はじめに

  • 今回はSi4730に挑戦。アメリカの会社らしく、データシート類も公開されていて資料には困らない。逆に資料が多すぎてポイントがわかりにくい。
  • DSPラジオのICは「レジスタに2バイトずつ書き込む」ことで制御することが多いが、本ICは「コマンド+引数」でコントロールするので、勝手が違って苦労した。
  • Si4730はAM/FM対応ですが、今回はFMだけです。

使用したもの

  • Aitendoさんのモジュール。Si4730-M(http://www.aitendo.com/product/4768)
  • IC(Si4730)のProgramming Guide AN332。上記参照。
  • IC(Si4730)のデータシート。検索してください。
  • Arduino Uno互換機(ELEGOO)

モジュールについて

データシートについて

  • AN332は250ページもあるのですが、複数のICをまとめて記載しているため長くなっています。本ICの該当箇所だけ見れば十分です。
  • AN332のP213のProgramming Exampleが参考になります。

配線

  • モジュールの説明通りにつなぐだけ。イヤフォンに直接出力可能ですが、出力コンデンサは必要です(適当な容量でOK)。
  • モジュールのRSTピン(9番ピン)は 10KΩ の抵抗を通して、3.3V につなぎました。
  • RDA5807のモジュールと配線が似ています。 Si4730.jpg

Slaveアドレス

  • I2C Scannerによると「0x63(1100011)」でした。

I2C通信

  • 本モジュールは、レジスタに書き込むスタイルではないものの、コード的には似たような形になります。レジスタ番号の代わりにコマンド、データの代わりに引数、といった感じです。
  • 普通のコードで書き込めます。

コード作成のポイント

  • AN332を参照しながらコードを作成するわけだが、ICの持つ機能をすべて生かすために、AN332はやたらと細かいところまで記述してある。とりあえず、FM放送を受信することに絞りました。
  • AN332のProgramming Exampleフローチャートを追っていくと、次の流れにすれば良いようだ。
    1. Power Up: ICを起動する。
    2. Get_Rev: ICの情報を読み取る。
    3. Set FM Tune Frequency: 周波数設定
    4. FM_TUNE_STATUS: 受信状況の読み取り
  • 上記のうち、2.と4.は省略してもよいはず。なので、1.と3.に絞ってコードを書きました。
  • Power Up:
    • コマンドは 0x01
    • 引数1 (ARG1)は、水晶を使うので "0b00010000"
    • 引数2 (ARG2)は、音声はアナログ出力なので "0b00000101"
    • 本来はこの後、Responceを取って、ICの状態を確認すべきですが、割愛。
  • Set FM Tune Frequency:
    • コマンドは 0x20
    • 引数1 (ARG1)は、AN332の指定で "0b00000000"
    • 引数2、引数3 (ARG2,ARG3)は、設定する周波数を10kHz単位で設定。80MHzなら8000(=1F40)を2バイトに分けて書き込む。ARG2 = 1F, ARG3 = 40
    • 引数4はAN332を参照して"0b00000000"

動作コード

  • 上記のポイントを考慮して作成した、特定の周波数を書き込むシンプルなコード。コマンド2つだけ操作し、後はDefaultのままでOK。
  • コマンドと引数を並べて書けばよいので、単純なコードになりました。
#include <Wire.h>
void setup()
{
delay(100);
Wire.begin();
Wire.beginTransmission(0X63); //slave ad
  Wire.write(0x01); //  Power up
  Wire.write(0b00010000);
  Wire.write(0b00000101);
Wire.endTransmission();
delay(200);
Wire.beginTransmission(0X63); //slave ad
  Wire.write(0x20); //  FM Freq
  Wire.write(0x00); 
  Wire.write(0x1F); // 8000 =1F40
  Wire.write(0x40); // 8000 =1F40
  //Wire.write(0x20); // 8250
  //Wire.write(0x3A); // 8250
  Wire.write(0x00);
Wire.endTransmission();
}

void loop() {
  // put your main code here, to run repeatedly:
}

おまけ

  • 本ICは、データシートの日付が2008年。比較的古いICなので、他のモジュールと操作方法が異なるのかな、と思いました。
  • 資料は詳細で、機能も豊富にあるようなのですが、十分に活用できませんでした。
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Sign upLogin
1
Help us understand the problem. What are the problem?