Posted at

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


はじめに


  • 電子工作の初心者としてDSPラジオに挑戦。

  • RDA5807に続いて、AR1019に挑戦。作例も少なく、手探りだったが、Programming Guideもあって、何とか受信に成功。


使用したもの


  • Aitendoさんのモジュール。AR1019-M(http://www.aitendo.com/product/4765)

  • IC(AR1019)のデータシート、Programming Guide。上記のモジュールのページご参照。

  • Arduino Uno互換機(ELEGOO)


モジュールについて


  • DIP化。この変換基板(http://www.aitendo.com/product/11945) を利用。たまたま店頭で見かけたので使いましたが、他にも変換基板あります。

  • セロテープで仮固定し、フラックスを塗布すれば、はんだ付けは難しくないと思います。



配線


  • これもモジュールの説明通りにつなぐだけ。イヤフォンに直接出力可能。出力コンデンサはなくても聞こえます。



I2C読込/書込


  • I2C Scannerによると、Slaveアドレスは0x10。

  • 特に変な癖はなく、普通のコードで読み書きできます。連続した読み込み、書き込みもOK。


レジスタ


  • Programming Guideを見てみると、レジスタTableの説明がスカスカで、Default値が何かわからない箇所が多い。このままでは書き込めないので、まず全レジスタを読み込んでみた。

ADR
既定値
ADR
既定値
ADR
既定値
ADR
既定値

00H
FFFA
09H
007D
12H
0000
1BH
65B1

01H
5B15
0AH
82C6
13H
5C80
1CH
1010

02H
D0B9
0BH
4E55
14H
0000

03H
A010
0CH
970C
15H
0000

04H
0780
0DH
B845
16H
0000

05H
28AB
0EH
FC2D
17H
0000

06H
2400
0FH
8097
18H
0000

07H
1EE7
10H
04A1
19H
0000

08H
7141
11H
DF6A
1AH
0000


  • これを見ながら、必要なデータをレジスタに書き込むことになる。

  • 00HがFFFAとなっているので、クロックとしては内部オシレーター(+水晶)を利用する設定であることがわかる。すなわち、このモジュールにマッチした設定になっているので、クロックについては既定値のままでOKのはず。*

  • また、ENABLEビットが0であることもわかる。


Initialization


  • GuideにはICを起動するための手順がいろいろと書いてあるが、このモジュールを立ち上げるには、単純にENABLEビット(00H.0)を1にすればOK。上記の通り、既定値ではこのビットは0になっているので、1を書き込めばよい。

  • 具体的には、00HにFFFBを書き込めばよい。


Tune


  • Guideの"Pseudo Code"に沿って設定する。GuideではSTCフラグを待つことになっているが、ここでは省略しています。


    • hmuteを1にする。すなわち音を消す。01H.1を1にする。

    • 100ms待つ。

    • TUNEビット(02H.9)を0にする。02Hに全て0を書き込む。02Hは後でまた設定する。

    • SEEKビット(03H.14)を0、BAND/SPACEを設定する。03Hに書き込み。

    • CHANを設定し、Tuneビットを1に設定。02Hに書き込み。

    • hmuteをゼロにする。音を出す。



  • 新しい周波数(CHAN)を設定するときは、一旦TUNEを0にする、ということか
    思います。


動作コード


  • 特定の周波数を書き込むシンプルなコード。詳細はコードとGuide見てください。

#include <Wire.h>

void setup()
{
Wire.begin();

//Initialization
Wire.beginTransmission(0X10); //slave address
Wire.write(0X00); //register
Wire.write(0xFF); //00
Wire.write(0xFB); // ENABLE 1
Wire.endTransmission();
// Initialization end

Wire.beginTransmission(0X10); //slave address
Wire.write(0X01); //register
Wire.write(0x5B); //
Wire.write(0x17); // hmute 1
Wire.endTransmission();

delay(100);

Wire.beginTransmission(0X10); //slave address
Wire.write(0X02); //register
Wire.write(0x00); //
Wire.write(0x00); // Tune 0
Wire.endTransmission();

Wire.beginTransmission(0X10); //slave address
Wire.write(0X03); //register
Wire.write(0xB8); // SEEK 0
Wire.write(0x20); // SPACE 1 BAND 11
Wire.endTransmission();

Wire.beginTransmission(0X10); //slave address
Wire.write(0X02); //register
Wire.write(0xD2); // TUNE 1
Wire.write(0x6E); // 69+110*0.1=80
//Wire.write(0x87); // 69+135*0.1=82.5
//Wire.write(0x5c); // 69+92*0.1=78.2
Wire.endTransmission();

delay(100);

Wire.beginTransmission(0X10); //slave address
Wire.write(0X01); //register
Wire.write(0x5B); //
Wire.write(0x15); // hmute 0
Wire.endTransmission();
}

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


おまけ


  • 本モジュールはIC単体も入手可能。モジュールを自作してみました。はんだ付けが少し面倒でしたが、上手くいきました。

  • 配線は違いますが、同じコードで受信可能です。