RDA5807M FM Radyo Modülü ve Arduino ile Basit Bir Radyo

 

Sadece 1 cm x 1 cm ölçülerindeki RDA5807M modülü ile tatmin edici bir ses kalitesi sağlayan çok basit bir FM radyo yapılabiliyor. Modül, 2 kablo üzerinden bir mikroişlemci ya da mikrokontrolör ile haberleşerek çalışıyor. Mikroişlemci tarafından verilen frekansa kendisini ayarlıyor ve stereo alış sağlıyor.


Amplifikatör olarak elbette hazır modüller de kullanılabilir. Ben elimde çok miktarda TDA2822M entegresi olduğu için kendim yapmayı tercih ettim. Stereo olan bu entegreye sadece birkaç kondansatör ve direnç eklemek yeterli. Benim kullandığım 9V beslemede entegre 2 x 1W çıkış verebiliyor. Bu çıkış küçük bir radyo için fazlası ile yeterli.

 

Şemayı büyütmek için üzerine tıklayınız

Şema oldukça basit. Sadece 3 farklı gerilim kullanmam gerekti, onu da şu şekilde çözdüm; Ana girişten 9V veriyorum. Bu gerilim amplifikatör entegresini besliyor (Aslında amplifikatör örneğin 3.3 voltta da çalışır ama gücü bayağı düşüyor). Aynı 9V gerilimi Arduino'ya da veriyorum. Arduino, üzerindeki gerilim regülatörü sayesinde kendi 5V gerilimini üretiyor. Devrenin en çok akım çeken kısmı amplifikatör ayrı bağlı olduğu için Arduino üzerindeki regülatör yüklenmiyor ve ısınmıyor bile. RDA5807M modülü 3.3 volt ile çalışıyor. Arduino üzerinde bir de 3.3 V çıkış olduğu için onun beslenmesi de kolayca sağlanıyor.

 

Radyonun frekans göstergesi LED'lerden oluşuyor. Ben eski görünümlü bir radyoya uydurmak için LED seçtim, aslında LCD gösterge ile çok daha hassas frekans gösterimi mümkün. Kısıtlı sayıda LED ile ancak tam frekansları gösterebildim (89, 90 ,91 vs. gibi). Öyle olunca elbette 90.0, 90.6 ya da 90.8'de sadece 90 MHz LED'i yandığından frekansı anlamak mümkün değil. Dediğim gibi, LCD ya da LED bir ekran kullanmak çok daha mantıklı. Ben sadece radyoya uyum sağlamak için bu şekilde yaptım.

 

Videoyu aşağıda izleyebilirsiniz.

 



Cihaz için yazdığım basit Arduino programını da aşağıya kopyalıyorum. Bu programın geliştirilmesi gereken çok fazla özelliği var. Muhtemelen bir sonraki versiyonu ayrı bir blog yazısı ve video olarak yayınlayacağım.

 

// Radio with RDA5807M Module
// Firat Tarman (c) October 2022

#include <RDA5807.h>
RDA5807 rx;

const int NumberOfCathodes = 4;
int Cathodes[NumberOfCathodes] = {7,6,5,4};
const int NumberOfAnodes = 6;
int Anodes [NumberOfAnodes] = {13,12,11,10,9,8};
const int TotalDisplayOutputs = 10;

int CurrentFrequency = 10000; // 100 MHz, i.e. Real frequency multiplied by 100
boolean StereoStation = false;

const int Encoder_A = 3;
const int Encoder_B = 2;
const int Encoder_Switch = A0;
int Previous_Output;

boolean EncoderUpdate = false;

void setup() 
    {
     for (int i = 0; i < NumberOfCathodes; i++)
     { pinMode(Cathodes[i], OUTPUT);
       digitalWrite (Cathodes[i],HIGH);}
     for (int i = 0; i < NumberOfAnodes; i++)
     { pinMode(Anodes[i], OUTPUT);
       digitalWrite (Anodes[i],LOW);}

     pinMode (Encoder_A, INPUT);
     pinMode (Encoder_B, INPUT);
     pinMode (Encoder_Switch, INPUT);
     Previous_Output = digitalRead(Encoder_A); //Read the initial value of Output A
     
     rx.setup();
     rx.setVolume(4);
     rx.setFrequency(10000); // 100.0 MHz
     rx.setMono (false);
     // rx.getRealFrequency();
     // rx.getRssi();
     // rx.setMute(true);
     // rx.setMute(false); 
     } // END OF setup

void TurnOffAllLEDs() 
    {
     for (int i = 0; i < NumberOfCathodes; i++)
     { digitalWrite (Cathodes[i],HIGH);}
     for (int i = 0; i < NumberOfAnodes; i++)
     { digitalWrite (Anodes[i],LOW);}
     }

void LightLEDs (int Frequency)
{ int Freq_Index=0;
  
  if (EncoderUpdate) rx.setFrequency(Frequency);

  TurnOffAllLEDs();

  if (StereoStation)
     { digitalWrite (Cathodes[0],LOW);
       digitalWrite (Anodes[0],HIGH);
       delay(5);
     } else delay(5);
  TurnOffAllLEDs();

  Frequency /= 100;
  if ((Frequency > 87) && (Frequency < 93)) // Frequencies between 88 - 92 (First LED is stereo LED)
  { digitalWrite (Cathodes[0],LOW);
    Freq_Index = Frequency - 87;
    digitalWrite (Anodes[Freq_Index],HIGH);
    delay(5);}

  if ((Frequency > 92) && (Frequency < 99)) // Frequencies between 93 - 98
  { digitalWrite (Cathodes[1],LOW);
    Freq_Index = Frequency - 93;
    digitalWrite (Anodes[Freq_Index],HIGH);
    delay(5);}

  if ((Frequency > 98) && (Frequency < 105)) // Frequencies between 99 - 104
  { digitalWrite (Cathodes[2],LOW);
    Freq_Index = Frequency - 99;
    digitalWrite (Anodes[Freq_Index],HIGH);
    delay(5);}

  if ((Frequency > 104) && (Frequency < 109)) // Frequencies between 105 - 108
  { digitalWrite (Cathodes[3],LOW);
  Freq_Index = Frequency - 105;
  digitalWrite (Anodes[Freq_Index],HIGH);
  delay(5);}

  StereoStation = rx.isStereo();


}  // END OF LightLEDs

void ReadEncoder()
{
   EncoderUpdate=false;
   if (digitalRead(Encoder_A) != Previous_Output)
   { if (digitalRead(Encoder_B) != Previous_Output) 
   {CurrentFrequency += 5;
   if (CurrentFrequency > 10800) CurrentFrequency = 10800; 
   }
   else 
   {CurrentFrequency -= 5;
   if (CurrentFrequency < 8800) CurrentFrequency = 8800; 
   }
   EncoderUpdate=true;
   }
   Previous_Output = digitalRead(Encoder_A);
}

void ReadEncoderSW()
{
   if (digitalRead(Encoder_Switch) == 0)
   {
   // SWITCH PRESSED ACTIONS
   }
}

void loop() 
{
   LightLEDs (CurrentFrequency);
   ReadEncoder();
   ReadEncoderSW();

}  // END OF MAIN LOOP
RDA5807M FM Radyo Modülü ve Arduino ile Basit Bir Radyo RDA5807M FM Radyo Modülü ve Arduino ile Basit Bir Radyo Reviewed by Fırat Tarman on 11:38 AM Rating: 5

No comments:

Fırat Tarman Devreler. Powered by Blogger.