|
カテゴリ:カテゴリ未分類
2019年2月23日のブログで、
愛天堂のラジオキットAVRベースFMラジオキット [K-FM1602]の記事を書いた。 愛天堂AVRベースFMラジオキット [K-FM1602] を作りました。 | 日本を征服だ! - 楽天ブログ (rakuten.co.jp) 愛天堂のお姉さんがラジオIC(RDA5807)のレジスター値を勘違いしてプログラムを書いており、 ちゃんと動かないのではと文句を言ってしまったが、 お姉さんごめんなさい。 間違っていても、お姉さん相手に文句を言ってはいけない。 最近HPを見たら、依然として変だけど少しいじくったみたい。 でも結局変なんだけど。 レジスター値をSCAN設定にしてもSCANしないなと思ったら理由が分かった。 でもその変なのが実はヒントになって、かえって面白いことを見つけたのでOK。 RDA5807をTEA5767モードで動かすと、 (元はTEA5767愛天堂品番でFM-TEA5767-M又はM5767Aなんですが、 僕は50MHzで動かす為にRDA5807愛天堂品番でM5807MBに置き換えています。 ピン配置は同じなのでそのまま入れ替えが可能です。 またレジスターへの書き込みも60Hに書き込めばTEA5767として使えます。) RDA5807に置き換えると、 本来64NHz~1087MHzしか動作しない仕様なのに、51MHzでも動くみたい。 確かにカタログ上もレジスター値の中に隠しモードとして50MHz動作モードがあるが、 こんなに簡単にいけるとは思わなかった。 まずは普通の日本のFMを聞けるようにする。 スケッチはこんな感じ。 #include <Wire.h> #include <TEA5767Radio.h> #include <LiquidCrystal.h> unsigned char search_mode=0; int b=0; int c=0; int d=0; int e=0; int f=0; #define Button_next 6 #define Button_prev 7 #define Button_nextL 8 #define Button_prevL 11 #define Button_nextS 10 unsigned char frequencyH=0; unsigned char frequencyL=0; unsigned int frequencyB; double frequency=0; double freq_available=0; //receivef LiquidCrystal lcd(13, 12, 2, 3, 4, 5); void setup() { Wire.begin(); lcd.begin(16, 2); /// buttons pinMode(Button_next, INPUT); digitalWrite(Button_next, HIGH); //pull up resistor pinMode(Button_prev, INPUT); digitalWrite(Button_prev, HIGH); //pull up resistor pinMode(Button_nextL, INPUT); digitalWrite(Button_nextL, HIGH); //pull up resistor pinMode(Button_prevL, INPUT); digitalWrite(Button_prevL, HIGH); //pull up resistor pinMode(Button_nextS, INPUT); digitalWrite(Button_nextS, HIGH); //pull up resistor frequency=84.7; //starting frequency frequencyB=4*(frequency*1000000+225000)/32768; //calculating PLL word frequencyH=frequencyB>>8; frequencyL=frequencyB&0XFF; delay(100); Wire.beginTransmission(0x60); //writing TEA5767 Wire.write(frequencyH); Wire.write(frequencyL); Wire.write(0xB0); Wire.write(0x10); Wire.write(0x00); Wire.endTransmission(); delay(100); } void loop() { unsigned char buffer[5]; lcd.setCursor(0, 0); Wire.requestFrom(0x60,5); //reading TEA5767 if (Wire.available()) { for (int i=0; i<5; i++) { buffer[i]= Wire.read(); } freq_available=(((buffer[0]&0x3F)<<8)+buffer[1])*32768/4-225000; lcd.print("FM "); lcd.print((freq_available/1000000)); frequencyH=((buffer[0]&0x3F)); frequencyL=buffer[1]; if (search_mode) { if(buffer[0]&0x80) search_mode=0; } if (search_mode==1) lcd.print(" SCAN"); else { lcd.print(" "); } lcd.setCursor(0, 1); lcd.print("SIGNAL: "); lcd.print((buffer[3]>>4)); lcd.print("/16 "); if (buffer[2]&0x80) lcd.print("STEREO "); else lcd.print("MONO "); } ///// buttons read //////////// button_next////////// if (!digitalRead(Button_next)&&!b) { frequency=(freq_available/1000000)+0.05; //f=receivef+0.05 frequencyB=4*(frequency*1000000+225000)/32768+1; frequencyH=frequencyB>>8; frequencyL=frequencyB&0XFF; Wire.beginTransmission(0x60); Wire.write(frequencyH); Wire.write(frequencyL); Wire.write(0xB0); Wire.write(0x1F); Wire.write(0x00); Wire.endTransmission(); ////////////////////// b=100; }; if (!digitalRead(Button_next)&&b==1) { ///scannnn UP search_mode=1; Wire.beginTransmission(0x60); Wire.write(frequencyH+0x40); Wire.write(frequencyL); Wire.write(0xB0); Wire.write(0x1F); Wire.write(0x00); Wire.endTransmission(); ///////////////// b=100; }; if (!b==0) b--; //////////// button_prev////////// if (!digitalRead(Button_prev)&&!c) { frequency=(freq_available/1000000)-0.05; //f=receivef-0.05 frequencyB=4*(frequency*1000000+225000)/32768+1; frequencyH=frequencyB>>8; frequencyL=frequencyB&0XFF; Wire.beginTransmission(0x60); Wire.write(frequencyH); Wire.write(frequencyL); Wire.write(0x30); Wire.write(0x1F); Wire.write(0x00); Wire.endTransmission(); c=100; }; if (!digitalRead(Button_prev)&&c==1) { ///scannnn DOWN search_mode=1; Wire.beginTransmission(0x60); Wire.write(frequencyH+0x40); Wire.write(frequencyL); Wire.write(0x30); Wire.write(0x1F); Wire.write(0x00); Wire.endTransmission(); c=100; }; if (!c==0) c--; //////////// button_nextL////////// if (!digitalRead(Button_nextL)&&!d) { frequency=(freq_available/1000000)+1; //f=receivef+1 frequencyB=4*(frequency*1000000+225000)/32768+1; frequencyH=frequencyB>>8; frequencyL=frequencyB&0XFF; Wire.beginTransmission(0x60); Wire.write(frequencyH); Wire.write(frequencyL); Wire.write(0xB0); Wire.write(0x1F); Wire.write(0x00); Wire.endTransmission(); ////////////////////// d=100; }; if (!digitalRead(Button_nextL)&&d==1) { ///scannnn UP search_mode=1; Wire.beginTransmission(0x60); Wire.write(frequencyH+0x40); Wire.write(frequencyL); Wire.write(0xB0); Wire.write(0x1F); Wire.write(0x00); Wire.endTransmission(); ///////////////// d=100; }; if (!d==0) d--; //////////// button_prevL////////// if (!digitalRead(Button_prevL)&&!e) { frequency=(freq_available/1000000)-1; //f=receivef-1 frequencyB=4*(frequency*1000000+225000)/32768+1; frequencyH=frequencyB>>8; frequencyL=frequencyB&0XFF; Wire.beginTransmission(0x60); Wire.write(frequencyH); Wire.write(frequencyL); Wire.write(0x30); Wire.write(0x1F); Wire.write(0x00); Wire.endTransmission(); e=100; }; if (!digitalRead(Button_prevL)&&e==1) { ///scannnn DOWN search_mode=1; Wire.beginTransmission(0x60); Wire.write(frequencyH+0x40); Wire.write(frequencyL); Wire.write(0x30); Wire.write(0x1F); Wire.write(0x00); Wire.endTransmission(); e=100; }; if (!e==0) e--; //////////// button_nextS////////// if (!digitalRead(Button_nextS)&&!f) { frequency=(freq_available/1000000)+0.01; //f=receive+0.01 frequencyB=4*(frequency*1000000+225000)/32768+1; frequencyH=frequencyB>>8; frequencyL=frequencyB&0XFF; Wire.beginTransmission(0x60); Wire.write(frequencyH); Wire.write(frequencyL); Wire.write(0xB0); Wire.write(0x1F); Wire.write(0x00); Wire.endTransmission(); ////////////////////// f=100; }; if (!digitalRead(Button_nextS)&&f==1) { ///scannnn UP search_mode=1; Wire.beginTransmission(0x60); Wire.write(frequencyH+0x40); Wire.write(frequencyL); Wire.write(0xB0); Wire.write(0x1F); Wire.write(0x00); Wire.endTransmission(); ///////////////// f=100; }; if (!f==0) f--; //////////////////// } 一部愛天堂のお姉さんの変な所を残しているのがミソである。 レジスターの3バイト目の書き込みが、 Wire.write(0xB0); となっており、UPSCANモードになっているのに、 それを次の瞬間に周波数を直接書き込んで、無駄にしており、SCANしない。 PLL値の計算式である、 frequency=(freq_available/1000000)+0.05; //f=receivef+0.05 は、 freq_available=(((buffer[0]&0x3F)<<8)+buffer[1])*32768/4-225000; により 読みだされた現在の周波数freq_availableにスイッチを押した時の増分0.05MHzから 増分後の周波数のPLL値、 frequency=(freq_available/1000000)+0.05; //f=receivef+0.05 を直接書き込むので、 SCANするのではなく増分後の周波数になり、それが基準周波数になるのでUPしない。 本来ならばダメなプログラムなんだけど、 この方法は1回ごとに基準周波数を書き込むので、 レジスターの設定に縛られない。 そう言えば、元々2019年2月23日のブログで指摘した間違いは、 いくら80MHzなど低い周波数にしてもSCANした瞬間に87.5MHz以上に戻るのは、 設定が北米仕様(87.5MHz~108MHz)になっているからだと言うものだったけど、 初回だけは80.0MHzになっていたからなぁ。 それをプログラムで自動的に繰り返すようにした感じなのか。 そこで結果的に僕の目的に合うのでお姉さんのプログラムを利用させてもらった。 上記のプログラムはお姉さんのプログラムが、 スイッチNo1を押すと+0.05MHz、スイッチNo2なら-0.05MHzになるのを改良して、 スイッチNo3を押すと+1MHz、スイッチNo4なら-1MHz、スイッチNo5なら+0.01MHzに 改造したものである。 だって、僕の目的である51MHzを受信するには、 0.05MHzステップだと日が暮れるから。 だから1MHzステップと微調整の0.01MHzステップを加えたのである。 だったら初期周波数を84.7MHzにしないで51.0MHzにすれば良いと言われるかもしれないが、 FM横浜(84.7MHz)はメインで聞きたいから。NACK5もTBSも聞きたいし。 なので1MHzステップと言えど51.0MHzまでは33回もボタンを押すことになるが妥協した。 スイッチ5を5MHzステップにする手はあるかも? ちなみにせっかく作ったんだけど、51MHzで遊んでいる人は居ないみたいで、 今日はまだ聞けていない。 SSBならば50MHzにたくさんいるみたいだし、 144MHzならばFMの人は居ると教えてもらったけど、 このRDA5807は頑張っても110MHzくらいしか使えないみたい。仕方ない。 気長に探してみよう。 <後日追記> 最初の設定に縛られない(日本バンドで設定しても高い周波数のTBSや日本放送が聞けるし、 欧米バンドに設定しても低い周波数のNACK5(79.5MHz)が聞けるのはうれしい。 +1MHzステップや-1MHzを何回か押す必要は有るけれど、我慢できる範囲。 愛天堂のお姉さん偉い。 ただ、PLL値の設定が精度が悪く、+0.05MHzのスイッチを押しても+0.06MHz変化する。 お姉さんは frequencyB=4*(frequency*1000000+225000)/32768+1; のアンダーライン部のように工夫して、元の計算式に無い+1で微調整しているけど、 ここをさらに微調整すると良いのかな?まだ実験していないけどやってみるか。 <さらに後日追記> 今日(5月29日)午後15時50分頃、 51.94MHzで強い電波を受信できた。 けれど人の声は聞こえなかった。 受信強度は13/16。但しこの数字はこの受信機の固有の受信強度で、 これ以上はいくら強くても13/16なので絶対値では無いからあまり意味はないけれど、 近くの小田原等の地域FM局と同レベル。 どこから届く電波か分からないけれど、 この受信機でワイヤーアンテナでも51MHz帯のFM波を聞ける可能性があるなと思った。 お気に入りの記事を「いいね!」で応援しよう
最終更新日
May 29, 2022 04:08:22 PM
コメント(0) | コメントを書く |