FM приемник AR1010 (Arduino)

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;}    

Comments

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

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