На странице 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