Merhabalar, Robo90 firmasından satın almış olduğum aşağıdaki elektronik parçalar ve Arduino kodlama ile yapmış olduğum FM Radyo devresi çalışmasını aşağıda görecekseniz.
Elektronik Parçalar;
1-Nokia 5110 LCD Ekran – 84×48 – Arduino Uyumlu https://www.robo90.com/nokia-5110-lcd-ekran-84×48-arduino-uyumlu
2-TEA5767 FM Stereo Radyo Modülü: FM sinyalleri almak için tercih ettiğim radyo modülü. https://www.robo90.com/tea5767-fm-stereo-radyo-modulu
3-Arduino Nano Klon: Projenin beyni olarak görev yapan Arduino Nano. https://www.robo90.com/arduino-nano-klon-usb-kablo-hediyeli
4-PAM8403 2x3W Mini Ses Yükseltici Kartı – Stereo – Amfi-Potlu: Stereo amfi olarak kullanılarak sesi hoparlöre aktarıyor. https://www.robo90.com/pam8403-2x3w-mini-ses-yukseltici-karti-stereo-amfi-potlu
5-Rotary Encoder Modülü – KY-040 – Arduino Uyumlu: Radyo frekansını ayarlamak için kullanılan döner enkoder. https://www.robo90.com/rotary-encoder-modulu-ky-040-arduino-uyumlu
6-Hoparlör: 4 ohm 3 watt
7-Seetronic MTP3C Stereo 3.5mm Jak (TEA5767 hoparlör çıkışı için)
FM radyo projemizde, Arduino Nano ile frekans ayarlamalarını yapabiliyoruz ve radyo sinyallerini TEA5767 modülü ile alıyoruz. Ekran olarak Nokia 5110 kullanarak radyo frekansını ve kanal bilgilerini görüntüleyebiliyoruz. Ses yükseltme kartı (PAM8403) ise sinyali hoparlöre aktarıyor. Rotary Encoder, frekans ayarını hassas bir şekilde yapmamızı sağlıyor.
FM Radyo Uygulama Videosu
FM radyo devremizin nasıl çalıştığını görmek isterseniz aşağıdaki video bağlantısından uygulama videosunu izleyebilirsiniz.
Arduino kod yazılımını da aşağıya ekliyorum.
Dikkat etmeniz gerekenler için;
1- Kod içinde kullanılan kütüphanelerin linkleri aynı satırda verilmiştir. Bu linkleri kullanarak kütüphaneleri indirebilirsiniz.
2- FreeSerif18pt7b, FreeSerifItalic9pt7b ve FreeMono12pt7b kütüphanelerini indirdikten sonra, aşağıdaki kodlarla oluşturacağınız .ino uzantılı arduino programının yer aldığı klasör içine taşıyın ve sırasında program kodlarınızı Arduino Nano içine yükleyin.
Kablo Şeması ve Bağlantılar
Bu devrede Arduino Nano, TEA5767 radyo modülü, PAM8403 ses yükseltici ve Nokia 5110 ekranı belirli pin bağlantıları üzerinden birbirine bağlanır. Kablo bağlantılarını doğru yapmak, projenin sorunsuz çalışması açısından önemlidir.

Arduino Kodu
Aşağıda projenin Arduino kodlarını göreceksiniz. Bu kodlar sayesinde radyo frekansını ayarlayabilir, kanalları kaydedebilir ve LCD ekranda kanal bilgilerini görüntüleyebilirsiniz. Kodlar, frekans değişimlerini hafızaya alarak en son ayarlanan frekansa geri dönme işlevine de sahiptir.
#include <TEA5767N.h> //https://github.com/mroger/TEA5767
#include <SPI.h>
#include <Adafruit_GFX.h> //https://github.com/adafruit/Adafruit-GFX-Library
#include <Adafruit_PCD8544.h> //https://github.com/adafruit/Adafruit-PCD8544-Nokia-5110-LCD-library
#include "FreeSerif18pt7b.h" //https://github.com/adafruit/Adafruit-GFX-Library/blob/master/Fonts/FreeSerif18pt7b.h
#include "FreeSerifItalic9pt7b.h" //https://github.com/adafruit/Adafruit-GFX-Library/blob/master/Fonts/FreeSerifItalic9pt7b.h
#include "FreeMono12pt7b.h" //https://github.com/adafruit/Adafruit-GFX-Library/blob/master/Fonts/FreeMono12pt7b.h
#include "splash.h"
#include <ClickEncoder.h> //https://github.com/0xPIT/encoder
#include <TimerOne.h> //https://github.com/PaulStoffregen/TimerOne
#include <EEPROM.h>
Adafruit_PCD8544 display = Adafruit_PCD8544(5, 4, 3);
int SaniyeOtoKayit = 300;
float onceki_frekans = 0;
float frekans = 95.0f;
ClickEncoder *encoder;
int16_t son_deger, value;
boolean yukari = false;
boolean asagi = false;
boolean orta = false;
long saniye_degeri = 0;
long oncekiler = 0;
bool arkaisikACIK = false;
long aralik = 1000;
TEA5767N radyo = TEA5767N();
void setup()
{
pinMode(7, OUTPUT);
digitalWrite(7,HIGH);
initDisplay();
acilissayfasigoster();
radyo.setMonoReception();
radyo.setStereoNoiseCancellingOn();
RotaryEncoderVeri();
Serial.begin(9600);
frekans = readFrequencyFromEEPROM();
if(isnan(frekans))
{
Serial.println("setup(): EEPROM icinde frekans degeri yoktur.");
frekans = 88.0;
writeFrequencyToEEPROM(&frekans);
}
printText(String(frekans,1),String(frekans,1));
}
void loop() {
unsigned long mevcutlar = millis();
RotaryEncoderKontrol();
if(mevcutlar - oncekiler > aralik)
{
if(frekans!=onceki_frekans)
{
onceki_frekans = frekans;
radyo.selectFrequency(frekans);
saniye_degeri = 0;
}else
{
saniye_degeri++;
if(saniye_degeri == SaniyeOtoKayit)
{
float frekans_oku = readFrequencyFromEEPROM();
if(frekans_oku!=frekans)
{
Serial.println("Dongu(): Yeni frekans EEPROM icine kaydediliyor.");
writeFrequencyToEEPROM(&frekans);
}
}
}
oncekiler = mevcutlar;
Serial.println("loop(): "+String(saniye_degeri));
}
readRotaryEncoder();
if(yukari)
{
yukari = false;
onceki_frekans = frekans;
frekans = frekans+0.1f;
printText(String(frekans,1),String(onceki_frekans,1));
}
if(asagi)
{
asagi = false;
onceki_frekans = frekans;
frekans = frekans-0.1f;
printText(String(frekans,1),String(onceki_frekans,1));
}
}
void printText(String yazi, String onceki_yazi)
{
display.clearDisplay(); // clears the screen and, WHITE buffer
if(onceki_yazi.length() == 4)
{
display.setFont(&FreeSerifItalic9pt7b);
}else
{
display.setFont(&FreeSerifItalic9pt7b);
}
display.setTextColor(WHITE);
display.setCursor(5,11);
display.println("Gulru FM");
display.setFont(&FreeSerif18pt7b);
display.setCursor(4,44);
display.println(onceki_yazi);
display.display();
if(yazi.length() == 4)
{
display.setFont(&FreeSerifItalic9pt7b);
}else
{
display.setFont(&FreeSerifItalic9pt7b);
}
display.setTextColor(BLACK);
display.setCursor(5,11);
display.println("Gulru FM");
display.setFont(&FreeSerif18pt7b);
display.setCursor(4,44);
display.println(yazi);
display.display();
}
void RotaryEncoderVeri()
{
encoder = new ClickEncoder(A1, A0, A2);
encoder->setAccelerationEnabled(false);
Timer1.initialize(1000);
Timer1.attachInterrupt(timerIsr);
son_deger = encoder->getValue();
}
void initDisplay()
{
display.begin();
display.setContrast(60);
display.clearDisplay(); // clears the screen and, WHITE buffer
display.display();
}
void timerIsr()
{
encoder->service();
}
void acilissayfasigoster()
{
display.clearDisplay();
//display.drawBitmap(0, 0, SPLASH, 84, 48, 1);
display.setTextSize(2);
display.setCursor(3, 0);
display.print(" GULRU");
display.setCursor(3, 20);
display.print(" RADYO");
display.display();
delay(5000);
display.clearDisplay(); // clears the screen and, WHITE buffer
display.setTextSize(1);
}
void writeFrequencyToEEPROM(float *freq)
{
byte ByteArray[4];
memcpy(ByteArray, freq, 4);
for(int x = 0; x < 4; x++)
{
EEPROM.write(x, ByteArray[x]);
}
Serial.println("writeFrequencyFromEEPROM(): "+String(frekans));
}
float readFrequencyFromEEPROM()
{
float frekans = 86.0;
byte ByteArray[4];
for(int x = 0; x < 4; x++)
{
ByteArray[x] = EEPROM.read(x);
}
memcpy(&frekans, ByteArray, 4);
Serial.println("readFrequencyFromEEPROM(): "+String(frekans));
return frekans;
}
void RotaryEncoderKontrol()
{
ClickEncoder::Button b = encoder->getButton();
if (b != ClickEncoder::Open) {
if(b==ClickEncoder::Clicked)
{
Serial.println("Toggle BackLight");
if(arkaisikACIK == false)
{
arkaisikACIK = true;
turnOnBacklight();
}else
{
arkaisikACIK = false;
turnOffBacklight();
}
}
}
}
void turnOnBacklight()
{
digitalWrite(7,LOW);
}
void turnOffBacklight()
{
digitalWrite(7,HIGH);
}
void readRotaryEncoder()
{
value += encoder->getValue();
if (value/2 > son_deger) {
son_deger = value/2;
yukari = true;
delay(50);
}else if (value/2 < son_deger) {
son_deger = value/2;
asagi = true;
delay(50);
}
}
Bu proje ile ilgili sorularınız veya yardıma ihtiyaç duyduğunuz konular varsa yorum yaparak bana ulaşabilirsiniz. Keyifli projeler dilerim!