LoginSignup
0
0

More than 3 years have passed since last update.

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

Posted at

はじめに

  • 電子工作の初心者としてDSPラジオに挑戦。
  • Aitendoさんのモジュール以外にも目を向けて、AliexpressでDSPラジオICを探してみた。Si4702では何種類かモジュールが見つかるが、安価なものをチョイス。1枚100円なので3枚注文。
  • Silicon Labsなので詳しい資料は入手可能。レジスタの操作が独特ですが、何とか受信できました。

使用したもの

  • Aliexpressで入手したSi4702モジュール。写真ご参照。
  • IC(Si4702)のデータシート。検索してください。
  • IC(Si4702)のProgramming Guide AN230。検索してください。
  • Arduino Uno互換機(ELEGOO) Si4702.png

モジュールについて

  • 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には十分と予想。実際にモジュールは無事起動した。

配線

  • RDA5807-M2と接続は同じ。ただし、音声出力にコンデンサが必要。電源は3.3V、5Vのどちらでも動きます。
  • 1: ANT ~ 10:LEFTです。 Si4702_ブレッドボード.jpg

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されるものが多かったので。
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0