2022年5月8日日曜日

RDA5807とarduinoでFMラジオ

RDA5807というFMラジオDSPチップがあります。
これは、マイコン等で制御するDSPラジオなのですが・・・・


Amazonをみていたら、1つあたり100円ちょっとという値段で出ていたので手に入れてみることにしました。

マイコンはarduinoを使います。ライブラリにRadioというものがあり、その中にRDA5807もサポートされているので簡単に動かせそうです。

インストールするとlibrariesフォルダの中にRadioフォルダがあります。
その中のexampleフォルダから
RDA5807を選んで試しに動かしてみたらあっさり動くようです。

ただし、実は
最初に使ったこのチップの載った1枚めは、どうやら不良品!?だったようです。
感度が1.5μVのはずなのに、地元のコミュニティFMが雑音まみれでうまく受信できません。

TEA5767では若干ノイズがのるもののきちんと受信はできるのに・・・・
(実はTEA5767とRDA5807ボードはピンコンパチでしかもRDA5807にはTEA5767と同じコードで動くモードがあって差し替えが可能なのです)

で、諦めかけたのですが・・・・なにせ同じものが5枚もあるのでだめもとで違うボードを試してみたら・・・・

ほぉ、感度良い。TEA5767よりもいいんじゃないの!!

中華モノによくある初期不良って言うやつにあたったのかも。。。。

実験的に
ブレッドボードに組んでみました。
回路図は面倒なので載せませんが・・・・
arduinoは3.3V品を使ってみました。
なのでI2S接続はレベル変換なしに直につなげられます。
出力はステレオ出力なので300円ダイソースピーカにつなげました。
楽で良いですね。


スケッチ。。。
注意点がひとつ。。
初期化のところでdelay(3000);とかなり大きなウエイトをかけています。
これがないと、最初に電源ONしたときだけ、RDA5807がこけます^^;
うまくsetFrequancyされない感じでノイズだけになってしまうことがありました。

注意点はそのくらいですかね

次回起動時のためにEEPROMには周波数(NO)とボリュームを保存することにしました。


// RDA5807Radio

#include <Arduino.h>
#include <Wire.h>
#include <radio.h>
#include <RDA5807M.h>
#include <EEPROM.h>
#define FIX_BAND  RADIO_BAND_FMWORLD //76-108Mhz対応

uint16_t freq[]={7620,7710,8180,8530,9080}; //周波数プリセット7620=76.2Mhz
uint8_t freq_max_num;
uint8_t freq_num=0;
uint8_t volume=15;
uint32_t timepassed=millis();
bool ROMsaved=1;
bool ROMwrite=0;
bool setmute_f=0;

RDA5807M radio;    // Create an instance of Class for RDA5807M Chip

void setup()
{
  pinMode(4,INPUT_PULLUP); //freq change
  pinMode(5,INPUT_PULLUP); //set mute
  pinMode(6,INPUT_PULLUP); //volume up 
  pinMode(7,INPUT_PULLUP); //volume down 
  Wire.begin();
  Serial.begin(9600);
  
  // Initialize the Radio  
  radio.init();
  delay(3000); //RDA5807がコマンドを受けられるように準備のための遅延
  radio.debugEnable();
  
  // load previus data
  freq_max_num=(sizeof(freq)/sizeof(uint16_t))-1;
  if (ROMsaved){
    freq_num=EEPROM.read(0);
    volume=EEPROM.read(1);
  }
  radio.setVolume(volume);
  radio.setMono(false);
  radio.setMute(setmute_f);
  radio.setBandFrequency(FIX_BAND,freq[freq_num]);
}

void loop()
{
  if (digitalRead(4) == LOW) {
    freq_num++;
    if (freq_num > freq_max_num) freq_num=0;
    radio.setFrequency(freq[freq_num]);
    timepassed=millis();
    ROMwrite=1;
    delay(500);
  }
  if (digitalRead(5) == LOW) {
    setmute_f=1^setmute_f;
    radio.setMute(setmute_f);
    delay(200);
  }
  if (digitalRead(6) == LOW) {
    if (volume<15){
    volume++;
    radio.setVolume(volume);
    timepassed=millis();
    ROMwrite=1;
    delay(200);
    }
  }
  if (digitalRead(7) == LOW) {
    if (volume>0){
    volume--;
    radio.setVolume(volume);
    timepassed=millis();
    ROMwrite=1;
    delay(200);
    }
  }

  //if freq,volume change EEPROM write
  if ((ROMwrite)&(timepassed+5000 < millis())) {
    ROMwrite=0;
    EEPROM.write(0,freq_num);
    EEPROM.write(1,volume);
    Serial.println(freq_num);
    Serial.println(volume);
    Serial.println(" saved");
  }
}


いやぁ、なんのことはないのですが、プログラムがちゃんと意図したとおりに動いてくれると楽しいものです。
人間世界では自分の意図したとおりになることは少ないので余計に(笑)

参考サイト
  • GitHub - mathertel/Radio: An Arduino library to control FM radio chips like SI4703, SI4705, RDA5807M, TEA5767.
    https://github.com/mathertel/Radio
  • Arduino Radio Library - The Library
    http://www.mathertel.de/Arduino/RadioLibrary.aspx
  • FMステレオラジオ II
    http://xyama.sakura.ne.jp/hp/FM_StereoRadioII.html
  • ワイドFM DSPラジオ (RDA5807M)を作ってみた – 店舗、生産者を応援
    https://www.himeport.co.jp/private_blog/%E3%83%AF%E3%82%A4%E3%83%89fm%E3%80%80dsp%E3%83%A9%E3%82%B8%E3%82%AA-%EF%BC%88rda5807m%EF%BC%89%E3%82%92%E4%BD%9C%E3%81%A3%E3%81%A6%E3%81%BF%E3%81%9F/?utm_source=pocket_mylist
  • aitendo の DSP ラジオの比較表 - Y-Lab. Electronics
    http://eleken.y-lab.org/report/other/dsp_radio.shtml?utm_source=pocket_mylist
  • 【格安】FMラジオモジュール RDA5807Mを試してみる – 某氏の猫空
    https://blog2.k05.biz/2020/02/rda5807m-fm-radio.html?utm_source=pocket_mylist
  • ArduinoとRDA5807でFMラジオを聴く - Qiita
    https://qiita.com/nanase/items/b9efc547d395d2d7cbc0?utm_source=pocket_mylist

0 件のコメント: