Радио на TEA5767 + PT2257 (Arduino)

Используя готовый радио модуль на ИМС TEA5767 и электронный регулятор громкости на  ИМС PT2257 на базе Arduino Nano можно сделать простое радио, но функционально FM-радио. Индикаторы уровня громкости и уровня сигнала, частота выбранного канала выводится на дисплей LCD1602 на базе контроллера HD44780.

Управление FM — радио  осуществляется при помощи 4-х кнопок:

  • Канал +
  • Канал —
  • Громкость +
  • Громкость —

Технические параметры радио модуля TEA5767 (описание):

  • Напряжение питания от 2,5 до  5 В
  • Потребляемый ток при Uпит = 5 В 12,8 мА
  • Чувствительность 2 мкВ
  • Отношение сигнал/шум  54 дБ
  • Разделение между стереоканалами 24 дБ
  • Коэффициент гармоник 0,4 %
  • Диапазон принимаемых частот от 76 МГц до 108 МГц
  • Шины управления: I2C или 3-х проводная
  • Функция автоматической настройки на принимаемые радиостанции
  • Автоматическое стереодекодирование принятого сигнала

Основные характеристики регулятора громкости на ИМС PT2257 (описание):

  • Напряжение питания от 3 до 9 В
  • Регулировка громкости от -79 до 0 дБ
  • Раздельная для каждого канала регулировка громкости
  • Режим MUTE
  • КНИ при выходном напряжении 200 мВ не превышает 0,003% при входном напряжении 2 В КНИ не более 0,07%

Основные характеристики усилителя PAM8403 (описание):

  • Напряжение питания: 2,5…5,5 В
  • Ток потребления при отсутствии сигнала: 10 мА
  • Выходная мощность при нагрузке 8 Ом: 1,5 Вт x2 канала
  • Выходная мощность при нагрузке 4 Ом: 3,0 Вт x2 канала
  • Разделение каналов: 60 дБ и более (при мощности 1 Вт и нагрузке 4 Ом)

FM — радио имеет следующие функциональные возможности:

  • Регулировка громкости
  • MUTE
  • Переключение заранее настроенных каналов (10 каналов)
  • Ручной поиск станции с сохранением частоты  канала
  • Сохранение уровня громкости и всех частот каналов в энергонезависимой памяти

Управление FM — радио достаточно простое, кнопки регулировки громкости помимо прямого назначения участвуют в режиме ручного сканирования частоты и активируют режим MUTE. Режим MUTE активируется одновременным нажатием кнопок громкости, при нажатии на любую кнопку  регулировки громкости режим MUTE отключается.

Кнопки переключения каналов позволяют переключать заранее настроенные каналы от 0 до 9. Для настройки каналов одновременно нажмите кнопки переключения каналов, при этом произойдет сброс всех частот каналов, далее нажимая + или — кнопки каналов настройте первый канал и нажмите + громкости для сохранения частоты канала, аналогично настраивают следующий канал.

При настройке каналов следует учитывать следующие нюансы: частота каждого следующего канала должна быть больше предыдущего канала (невозможно установить частоту следующего канала меньше предыдущего), при нажатии кнопки «минус громкость» происходит выход из настроек частоты каналов.

Библиотеки

PT2257.zip

TEA5767.zip

#include <PT2257.h>
#include <TEA5767.h>
#include <EEPROM.h>
#include <Wire.h>
#include <LiquidCrystal.h>
  PT2257 rt;
  TEA5767 Radio;
   LiquidCrystal lcd(7, 6, 2, 3, 4, 5);// RS,E,D4,D5,D6,D7 подключение LCD
   byte a1[8]={0b00000,0b11011,0b11011,0b11011,0b11011,0b11011,0b11011,0b00000};
   byte a2[8]={0b00000,0b11000,0b11000,0b11000,0b11000,0b11000,0b11000,0b00000};
   byte b1[8]={0b00000,0b00000,0b11011,0b11011,0b11011,0b11011,0b00000,0b00000};
   byte b2[8]={0b00000,0b00000,0b11000,0b11000,0b11000,0b11000,0b00000,0b00000};
 
  float f_new=104.4,f;
  int kanal[10];
  unsigned char buf[5];unsigned long time,t1;
  int stereo,signal_level,stat,vol,volume,vol_d,z,w,signal,scan,x,w1,sbros,i;
 
void setup(){
     Wire.begin();Serial.begin(9600);
     vol = EEPROM.read(0);volume=vol;
     x = EEPROM.read(100);
     kanal[0]=EEPROM.read(1)*256+EEPROM.read(2);
     kanal[1]=EEPROM.read(3)*256+EEPROM.read(4);
     kanal[2]=EEPROM.read(5)*256+EEPROM.read(6);
     kanal[3]=EEPROM.read(7)*256+EEPROM.read(8);
     kanal[4]=EEPROM.read(9)*256+EEPROM.read(10);
     kanal[5]=EEPROM.read(11)*256+EEPROM.read(12);
     kanal[6]=EEPROM.read(13)*256+EEPROM.read(14);
     kanal[7]=EEPROM.read(15)*256+EEPROM.read(16);
     kanal[8]=EEPROM.read(17)*256+EEPROM.read(18);
     kanal[9]=EEPROM.read(19)*256+EEPROM.read(20);
     f_new=(float)kanal[x]/10;
     pinMode(12,INPUT);// минус гром
     pinMode(11,INPUT);// плюс гром
     pinMode(10,INPUT);// минус F
     pinMode(9,INPUT);// плюс F
     lcd.begin(16, 2);lcd.createChar(0,a1); lcd.createChar(1,a2);lcd.createChar(2,b1); lcd.createChar(3,b2);   
     Radio.init();Radio.set_frequency(f_new); 
     audio();
}
 
void loop(){
    stat = Radio.read_status(buf);
    stereo = Radio.stereo(buf);
    signal_level = Radio.signal_level(buf);
 
 
    if(volume>0){lcd.setCursor(1,0);lcd.print("K");lcd.print(x);
  lcd.setCursor(5,0);lcd.print(f_new);lcd.setCursor(12,0);lcd.print("MHz");}
 
    if(w==0&&volume>0||scan==1){
    lcd.setCursor(0,1);
    if(stereo==1){lcd.print("STEREO");}else{lcd.print(" MONO ");}
 
    if(signal_level>=0){for(z=0;z<=signal_level-8;z++){lcd.setCursor(z+8,1);lcd.write((uint8_t)2);}}
    if((signal_level)%2==0){lcd.setCursor(z+8,1);lcd.write((uint8_t)3);}
    //delay(50);lcd.clear();
    }
 //////////////// volume /////////////////////////////////
    if(digitalRead(11)==HIGH&&digitalRead(12)==LOW&&scan==0){vol++;if(vol>79){vol=79;}volume=vol;audio();cl();times();w1=1;}
    if(digitalRead(12)==HIGH&&digitalRead(11)==LOW&&scan==0){vol--;if(vol<0){vol=0;}volume=vol;audio();cl();times();w1=1;}
   if(w==1&&volume>0&&scan==0){
    lcd.setCursor(0,1);
    vol_d=vol-48;
    if(vol_d>=0){for(z=0;z<=vol_d;z++){lcd.setCursor(z/2,1);lcd.write((uint8_t)0);}}
    if((vol_d)%2==0){lcd.setCursor(z/2,1);lcd.write((uint8_t)1);}
   }
    if(digitalRead(11)==HIGH&&digitalRead(12)==HIGH){volume=0;audio();cl();}
    if(volume==0){lcd.setCursor(0,0);lcd.print("      MUTE      ");}
/////////////////////////////////////////////////////////
 
///////////////////////// f //////////////////////////////////////////////////////////////////////////////////
    if(scan==0){
    if(digitalRead(9)==HIGH&&digitalRead(10)==HIGH){scan=1;x=0;w1=1;cl();} /// вкл сканирования
    if(digitalRead(9)==HIGH&&digitalRead(10)==LOW){x++;if(x>9){x=9;}f_new=(float)kanal[x]/10;Radio.set_frequency(f_new);cl();} // перекл. каналов
    if(digitalRead(10)==HIGH&&digitalRead(9)==LOW){x--;if(x<0){x=0;}f_new=(float)kanal[x]/10;Radio.set_frequency(f_new);cl();} // перекл. каналов
    }
 
    if(scan==1){lcd.setCursor(0,0);lcd.print("S");
 
    sbros++;
    if(sbros==1){for(i=0;i<=9;i++){kanal[i]=760;}}
 
    Serial.println(kanal[x]);
    f=(float)kanal[x];f_new=(f/10);
    Serial.println(kanal[x]);
    if(digitalRead(9)==HIGH&&digitalRead(10)==LOW){f_new=f_new+0.1;if(f_new>108){f_new=108;}cl();w1=1;}
    if(digitalRead(10)==HIGH&&digitalRead(9)==LOW){f_new=f_new-0.1;if(f_new<76) {f_new=76; }cl();w1=1;}
    Serial.println(kanal[x]);
    if(w1==1){Radio.set_frequency(f_new);w1=0;}
    if(kanal[x]<760){f_new=76;}
    if(x>0){
    if(kanal[x]<kanal[x-1]){f_new=(float)kanal[x-1]/10+0.1;}
    }
    kanal[x]=round(f_new*10);
 
    if(digitalRead(11)==HIGH&&digitalRead(12)==LOW){x++;lcd.setCursor(0,1);
  lcd.print("      SAVE      ");delay(1000);w1=1;cl();if(x>9){x=9;scan=0;cl();times();sbros=0;}}
    if(digitalRead(12)==HIGH&&digitalRead(11)==LOW){scan=0;cl();times();sbros=0;}
}
 
 if(millis()-time>3000 && w==1){
     EEPROM.update(0,vol);
     EEPROM.update(1,highByte(kanal[0]));EEPROM.update(2,lowByte(kanal[0]));
     EEPROM.update(3,highByte(kanal[1]));EEPROM.update(4,lowByte(kanal[1]));
     EEPROM.update(5,highByte(kanal[2]));EEPROM.update(6,lowByte(kanal[2]));
     EEPROM.update(7,highByte(kanal[3]));EEPROM.update(8,lowByte(kanal[3]));
     EEPROM.update(9,highByte(kanal[4]));EEPROM.update(10,lowByte(kanal[4]));
     EEPROM.update(11,highByte(kanal[5]));EEPROM.update(12,lowByte(kanal[5]));
     EEPROM.update(13,highByte(kanal[6]));EEPROM.update(14,lowByte(kanal[6]));
     EEPROM.update(15,highByte(kanal[7]));EEPROM.update(16,lowByte(kanal[7]));
     EEPROM.update(17,highByte(kanal[8]));EEPROM.update(18,lowByte(kanal[8]));
     EEPROM.update(19,highByte(kanal[9]));EEPROM.update(20,lowByte(kanal[9]));
     EEPROM.update(100,x);
     w=0;lcd.clear();
   }
}// loop
 
void cl(){delay(200);lcd.clear();}
 
void times(){time=millis();w=1;}
 
void audio(){
  rt.setLeft(volume); // int 0...79 
  rt.setRight(volume);// int 0...79
  rt.setMute(0);  // int 0...1
}

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

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