Используя готовый радио модуль на ИМС 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. Для настройки каналов одновременно нажмите кнопки переключения каналов, при этом произойдет сброс всех частот каналов, далее нажимая + или — кнопки каналов настройте первый канал и нажмите + громкости для сохранения частоты канала, аналогично настраивают следующий канал.
При настройке каналов следует учитывать следующие нюансы: частота каждого следующего канала должна быть больше предыдущего канала (невозможно установить частоту следующего канала меньше предыдущего), при нажатии кнопки «минус громкость» происходит выход из настроек частоты каналов.
Библиотеки
#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 }