Подключение RDA5807M к Arduino

27-02-2020, 15:47 2 комментариев
FM радио модуль стерео RDA5807M для Ардуино - отличное решение для создателей интересных проектов, в которых понадобится FM-радиоприемник. Модуль имеет ряд преимуществ, которые выделяют его среди аналогов, да и мы именно потому им заинтересовались. Например, он легок в сборке, доступен по стоимости, практичен и достаточно функционален. В подтверждение последней характеристики отметим – устройство способно принимать станции на ультракоротких волнах, а также поддерживает различные полосы частот.
Если говорить о сфере применения, FM-модуль пригодится для применения в смартфонах ∕ планшетах ∕ ноутбуках, автомагнитолах, MP3 и MP4 аудио плеерах.

Об остальных технических параметрах расскажем коротко:
  • напряжение питания: 1.8 — 3.3 V;
  • потребление тока в рабочем режиме: до 21 мА;
  • -- в спящем режиме: 5мкА;
  • тип шины: цифровой I2C;
  • имеется индикатор уровня принимаемого сигнала + регулировка громкости;
  • автопоиск станций;
  • подавление шума + функция mute;
  • настраиваемые шаги между каналами;
  • рабочая температура: от -20 до +75 градусов Цельсия.
Распиновку выводов датчика можно посмотреть на скриншоте:

Подключение RDA5807M к Arduino

Нам понадобятся такие компоненты как: плата расширения Arduino Uno, модуль RDA5807M, соединительные провода, антенна.
Используем следующую принципиальную схему сборки:

Для подключения наушников изменяем электрическую схему:

Напишем скетч (нам понадобится библиотека Wire для работы с интерфейсом):
#include <Wire.h>
#define DEBUG 0

int volumen=8,volumenOld=7;
int frecuencia,frecuenciaOld;

unsigned int z,z1;
byte xfrecu,xfrecuOld;
unsigned int estado[6];

int time,time1;

// int    RDA5807_adrs=0x10;       // I2C-Address RDA Chip for sequential  Access
// int    RDA5807_adrr=0x11;       // I2C-Address RDA Chip for random      Access
// int    RDA5807_adrt=0x60;       // I2C-Address RDA Chip for TEA5767like Access

char buffer[30];
unsigned int RDS[4];
char seg_RDS[8];
char seg_RDS1[64];
char indexRDS1;

char hora,minuto,grupo,versio;
unsigned long julian;

int mezcla;

char entrada[100];
int contador;
boolean stringComplete = true;

void setup() 
{
  Wire.begin();   
  Serial.begin(9600);
  Serial.print("RADIO\n");
  Serial.print("RADIO\n"); 
   
   WriteReg(0x02,0xC00d); // write 0xC00d into Reg.2 ( soft reset, enable,RDS, )
   WriteReg(0x05,0x84d8);  // write ,0x84d8 into Reg.3 
     
   // frecuencia inicial
   frecuencia=165; //103.5
//  frecuencia=26; //89.6
  
  canal(frecuencia);
  clearRDS;
  time=time1=100;
}

void loop() 
{
  
  while (Serial.available())
    {
    char inChar = (char)Serial.read(); 
    entrada[contador]=inChar;  
    if (inChar == '\n')
        {
          stringComplete = true;
          entrada[contador]=0;
        } 
    contador++;  
    } 
    
    if (stringComplete) 
    { 
      if(!strncmp(entrada,"RADIO1=",7))
          {
            Serial.println("OK");
            goto salir0;
          }
      if(!strncmp(entrada,"buscar+",7))
          {  
           Serial.println("buscar+_OK");
           busqueda(0); 
           goto salir0;  
          }
      if(!strncmp(entrada,"buscar-",7))
          {   
           Serial.println("buscar-_OK");
           busqueda(1);
          goto salir0;   
          }
      if(!strncmp(entrada,"volume+",7))
          {  
           Serial.println("volume+_OK");
           volumen++;
           if(volumen>15)volumen=15;  
           goto salir0;
          }
      if(!strncmp(entrada,"volume-",7))
          {   
           Serial.println("volume-_OK");
           volumen--;
           if(volumen<0)volumen=0;   
           goto salir0;
          }
      if(!strncmp(entrada,"ncanal=",7))
          {   
           Serial.print("ncanalOK=");
           strcpy(buffer,entrada+7);
           z=atoi(buffer); Serial.println(z);  
           frecuencia=z;
           goto salir0;
          }
        if(!strncmp(entrada,"volume=",7))
          {   
           Serial.print("volumeOK=");
           strcpy(buffer,entrada+7);
           z=atoi(buffer); Serial.println(z);  
           volumen=z;
           if(volumen>15)volumen=15;
           if(volumen<0)volumen=0;
           goto salir0;
          }  
       Serial.print("ERROR "); Serial.println(entrada);
salir0:
      contador=0;
      stringComplete = false;
    }
  
   
    delay(1); time--; time1--;
    if(time<1)
      {
        time=30000;
        Visualizar(); 
      }
     
    if(time1<1)
      {
       time1=50;
       ReadEstado();       
       //RDS   
       if ((estado[0] & 0x8000)!=0) {get_RDS();}
      }
          
    //Cambio de frecuencia
    if( frecuencia!=frecuenciaOld)
          {  
            frecuenciaOld=frecuencia;                        
            Visualizar();
            canal(frecuencia);
            clearRDS();
         }     

    //Cambio de volumen        
    if(volumen!=volumenOld)
        { 
          volumenOld=volumen;
          sprintf(buffer,"Volumen=%02d",volumen); 
          Serial.println(buffer);
          WriteReg(5, 0x84D0 | volumen);
        }       
}

void visualPI(void)
{
      
}
void visualPTY(void)
{
  
}
void get_RDS()
{  
}

void busqueda(byte direc)
{
  byte i;
  if(!direc) WriteReg(0x02,0xC30d); else  WriteReg(0x02,0xC10d);
  
  for(i=0;i<10;i++)
    {
      delay(200);      
      ReadEstado();      
      if(estado[0]&0x4000)
        {
          //Serial.println("Emisora encontrada");
          frecuencia=estado[0] & 0x03ff;  
          break;
        }       
    }
}


void clearRDS(void)
{       
 
}

void Visualizar(void)
{ 
  z=870+frecuencia;
  sprintf(buffer,"Canal=%04i",frecuencia); Serial.println(buffer);  
  sprintf(buffer,"Frecuencia=%04i",z); Serial.println(buffer); 
}

void canal( int canal)
     {
       byte numeroH,numeroL;
       
       numeroH=  canal>>2;
       numeroL = ((canal&3)<<6 | 0x10); 
       Wire.beginTransmission(0x11);
       Wire.write(0x03);
         Wire.write(numeroH);                     // write frequency into bits 15:6, set tune bit         
         Wire.write(numeroL);
         Wire.endTransmission();
       }

//________________________ 
//RDA5807_adrr=0x11;       
// I2C-Address RDA Chip for random      Access
void WriteReg(byte reg,unsigned int valor)
{
  Wire.beginTransmission(0x11);
  Wire.write(reg); Wire.write(valor >> 8); Wire.write(valor & 0xFF);
  Wire.endTransmission();
  //delay(50);
}

//RDA5807_adrs=0x10;
// I2C-Address RDA Chip for sequential  Access
int ReadEstado()
{
 Wire.requestFrom(0x10, 12); 
 for (int i=0; i<6; i++) { estado[i] = 256*Wire.read ()+Wire.read(); }
 Wire.endTransmission();

}

//READ RDS  Direccion 0x11 for random access
void ReadW()
{
   Wire.beginTransmission(0x11);            // Device 0x11 for random access
   Wire.write(0x0C);                                // Start at Register 0x0C
   Wire.endTransmission(0);                         // restart condition
   Wire.requestFrom(0x11,8, 1);       // Retransmit device address with READ, followed by 8 bytes
   for (int i=0; i<4; i++) {RDS[i]=256*Wire.read()+Wire.read();}        // Read Data into Array of Unsigned Ints
   Wire.endTransmission();                  
 }
Управляется плата через последовательный порт. Открыть можно через меню Инструменты или при помощи сочетания клавиш Ctrl+Shift+M.

В целом модуль совсем неплох и несомненно пригодится для экспериментов многим «ардуинщикам». На этом мы прощаемся! Удачных вам проектов!
Поделись в социальных сетях:
О авторе
Калугин Антон

Программист микроконтроллеров с 8-ми летним стажем, работал в таких компаниях как IBM, ASUS, Microsoft.

В комментариях с радостью отвечу на ваши вопросы.

Все статьи автора
Похожие новости

Сегодня поговорим о том, как воплотить в жизнь подключение FPM10A к Arduino, что это за модуль, где используется, каковы параметры его работы и т.д. Речь идет...

GSM модуль NEOWAY M590 – один из самых простых и бюджетных контроллеров, с помощью которого можно совершать звонки, принимать ∕ отправлять SMS-сообщения, а...

Цель нашей сегодняшней статьи - рассказать вам о всех нюансах подключения цифрового датчика освещенности BH1750 к Arduino. Данный модуль достаточно...

Сегодня рассматриваем подключение VL53L0X к Ардуино, а также основные особенности этого устройства. Датчик выбран нами для обзора не случайно – он вполне...

Инструкция, скетчи и библиотеки для создания радиостанции на базе TEA5767 и Ардуино...

2 комментария
  1. Александр
    4 апреля 2021 11:47 Александр

    Схема ситается более современной, чем аналогичный по назначению модуль TEA5767 (с которым вроде бы имеет режим совместимости по командам)... по крайней мере, RDA5807M якобы более чувствительный. К недостаткам можно отнести разве что меньшее напряжение питания - при наличии на платах Ардуино отдельного стабилизатора 3,3 вольта вещь совершенно непринципиальная! Почему сначала описали не ТEA, а его, не вполне понятно... ?

    replyОтветить
  2. Евгеий
    27 марта 2024 21:08 Евгеий

    На сайте обсалютно позорные описания. И все программы сворованы из инета. Позор....

    replyОтветить
Оставить комментарий