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) を利用。たまたま店頭で見かけたので使いましたが、他にも変換基板あります。
* セロテープで仮固定し、フラックスを塗布すれば、はんだ付けは難しくないと思います。
![20190821_231506.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482773/a2b05c9c-e730-0d6e-2bef-737e06d3c5b1.jpeg)


#配線
* これもモジュールの説明通りにつなぐだけ。イヤフォンに直接出力可能。出力コンデンサはなくても聞こえます。 
![AR1019.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482773/f9e019cb-112d-219a-9763-ce4e72ee6fe3.jpeg)

#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単体も入手可能。モジュールを自作してみました。はんだ付けが少し面倒でしたが、上手くいきました。
* 配線は違いますが、同じコードで受信可能です。
![20190822_205826.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482773/51423426-204d-7305-b8b7-378a38d282d9.jpeg)