Радиомодуль RRD_102v 2.0 на чипе RDA5807M (Arduino)

Модуль RRD_102v 2.0 FM радиоприёмника на ИМС RDA5807M отлично работает совместно с ARDUINO или любым микроконтроллером. К плате подключается антенна (или кусок проволоки длиной 20 см), звуковой сигнал через разделительные конденсаторы подается на наушники или усилитель. В данном варианте питание 3,3 В подается непосредственно с платы Arduino Nano.

Управление чипом цифровое, по I2C интерфейсу.

Характеристики FM-тюнера RDA5807m:
* Все в одном корпусе, практически не требуется внешних компонентов
* КМОП технология
* Максимальная полоса частот от 50 МГц до 115 МГц
* Настраиваемый шаг между каналами – 200 кГц, 100 кГц, 50 кГц, 25 кГц
* Поддерживает RDS/RBDS
* Высококачественный АЦП
* Синтезатор частот полностью встроен в микросхему
* Автоматическая регулировка усиления
* Цифровое адаптивное подавление шума
* Поддержка выхода звука как в моно, так и в стерео
* Индикатор уровня сигнала (Receive signal strength indicator — RSSI) и SNR
* Усилитель низких частот
* Регулировка звука и функция mute
* Цифровой интерфейс I2C
* Нагрузка на выходе звукового канала 32 Ом
* Встроенный LDO регулятор
* Корпус MSOP (10 выводов)

Электрические параметры FM тюнера RDA5807m:
* Напряжение питания — 3 вольта (от 1,8 до 3,6 вольт)
* Температура окружающей среды — от -20 до +75 градусов Цельсия
* Ток потребления в рабочем режиме — до 21 мА
* Ток потребления в спящем режиме – 5 мкА
* Коэффициент нелинейных искажений – 0,15 – 0,2 %
* Максимальная частота I2C – 400 кГц

Радиоприемник работает в частотном диапазоне от 87 до 108 МГц, управление приемником осуществляется при помощи трех кнопок «меню», «+» и «-» , а информация выводится на LCD1602 индикатор на базе контроллера HD44780.

В меню четыре раздела, первый раздел «Громкость», в нем можно регулировать громкость которая имеет 16 уровней, на экран выводится индикатор громкости, при не активности кнопок через 10 сек выводится информация о канале и RDS канала (RDS «Radio Data System» — радиовещательная система для передачи на ультракоротких волнах вместе со звуковым сигналом небольшого количества цифровой информации).

Второй раздел меню позволяет переключать каналы, которые предварительно были занесены в память при помощи третьего раздела меню — «автосканирование».

Раздел «автосканирование» позволяет отсканировать весь диапазон и автоматически выбрать каналы которые имеют достаточно большой уровень сигнала.

Последний четвертый раздел позволяет в ручном режиме изменить частоту канала, при этом если частота канала была изменена, то через 10 секунд (при не активности кнопок) произойдет сохранение частоты канала в энергонезависимую память.

Все частоты каналов (10 каналов) и уровень громкости сохраняются в энергонезависимой памяти через 60 секунд после не активности кнопок.

#include <Wire.h>
#include <radio.h>
#include <RDA5807M.h>
#include <LiquidCrystal.h>
#include <EEPROM.h>//#include <EEPROMex.h>
#include <RDSParser.h>
 LiquidCrystal lcd(7, 6, 2, 3, 4, 5);// RS,E,D4,D5,D6,D7
 byte a1[8]={0b00000,0b11011,0b11011,0b11011,0b11011,0b11011,0b11011,0b00000};
#define FIX_BAND    RADIO_BAND_FM   
 
RDA5807M radio; 
RADIO_INFO info;
RDSParser rds;
char s[12];
int menu,k,f_scan[10],f,i1=8700;
byte vol,bass,z,w,start,start1,t;
unsigned long time;
void DisplayServiceName(char *name){lcd.setCursor(0,1);lcd.print("    ");lcd.print(name);lcd.print("           ");} 
void RDS_process(uint16_t block1, uint16_t block2, uint16_t block3, uint16_t block4) {rds.processData(block1, block2, block3, block4);}
 
void setup() {
  vol=EEPROM.read(0);
  for(int c=0;c<10;c++){f_scan[c]=EEPROM.read(10+c)*100+EEPROM.read(100+c);}
  k=EEPROM.read(3);
  f=EEPROM.read(1)*100+EEPROM.read(2);start=0;
  lcd.begin(16, 2);
  Serial.begin(9600);
  radio.init();
  radio.debugEnable();
  pinMode(12,INPUT);// меню
  pinMode(11,INPUT);// плюс
  pinMode(10,INPUT);// минус
 lcd.createChar(0,a1);
  radio.setBandFrequency(FIX_BAND, f);
  radio.setVolume(vol);
  radio.setMono(false);
  radio.setMute(false);
  radio.attachReceiveRDS(RDS_process);
  rds.attachServicenNameCallback(DisplayServiceName);
delay(400);
} 
 
void loop() {
  radio.formatFrequency(s, sizeof(s));
 
  if(start==0){radio.setBandFrequency(FIX_BAND, f);delay(400);radio.getRadioInfo(&info);start=1;}
  if(digitalRead(12)==HIGH){menu++;lcd.clear();time=millis();radio.getRadioInfo(&info);start=0;w=1;delay(300);if(menu>3){menu=0;}}
 
   if(menu==0){// ГРОМКОСТЬ
   if(digitalRead(11)==HIGH){vol++;if(vol>15){vol=15;}w=1;time=millis();radio.setVolume(vol);delay(200);lcd.clear();}
   if(digitalRead(10)==HIGH){vol--;if(vol>16){vol=0;}w=1;time=millis();radio.setVolume(vol);delay(200);lcd.clear();}
    lcd.setCursor(0,0);lcd.print("   ");lcd.print(s);
    lcd.setCursor(0,1);
  if(millis()-time<5000){for(z=0;z<=vol;z++){lcd.setCursor(z,1);lcd.write((uint8_t)0);}}
  if(millis()-time>5000 and millis()-time<10000){
    lcd.print(info.tuned  ? "  TUNED"  : "  -----");
    lcd.print(info.stereo ? " STEREO  " : "  MONO   ");}
  if(millis()-time>10000){radio.checkRDS();}  // RDS
   }
 
   if(menu==1){// КАНАЛЫ
       if(start1==0){f=f_scan[k];start=0;start1=1;}
    if(digitalRead(11)==HIGH){k++;if(k>9){k=9;}delay(200);f=f_scan[k];w=1;time=millis();start=0;lcd.clear();}
    if(digitalRead(10)==HIGH){k--;if(k<0){k=0;}delay(200);f=f_scan[k];w=1;time=millis();start=0;lcd.clear();}
      lcd.setCursor(0,0);lcd.print("K");lcd.print(k);
    if(f_scan[k]!=0){lcd.print(" ");lcd.print((float)f_scan[k]/100);lcd.print(" MHz   ");}else{lcd.print(" N/A            ");}
      radio.getRadioInfo(&info);
      lcd.setCursor(0,1);lcd.print(info.tuned  ? "TUNED"  : "-----");
      lcd.print("  SIGNAL ");lcd.print(info.rssi);
   }   
 
    if(menu==2){// АВТО ПОИСК КАНАЛОВ
      lcd.setCursor(0,0);lcd.print("AUTOSCAN");  
    if(digitalRead(11)==HIGH || digitalRead(10)==HIGH){
    for(int i=0;i<10;i++){
    for(i1;i1<=10800;i1=i1+10){
      radio.setBandFrequency(FIX_BAND, i1);delay(300);
      radio.getRadioInfo(&info);delay(500);
    if(info.tuned==1 and info.rssi>26){f_scan[i]=i1;i1=f_scan[i]+10;if(i1>=10800){f_scan[i]=0;}break;} 
      lcd.setCursor(9,0); lcd.print((float)i1/100);
  }
 lcd.setCursor(0,1);lcd.print(i);lcd.print(" ");lcd.print((float)f_scan[i]/100);lcd.print(" MHz   ");
  }delay(1000);time=millis();i1=8700;eeprom();k=0;start1=0;menu=1;}}   
 
 
  if(menu==3){// ПОДСТРОЙКА ЧАСТОТЫ КАНАЛА
    if(digitalRead(11)==HIGH){f=f+10;t=1;if(f<8700){f=8700;}start=0;time=millis();delay(200);lcd.clear();}
    if(digitalRead(10)==HIGH){f=f-10;t=1;if(f>10800){f=10800;}start=0;time=millis();delay(200);lcd.clear();}
    lcd.setCursor(0,0);lcd.print("<  ");lcd.print((float)f/100);lcd.print(" MHz  >");
    radio.getRadioInfo(&info);
    lcd.setCursor(0,1);lcd.print(info.tuned  ? "TUNED"  : "-----");
    lcd.print("  SIGNAL ");lcd.print(info.rssi);
    if(millis()-time>10000 and t==1){f_scan[k]=f;t=0;EEPROM.update(10+k,f_scan[k]/100);EEPROM.update(100+k,f_scan[k]-(f_scan[k]/100)*100);
    if(millis()-time<11000){lcd.setCursor(0,1);lcd.print("      SAVE      ");delay(1000);}}
  }
 
 if(millis()-time>60000 && w==1){EEPROM.update(0,vol);EEPROM.update(3,k);EEPROM.update(1,f_scan[k]/100);EEPROM.update(2,f_scan[k]-(f_scan[k]/100)*100);w=0;}
 if(millis()-time>10000 and menu==1){menu=0;time=millis();lcd.clear();}
 
} // LOOP
 
void eeprom(){for(int b=0;b<10;b++){EEPROM.update(10+b,f_scan[b]/100);EEPROM.update(100+b,f_scan[b]-(f_scan[b]/100)*100);}}

Библиотека Radio — https://github.com/mathertel/Radio


Материалы присланные пользователями сайта 

RDA5807wLCD1602mod.ino

Автор — Daniel VE7LCG


Дополнительные материалы:

Comments

  1. доброго
    прошу помочь, скачал прошивку с этой страницы, скачал архив радио
    пытаюсь скомпилировать скетчь, выдает ошибку в строке
    rds.attachServicenNameCallback(DisplayServiceName);

    C:\Users\мичман\Desktop\радио\RDA5807wLCD1602mod.ino_\RDA5807wLCD1602mod\RDA5807wLCD1602mod.ino: In function ‘void setup()’:
    RDA5807wLCD1602mod:39:7: error: ‘class RDSParser’ has no member named ‘attachServicenNameCallback’; did you mean ‘attachServiceNameCallback’?
    exit status 1
    ‘class RDSParser’ has no member named ‘attachServicenNameCallback’; did you mean ‘attachServiceNameCallback’?

    что сделать чтобы заработало?

  2. спасибо, скачал, закинул
    теперь пишет вот такое
    In file included from C:\Users\мичман\Desktop\радио\RDA5807wLCD1602mod.ino_\RDA5807wLCD1602mod\RDA5807wLCD1602mod.ino:2:0:
    C:\Users\������\Documents\Arduino\libraries\radio/radio.h:116:1: warning: ‘typedef’ was ignored in this declaration
    typedef struct RADIO_INFO {
    ^~~~~~~
    C:\Users\������\Documents\Arduino\libraries\radio/radio.h:128:1: warning: ‘typedef’ was ignored in this declaration
    typedef struct AUDIO_INFO {
    ^~~~~~~
    In file included from C:\Users\������\Documents\Arduino\libraries\radio\RDA5807M.cpp:21:0:
    C:\Users\������\Documents\Arduino\libraries\radio/radio.h:116:1: warning: ‘typedef’ was ignored in this declaration
    typedef struct RADIO_INFO {
    ^~~~~~~
    C:\Users\������\Documents\Arduino\libraries\radio/radio.h:128:1: warning: ‘typedef’ was ignored in this declaration
    typedef struct AUDIO_INFO {
    ^~~~~~~
    это не все, там раза в четыре больше подобного.

  3. у меня 1.8.19 на виндовс 7
    в конце пишет что компиляция завершина
    и
    ^~~~~~~
    Скетч использует 14206 байт (46%) памяти устройства. Всего доступно 30720 байт.
    Глобальные переменные используют 1179 байт (57%) динамической памяти, оставляя 869 байт для локальных переменных. Максимум: 2048 байт.

    но смущает то что написано красным

Добавить комментарий

Войти с помощью: