はじめに
- 電池駆動の箱型DSPラジオの試作段階で試したもの。
- RDA5807FP + Arduino UNOで、割込み動作などをテストしてみたものです。
- 回路、部品定数などは、前記事(その1~その8)や過去記事も適宜ご参照ください。
テストの目的
- Arduinoの割込み動作の確認:RDA5807FPからのトリガで割込みが正常に動くか。
- タクトスイッチ動作(SEEK再開)の確認:タクトスイッチの動作をLOOP文でモニタ出来るか。
割込みについて
- 他記事でも書きましたが、ARDUINOには2通りの割込み方法があります。いわゆる普通の割込み(INT0とか)と、ピンチェンジ割込み(PCINT)の2種類。
- 通常割込みの方が扱いやすく、普通はこちらを使えばよいと思います。
- 電池駆動ラジオでは、ピン数の関係で、止む無くPCINTを使いましたが、ここでは通常割込みを用いています。
- 割込み関数の中では、WIRE関数が使えないので、割込み関数内ではフラグを変更し、そのフラグをLOOP文でモニタする形にしています。
部品の構成
- 以下の構成にしてあります。
スケッチ詳細
- 動作スケッチは下の方にあります。
- volatile変数
- 割込み関数で利用する変数(stc)を宣言しています。
- 以下SETUP()
- 割込み関数で利用する変数(stc)を宣言しています。
- 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()
- seek bitを1にして書き込み → SEEK開始
- 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を表示。他にも読み取れる情報はありますが、この2つだけにしています。
- 周波数は10倍で表示しています(整数で扱いたかったので)。適宜変更してください。
- 動作時のシリアルモニタの様子は以下。
動作スケッチ
# 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ラジオ程度は作れるような気がします。電子工作というよりはプログラミング主体になるとは思いますが。