FM радиоприёмника основан на ИМС Airoha AR1010 и выполнен в виде модуля. Дополнительно к модулю подключают несколько элементов, схема приемника показана на рисунке:
К плате подключается антенна (50 Ом), стерео сигнал выводится непосредственно на наушники или усилитель.
Основные характеристики FM приемника:
- Частотный диапазон от 76 до 108 МГц
- Питание от 2,5 до 3,6 В (рекомендованное напряжение питания 3 В)
- Максимальная выходная мощность 115 мВт (на частоте 1 кГц)
- Разделение каналов 30 дБ,
- Сигнал шум 60 дБ.
- Ток потребления, типовой 14 мА.
- Ток в режиме ожидания 1 мкА.
- Управление цифровое I2C
- Частота кварца — 32.768 кГц
Ниже показан тестовый скетч запуска радиоприемника, скетч основан на библиотеке AR1010lib , которую пришлось немного изменить (библиотека не была совместима с новыми версиями Arduino IDE) — AR1010lib.zip.
#include <Wire.h> #include <ar1010lib.h> // http://rcl-radio.ru/wp-content/uploads/2021/12/AR1010lib.zip AR1010 radio; void setup(){ Serial.begin(9600);Wire.begin(); radio.initialise(); delay(1000); radio.setSeekThreshold(0);// 0...16 radio.setFrequency(1019); radio.setVolume(10);// 0...18 Serial.println(radio.frequency()); radio.setHardmute(1); // mute on delay(2000); radio.setHardmute(0); // mute off } void loop(){ char c; if (Serial.available() > 0) { c = Serial.read(); // u - up, d - down Serial.println(c); radio.seek(c); Serial.println(radio.frequency()); delay(200); } }
Функции библиотеки:
- radio.initialise() — инициляция AR1010
- radio.setSeekThreshold() — изменение порога чувствительности при авто-поиске станции, можно задать значение от 0 до 16
- radio.setFrequency(1019) — установка частоты приемника (1019 = 101,9 МГц)
- radio.setVolume() — изменение громкости, можно задать значение от 0 до 18
- radio.setHardmute() — функция активации режима MUTE (1 — MUTE ON, 0 — MUTE OFF)
- radio.seek() — функция автоматического поиска станции:
- radio.seek(«u») — поиск станции с увеличением частоты
- radio.seek(«d») — поиск станции с уменьшением частоты
- radio.frequency() — функция чтения текущей частоты настройки станции
FM приемник AR1010
Настройка частоты | Регулировка громкости | Режим MUTE |
Используя дисплей 0.54″ 14-segment LED HT16K33 (описание), энкодер и одну кнопку, можно собрать простой FM приемник.
Настройка частоты принимаемой станции и регулировка громкости осуществляется при помощи энкодера, нажатие на кнопку энкодера меняет режимы настройки частоты и регулировку громкости, тактовая кнопка активирует режим MUTE.
Частота и уровень громкости сохраняются в энергонезависимой памяти (через 10 секунд после изменения параметра).
#include <Wire.h> #include <ar1010lib.h> // http://rcl-radio.ru/wp-content/uploads/2021/12/AR1010lib.zip #include <4x14LED.h> // http://rcl-radio.ru/wp-content/uploads/2021/09/4x14LED.zip #include <Encoder.h> // http://rcl-radio.ru/wp-content/uploads/2019/05/Encoder.zip #include <EEPROM.h> #include <MsTimer2.h> // http://rcl-radio.ru/wp-content/uploads/2018/11/MsTimer2.zip HT4x14LED led; AR1010 radio; Encoder myEnc(8, 9);// DT, CLK unsigned long times,oldPosition = -999,newPosition; int frec,vol,reg,mute; bool w; void setup(){ Serial.begin(9600);Wire.begin(); led.init(1);led.brig(1);led.blink(1);led.clear(); pinMode(10,INPUT);// encoder SW pinMode(2,INPUT_PULLUP);// MUTE button MsTimer2::set(1, to_Timer);MsTimer2::start(); if(EEPROM.read(100)!=0){for(int i=0;i<101;i++){EEPROM.update(i,0);}}// очистка памяти при первом включении frec = EEPROM.read(0)*10+EEPROM.read(1); vol = EEPROM.read(2); frec_func();vol_func(); radio.initialise(); radio.setFrequency(frec); radio.setSeekThreshold(0);// 0...16 radio.setVolume(vol);// 0...18 Serial.println(radio.frequency()); } void loop(){ if(digitalRead(10)==LOW){reg++;if(reg>1){reg=0;}delay(300);} if(digitalRead(2)==LOW){mute++;if(mute>1){mute=0;}delay(300);} if(reg==0&&mute!=1){ if(frec>999){led.print(frec, 3, -1,-1,-1,-1);} else{led.print(frec, 3, 0,-1,-1,-1);} if (newPosition != oldPosition){oldPosition = newPosition;frec=frec+newPosition;myEnc.write(0);newPosition=0;times=millis();w=1;frec_func(); radio.setFrequency(frec); delay(50); }} if(reg==1&&mute!=1){ led.print(vol*10, 0, 0xc0,-1,-1,0xc0); if (newPosition != oldPosition){oldPosition = newPosition;vol=vol+newPosition;myEnc.write(0);newPosition=0;times=millis();w=1;vol_func(); radio.setVolume(vol); delay(50); }} if(mute==1){radio.setHardmute(1);led.print(0, 0, 0x536,0x3e,0x1201,0x79);} else{radio.setHardmute(0);} if(millis()-times>10000 && w==1){ EEPROM.update(0,frec/10);EEPROM.update(1,frec%10);EEPROM.update(2,vol); w=0;led.print(0, 0, 0x18d,0xf7,0xc30,0x79);delay(500);} } void frec_func(){if(frec<760){frec=760;}if(frec>1080){frec=1080;}} void vol_func(){if(vol<0){vol=0;}if(vol>18){vol=18;}} void to_Timer(){newPosition = myEnc.read()/4;}
Привет. Собрал на макете. Как шаг настройки сделать 50 кгц а не 100 ?