Простое FM — радио (Arduino)

На странице http://rcl-radio.ru/?p=53162 был показан пример создания FM — радио в котором использовался радио модуль RRD_102v 2.0 на чипе RDA5807M совместно с ИК-модуля VS1838B. На этой странице будет рассмотрен пример создания очень просто FM — радио который основан на тех же модулях и дополнительно применен миниатюрный усилитель на PAM8403 класса D. Особенность FM — радио в том, что он не имеет индикатора и кнопок, все управление осуществляется при помощи ИК — пульта, а частоты станций заранее указаны в скетче. Пульт позволяет переключать станции (10 каналов) при помощи кнопок 0-9 и вверх и вниз, регулировка громкости кнопки вправо и влево, кнопка # — MUTE.

Технические характеристики ИК-модуля VS1838B:

  • Потребляемый ток: 0,5 мА
  • Рабочая частота: 38 КГц
  • Расстояние приема сигнала: 20 м
  • Эффективный угол приема сигнала: 90˚
  • Рабочее напряжение (приемник): 2,7 — 5,5 В
  • Рабочее напряжение (модуль): 2,7 — 5,5 В

Технические характеристики FM тюнера RDA5807m:

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

Технические характеристики усилителя PAM8403:

  • Напряжение питания: 2,5…5,5 В;
  • Ток потребления при отсутствии сигнала: 10 мА;
  • Выходная мощность при нагрузке 8 Ом: 1,5 Вт x2 канала;
  • Выходная мощность при нагрузке 4 Ом: 3,0 Вт x2 канала;
  • Разделение каналов: 60 дБ и более (при мощности 1 Вт и нагрузке 4 Ом);
  • Диапазон рабочих температур -40°C +85°C;
  • Встроенная защита от перегрева +120 °С;
  • Размеры устройства: ~21x18x3 мм;
  • Масса: 1,6 г.

 PAM8403

При сборке FM — радио следует учитывать, что радио модуль имеет напряжение питания 3,3 В которое снимается непосредственно с платы Arduino. Усилитель питается от напряжение 5В которое так же подается с платы Arduino.

На рисунке показано изображения пульта под команды которого написан скетч, но пульт можно применить другой, при этом коды кнопок будут соответственно другие. Даже если Вы будете использовать такой же пульт, то вероятней всего коды кнопок будут отличатся. Но в мониторе порта Вы сможете посмотреть коды кнопок и вписать в скетч свои значения.

Стоит обратить внимание на то, что в рассматриваемом пульте при удержании кнопки длительное время сначала следует код команды кнопки, а далее код 0xFFFFFFFF как код удержания нажатой кнопки, при этом код 0xFFFFFFFF подается при удержании любой кнопки. В других пультах для каждой кнопки код удержания кнопки может быть свой для каждой кнопки.

Значение громкости и номер канала сохраняются в энергонезависимой памяти если в течении 1 минуты ИК пульт был не активен.

#include <IRremote.h>
#include <Wire.h>
#include <radio.h>
#include <RDA5807M.h>
#include <EEPROM.h>
#define FIX_BAND    RADIO_BAND_FM   
IRrecv irrecv(9); // указываем вывод модуля IR приемника
decode_results ir;
RDA5807M radio; 
 
int i;
byte vol,g1,g2,mute,gk1,gk2,w,start;
long f;
//////////////////////////// ЧАСТОТЫ СТАНЦИЙ 101.5 мГЦ = 10510 /////////////
int k[10]={10100,10190,10300,10350,10390,10440,10620,10680,10730,10780};
////////////////////////////////////////////////////////////////////////////
unsigned long time;
float f_f;
 
void setup() {
  vol=EEPROM.read(0);
  i=EEPROM.read(0);
  f=EEPROM.read(1)*100+EEPROM.read(2);
  Serial.begin(9600);
  irrecv.enableIRIn(); // запускаем модуль IR
  radio.init();
  radio.debugEnable();
  radio.setBandFrequency(FIX_BAND, f);
  radio.setVolume(vol);
  radio.setMono(false);// true - MONO
  radio.setMute(mute);
delay(400);
} 
 
void loop() {
  if(start==0){radio.setBandFrequency(FIX_BAND, f);delay(400);start=1;}
  if ( irrecv.decode( &ir )) {delay(200);Serial.print("0x");Serial.println( ir.value,HEX);irrecv.resume();}// IR приемник
 
///////////////////////////////// ГРОМКОСТЬ ///////////////////////////////////////////////////////
   kan();
   if(ir.value==0xFF5AA5){vol++;g1=1;g2=0;if(vol>15){vol=15;}radio.setVolume(vol);cl1();}// кнопка > 0xFF5AA5
   if(ir.value==0xFFFFFFFF and g1==1){vol++;g2=0;if(vol>15){vol=15;}radio.setVolume(vol);cl1();}// кнопка >>>>>>
   if(ir.value==0xFF10EF){vol--;g1=0;g2=1;if(vol>16){vol=0;}radio.setVolume(vol);cl1();}// кнопка < 0xFF10EF
   if(ir.value==0xFFFFFFFF and g2==1){vol--;g1=0;if(vol>16){vol=0;}radio.setVolume(vol);cl1();}// кнопка <<<<<<
 
////////////////////////////////// КАНАЛЫ //////////////////////////////////////////////////////////
    if(ir.value==0xFF18E7){i++;gk1=1;gk2=0;if(i>9){i=9;}f=k[i];info();cl();}// кнопка вверх 0xFF18E7
    if(ir.value==0xFFFFFFFF and gk1==1){i++;gk2=0;if(i>9){i=9;}f=k[i];info();cl();}// кнопка вверх >>>>>>
    if(ir.value==0xFF4AB5){i--;gk1=0;gk2=1;if(i<0){i=0;}f=k[i];info();cl();}// кнопка вниз 0xFF4AB5
    if(ir.value==0xFFFFFFFF and gk2==1){i--;gk1=0;if(i>9){i=9;}f=k[i];info();cl();}// кнопка вниз <<<<<<
 
////////////////////////////////// EEPROM /////////////////////////////////////////////////////////
 if(millis()-time>60000 && w==1){EEPROM.update(0,vol);EEPROM.update(3,i);EEPROM.update(1,k[i]/100);EEPROM.update(2,k[i]-(k[i]/100)*100);w=0;}
 
//////////////////////////////// ГРОМКОСТЬ НА МИНИМУМ ////////////////////////////////////////////
if(ir.value==0xFFB04F){ir.value=0;time=millis();vol=0;}// кнопка # 0xFFB04F
 
///////////////////////////////////// MUTE /////////////////////////////////////////////////////////
   if(ir.value==0xFF6897){mute++;ir.value=0;delay(200);// кнопка * 0xFF6897
   if(mute>1){mute=0;start=0;time=millis();}
   if(mute==1){radio.setMute(mute);}}
 
} // LOOP
 
void kan1(){ir.value=0;delay(200);f=k[i];w=1;time=millis();start=0;}
void cl(){ir.value=0;time=millis();start=0;w=1;delay(200);}
void cl1(){ir.value=0;time=millis();w=1;delay(200);}
void info(){ Serial.print("canal: ");Serial.print(i);Serial.print("  ");f_f=f;Serial.println(f_f/100);}
void kan(){
   if(ir.value==0xFF9867){i=0;kan1();}// канал 0 кнопка 0 0xFF9867
   if(ir.value==0xFFA25D){i=1;kan1();}// канал 1 кнопка 1 0xFFA25D
   if(ir.value==0xFF629D){i=2;kan1();}// канал 2 кнопка 2 0xFF629D
   if(ir.value==0xFFE21D){i=3;kan1();}// канал 3 кнопка 3 0xFFE21D
   if(ir.value==0xFF22DD){i=4;kan1();}// канал 4 кнопка 4 0xFF22DD
   if(ir.value==0xFF02FD){i=5;kan1();}// канал 5 кнопка 5 0xFF02FD
   if(ir.value==0xFFC23D){i=6;kan1();}// канал 6 кнопка 6 0xFFC23D
   if(ir.value==0xFFE01F){i=7;kan1();}// канал 7 кнопка 7 0xFFE01F
   if(ir.value==0xFFA857){i=8;kan1();}// канал 8 кнопка 8 0xFFA857
   if(ir.value==0xFF906F){i=9;kan1();}// канал 9 кнопка 9 0xFF906F
}

Монитор порта

Главной целью создания этого примера была миниатюризация уст-ва, с сохранением минимального функционала. На данном примере я собрал простое радио, для этого взял ненужную маленькую колоночку с динамиком 5 Вт 4 Ом в которую я разместил плату Arduino и все необходимые модули, в итоге получился компактный радиоприемник (моно).

В корпусе колонки на задней стенке сделано отверстие под USB порт Arduino и выведена антенна (кусок проволоки длиной 30 см), в передней части колонки размещен ИК датчик.

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

Библиотека IRremote — IRremote

Start here

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

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