はじめに
- 電子工作の初心者としてDSPラジオに挑戦。
- Aitendoさんのモジュール以外にも目を向けて、AliexpressでDSPラジオICを探してみた。Si4702では何種類かモジュールが見つかるが、安価なものをチョイス。1枚100円なので3枚注文。
- Silicon Labsなので詳しい資料は入手可能。レジスタの操作が独特ですが、何とか受信できました。
使用したもの
- Aliexpressで入手したSi4702モジュール。写真ご参照。
- IC(Si4702)のデータシート。検索してください。
- IC(Si4702)のProgramming Guide AN230。検索してください。
- Arduino Uno互換機(ELEGOO)
モジュールについて
- DIP化 Aitendoさんの変換基板を使いました。
- 空中配線している抵抗とコンデンサは、DELAY回路。下で説明するRESET用に利用しているものです。
RESET
- 本ICは、電源を入れただけでは起動せず、RESET動作を行う必要がある。RESETを行うには、電源をオンの状態のまま、RESETピンを「LOW → HIGH」とする必要がある。
- WEBで見つかる作例では、RESETピンをArduinoの適当なデジタルピンにつないで、デジタルピンを「LOW → HIGH」とするようなコードで解決しているものがあった。
- このコードも書いてみたのだが、何かと不便なのでハード的な解決方法を試してみた。
- マイコンのリセット回路と同じような簡素なDELAY回路をRESETピンにつけてみた。電源ピンから遅れてRESETピンに電圧がかかる理屈なので、RESETがかかるはず。
- 時定数はRCだから、RC = 100K * 1μ = 0.1秒 なので、RESETには十分と予想。実際にモジュールは無事起動した。
配線
I2C通信について
- I2C Scannerによるとアドレスは0x10です。
- さて、本ICのI2Cですが、RDA5807でも少し触れましたが、レジスタへの書き込みが、連続書込みしかできない。自動的に以下のレジスタから連続して書き込まれる(読み込まれる)。個別のレジスタを指定する必要がない(というかできない)。書込:02Hから 読込:0AHから。
- コード例は、RDA5807の記事を参考にしてください。
コード作成のポイント
- 本ICについては、AN230に(詳しすぎる)手順があるので、それに従えばよい。
- ICの起動(Powerup):AN230 Table 3。 本ICを起動するには、上記のRESET後に以下の操作を行う必要がある。
- 07h 水晶使用の設定 → 500ms以上待つ。
- 02h DMUTE 1, ENABLE 1, DISABLE 0 → 110ms以上待つ。
- 先に07hを操作しなければいけないが、本ICは02hからしか書き込めない。仕方ないので02hから06hまでは0を書き込むようなコードにしてみた。
- その後、再び02hに書き込む形にしたところ、無事起動した。
- 周波数のセット、VOLUMEなど:AN230 Table 15。他のモジュールと同じように、TUNEビット(03h.15)に1をセットして、周波数を書き込めばよい。
- CHANの計算は、例えば80MHZなら以下の通り。05hのSPACE、BANDも設定する。
- SPACE 100khz, BAND 76-108Mhz
- CHAN = (80-76) / 0.1 = 40 (28h)
動作コード
- 特定の周波数を書き込むシンプルなコード。あまりスマートなコードではないです。
- デジタルピンを使用した場合のRESET用のコードもコメントアウトして入れてあります。
# include <Wire.h>
void setup() {
/*
pinMode(13,OUTPUT);
digitalWrite(13,LOW);
delay(10);
digitalWrite(13,HIGH);
delay(10);
*/
//IC起動
Wire.begin();
Wire.beginTransmission(0x10); // slave address 0x10
Wire.write(0x00); //2
Wire.write(0x00); //
Wire.write(0x00); //3
Wire.write(0x00); //
Wire.write(0x00); //4
Wire.write(0x00); //
Wire.write(0x00); //5
Wire.write(0x00); //
Wire.write(0x00); //6
Wire.write(0x00); //
Wire.write(0x81); //7 Crystal
Wire.write(0x00); //
Wire.endTransmission(); //
delay(500);
Wire.begin();
Wire.beginTransmission(0x10); // slave address 0x10
Wire.write(0x42); // DMUTE1 SEEK0
Wire.write(0x01); // DISABLE0 ENABLE1
Wire.endTransmission(); //
delay(500);
//TUNE,周波数,VOL,de50
Wire.begin();
Wire.beginTransmission(0x10); // slave address 0x10
Wire.write(0x42); //2
Wire.write(0x01); //
Wire.write(0x80); //3H Tune1
Wire.write(0x28); //3L 80.0
//Wire.write(0x16); //3L 78.2
//Wire.write(0x9C); //3L 91.6
Wire.write(0x08); //4 de50
Wire.write(0x00); //
Wire.write(0x00); //5
Wire.write(0x5F); // band01,space01,vol1111
Wire.endTransmission(); //
}
void loop() {
// put your main code here, to run repeatedly:
}
おまけ
- 詳細な資料がありますが、とても全部は無理で、部分的にしか読めませんでした。機能をフルに活用していない、ということなので少し残念。
- 年代的には 本IC → RDA5807 となっています。両方触ってみて、RDA5807は、Si4702の良いとこどりしている、という感じです。
- RESET操作が必要なICは初めてだったので戸惑いました。他のモジュールは、自動的にRESETされるものが多かったので。