はじめに
- 電子工作の初心者として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:
}