#はじめに
- 今回は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)
#モジュールについて
- DIP化。この基板(http://www.aitendo.com/product/11032) を利用しましたが、手間がかかりました。専用の変換基板の方が使いやすいです。
#データシートについて
- AN332は250ページもあるのですが、複数のICをまとめて記載しているため長くなっています。本ICの該当箇所だけ見れば十分です。
- AN332のP213のProgramming Exampleが参考になります。
#配線
- モジュールの説明通りにつなぐだけ。イヤフォンに直接出力可能ですが、出力コンデンサは必要です(適当な容量でOK)。
- モジュールのRSTピン(9番ピン)は 10KΩ の抵抗を通して、3.3V につなぎました。
- RDA5807のモジュールと配線が似ています。
#Slaveアドレス
- I2C Scannerによると「0x63(1100011)」でした。
#I2C通信
- 本モジュールは、レジスタに書き込むスタイルではないものの、コード的には似たような形になります。レジスタ番号の代わりにコマンド、データの代わりに引数、といった感じです。
- 普通のコードで書き込めます。
#コード作成のポイント
- AN332を参照しながらコードを作成するわけだが、ICの持つ機能をすべて生かすために、AN332はやたらと細かいところまで記述してある。とりあえず、FM放送を受信することに絞りました。
- AN332のProgramming Exampleフローチャートを追っていくと、次の流れにすれば良いようだ。
- Power Up: ICを起動する。
- Get_Rev: ICの情報を読み取る。
- Set FM Tune Frequency: 周波数設定
- 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なので、他のモジュールと操作方法が異なるのかな、と思いました。
- 資料は詳細で、機能も豊富にあるようなのですが、十分に活用できませんでした。