Очередная конструкция, с применением цифрового модуля радиоприемника RDA5807 в связке с платформой ARDUINO, но в этот раз наш приемник будет полностью управляться с компьютера с помощью специальной программы.
Программа позволяет регулировать громкость приемника, ручную и автоматическую перестройку частоты, а также отображение текущей частоты принимаемого сигнала.
Чтобы начать работу необходимо подключить модуль к ардуино согласно схемы.
Для подключения наушников на понадобиться собрать еще одну маленькую схемку.
и загрузить в ардуино скетч.
#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();
}
На этом с аппаратной частью мы закончили, теперь нужно запустить программу для компьютера, через несколько секунд, программа определит к какому порту подключена плата arduino, и считает с нее данные о состоянии приемника, после чего можно запускать сканирование и радоваться работающему устройству.
Видео работы я записывать не стал но если кому то нужно пишите в комментариях что то запишу.