DSP FMラジオ RDA5807FP+ARDUINO UNO　試作編

#はじめに
* 電池駆動の箱型DSPラジオの試作段階で試したもの。
* RDA5807FP + Arduino UNOで、割込み動作などをテストしてみたものです。
* 回路、部品定数などは、[前記事（その1～その8）や過去記事](https://qiita.com/dabodabo)も適宜ご参照ください。

#テストの目的
* Arduinoの割込み動作の確認：RDA5807FPからのトリガで割込みが正常に動くか。
* タクトスイッチ動作（SEEK再開）の確認：タクトスイッチの動作をLOOP文でモニタ出来るか。

#割込みについて
* 他記事でも書きましたが、ARDUINOには２通りの割込み方法があります。いわゆる普通の割込み（INT0とか）と、ピンチェンジ割込み（PCINT）の２種類。
* 通常割込みの方が扱いやすく、普通はこちらを使えばよいと思います。
* 電池駆動ラジオでは、ピン数の関係で、止む無くPCINTを使いましたが、ここでは通常割込みを用いています。
* 割込み関数の中では、WIRE関数が使えないので、割込み関数内ではフラグを変更し、そのフラグをLOOP文でモニタする形にしています。

#部品の構成
* 以下の構成にしてあります。
    1. RDA5807FPのGPIO2から、STCトリガを出力させる。
    2. 上記の出力トリガをUNOのD2ピンで受け、通常割込み（INT0）割込みを発生させる。
    3. SEEK開始のタクトスイッチ →　UNOのD3ピン。
    4. 周波数情報などはシリアルモニタへ出力
![RDA5807FP_Arduino.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482773/4b6ca0e3-57b9-860d-a2e1-e9beb5211ca7.jpeg)
![5807fp_UNO.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482773/462f2dfe-6920-6907-43e0-e80b309da364.jpeg)

#スケッチ詳細
* 動作スケッチは下の方にあります。
* volatile変数
    * 割込み関数で利用する変数（stc）を宣言しています。
        * 以下SETUP()
* pinMode
    * 本件で使うピンを宣言して、内部プルアップ抵抗を利用します。何も起きていないときはこれらのピンはHighになります。
* attachInterrupt(0,tuned,FALLING)
    * INT0を有効にするための設定です。"tuned"は割込み後に飛んでいく関数で、別途スケッチ内で定義します。
    * "FALLING"は、割込みがHigh→Lowの時に発生させるための設定。他の設定も可能。RDA5807FPからのトリガがHigh→Low→Highなのでこの設定にしています。
* レジスタ03,05,04への書き込み
    * 種々の条件を設定。過去記事、RDA5807FPのデータシートなどご参照ください。
* レジスタ02への書き込み
    * seek bitを1にして書き込み　→　SEEK開始
        * 以下LOOP()
* if(stc==1)
    * stcフラグが1になったらデータ表示関数(infodisplay())を実行。
* if(digitalRead(3)==0)
    * D3（SEEK開始ボタン）が0になったら、”SeekStart”を表示して、SEEK開始関数（seekset02H()）を実行
* tuned()
    * INT0が発生（選局完了）した場合に処理される関数。ここでstcが1となり、loop文の中でデータ表示関数が実行されます。
* void seekset02H()
    * SEEK開始関数。レジスタ02に書き込みことによって、seekを開始（再開）します。RDA5807FPの仕様では現在の周波数からseekを再開することになっています。
* void infodisplay()
    * データ表示関数。レジスタ0Aと0Bから情報を読み込み、適当に変換してシリアルモニタに表示しています。
    * 選局している周波数とRSSIを表示。他にも読み取れる情報はありますが、この２つだけにしています。
    * 周波数は10倍で表示しています（整数で扱いたかったので）。適宜変更してください。
* 動作時のシリアルモニタの様子は以下。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482773/3e89783e-5538-4cf3-7b48-88c6942d8871.png)



#動作スケッチ

```
#include <Wire.h>

volatile bool stc=0;

void setup()
{
pinMode(2,INPUT_PULLUP);//STC Interupt
pinMode(3,INPUT_PULLUP);//Tact Switch

attachInterrupt(0,tuned,FALLING);//pinD2 STC interrupt

Serial.begin(9600);
Wire.begin();
  
  delay(20);
  Wire.beginTransmission(0X11);
   Wire.write(0X03);
   Wire.write(0x00); //CHAN0  
   Wire.write(0b00001000); //TUNE0 BAND10 SPACE00
  Wire.endTransmission();
  
  Wire.beginTransmission(0X11);
   Wire.write(0X05);
   Wire.write(0b00000100); //INT_MODE1 SeekTh 0100  
   //Wire.write(0b00001000); //SeekTh 1000  
   Wire.write(0x8F); //
  Wire.endTransmission();

  //stc int,gpio2,ST-gpio3  
  Wire.beginTransmission(0X11);
   Wire.write(0X04);
   Wire.write(0b01001010); //STCINT1,DE50 
   Wire.write(0b00000100); //GPIO2:01 
  Wire.endTransmission();

  Wire.beginTransmission(0X11);
   Wire.write(0X02);
   Wire.write(0xc3); //seek up, seek on  
   Wire.write(0x05); //seekmode0(wrap)
  Wire.endTransmission();
}

void loop() {
  if(stc==1){
    Serial.print("Tuned ");
  infodisplay();
  stc=0;  
  }
  delay(10);
  if(digitalRead(3)==0){
    Serial.println("SeekStart ");
    seekset02H();
    delay(100);
  }
  delay(100);
}

void tuned(){
  stc=1;
}

void seekset02H(){
  Wire.beginTransmission(0X11);
   Wire.write(0X02);
   Wire.write(0b11000011); //seek up, seek on  
   Wire.write(0b00000101); //seekmode0(wrap)
  Wire.endTransmission();
}

void infodisplay(){
//Serial.begin(9600);
  delay(300);   //RSSIが安定するまでdelay
  Wire.beginTransmission(0X11);
  Wire.write(0X0a);
  Wire.endTransmission(false);
  Wire.requestFrom(0x11,4); //reading 5807
  Wire.endTransmission(true);
  
  byte buffer1= Wire.read();
  byte buffer2= Wire.read();
  byte buffer3= Wire.read();

int freq= 760 + 512*bitRead(buffer1,1)+ 256*bitRead(buffer1,0)+ buffer2;
byte rssi = buffer3>>1;
   Serial.print("Freq*10:");
   Serial.print(freq,DEC);
   Serial.print("  RSSI:");
   Serial.println(rssi,DEC);
}

```
#おまけ
* これだけの部品とスケッチで何となくラジオっぽいものが作れたので、箱型ラジオ製作に進みました。Arduinoで割り込みを扱うのは初めてでしたが、想定通りに動いてくれて楽しかったです。
* RDA5807FPとATMEGAの機能をフルに生かせば、もっと高機能のものが作れると思います。カーナビについているFMラジオ程度は作れるような気がします。電子工作というよりはプログラミング主体になるとは思いますが。