цифровая электроника
вычислительная техника
встраиваемые системы

 

FM-радио своими руками на основе Arduino и RDA5807

Автор: Mike(admin) от 13-01-2020, 21:55

Сегодня почти все используют свои мобильные телефоны для прослушивания музыки, новостей, подкастов и т. д. Но не так давно мы все зависели от местных FM-радиоприемников, чтобы получать последние новости и слушать песни, постепенно эти радио теряют популярность, но в чрезвычайных ситуациях радиостанции играют важную роль в передаче информации пользователям. Радиосигналы всегда присутствуют в эфире (которые транслируются станциями), и все, что нам нужно, это схема FM-приемника, чтобы улавливать эти радиосигналы и транслировать их в аудиосигналы.


FM-радио своими руками на основе Arduino и RDA5807

В этом примере мы собираемся создать FM-приемник на основе Arduino. Мы будем использовать микросхему FM-приемника RDA5807 с Arduino и запрограммируем ее так, чтобы воспроизводить сигналы любой FM-радиостанции, которая может быть настроена пользователем с помощью потенциометра. Мы также будем использовать усилитель звука вместе со схемой для управления выходной громкостью нашего радио FM Arduino.


Начнем с теории. Радиостанции преобразуют электрические сигналы в радиосигналы, и эти сигналы должны быть модулированы перед передачей через антенну. Есть два метода, в которых сигнал может быть модулирован, а именно AM и FM. Как следует из названия, амплитудная модуляция (AM) модулирует амплитуду перед передачей сигнала, тогда как в частотной модуляции (FM) частота сигнала модулируется перед передачей через антенну. На радиостанциях используют частотную модуляцию для модуляции сигнала, а затем передают данные. Теперь все, что нам нужно – это приемник, который можно настраивать на определенные частоты и получать эти сигналы, а затем преобразовывать эти электрические сигналы в аудиосигналы. В этом проекте мы собираемся использовать модуль FM-приемника RDA5807, что упрощает нашу схему.


RDA5807 представляет собой однокристальный модуль FM-радио-тюнера с полностью интегрированным синтезатором. Модуль поддерживает полосу частот 50–115 МГц, регулировку громкости и приглушение звука, индикатор уровня принимаемого сигнала и SNR, кварцевый генератор 32,768 кГц, цифровую автоматическую регулировку усиления и т. д. На следующем рисунке представлена структурная схема тюнера RDA5807M.


RDA5807M

Он имеет цифровую архитектуру с низкой ПЧ и имеет интегрированный малошумящий усилитель (LNA), который поддерживает диапазон FM-вещания (от 50 до 115 МГц), программируемую регулировку усиления (PGA), аналого-цифровой преобразователь высокого разрешения и высококачественные цифро-аналоговые преобразователи (ЦАП). Ограничитель предотвращает перегрузку и ограничивает количество продуктов интермодуляции, создаваемых соседними каналами. PGA усиливает выходной сигнал микшера и затем оцифровывает сигнал с помощью АЦП. Ядро DSP управляет выбором канала, FM-демодуляцией, стереофоническим MPX-декодером и выходным аудиосигналом. Схема контактов RDA5807 приведена далее.


RDA5807M

Модуль работает от источника питания 1,8 - 3,3 В. При переходе в состояние покоя и выборе интерфейса управления модуль сбрасывает себя при включении питания VIO, а также поддерживает плавный сброс с помощью триггера с 0 до 1 адреса 02H. Модуль использует связь I2C для связи с микроконтроллером, и интерфейс начинается с условия запуска, байта команды и байтов данных. RDA5807 имеет 13 16-битных регистров, каждый из которых выполняет определенную функцию. Адреса регистров начинаются с 00H, который присваивается идентификатору чипа и заканчивается 0FH. Во всех 13 регистрах некоторые биты зарезервированы, а некоторые служат для чтения/записи. Каждый регистр выполняет такие задачи, как изменение громкости, смена каналов и т.д. в зависимости от назначенных им битов.


Мы не можем напрямую использовать микросхему при подключении его к цепи, поэтому мы использовали перфорированную плату и несколько штырьков и припаяли каждый штырек модуля к каждому выводу, как показано на следующем рисунке.


RDA5807

Теперь поговорим об усилении радиосигнала. Аудиоусилитель – это электронное устройство, которое усиливает электронные аудиосигналы до уровня, достаточного для управления динамиками или наушниками. Мы создали простой аудиоусилитель, используя LM386, схема для этого устройства показана на следующем изображении.


Аудиоусилитель

Мы использовали два потенциометра для настройки диапазона FM и управления громкостью аудиоусилителя. Чтобы изменить громкость, вы можете повернуть ручку потенциометра, который подключен между 1 и 8-м контактом LM386, или потенциометр, который подключен к контакту 3 LM386. На рисунке ниже показана полная принципиальная схема радиоприемника на Arduino.


FM-радио своими руками на основе Arduino и RDA5807

Мы сделали небольшие изменения в усилителе. Вместо того чтобы использовать два потенциометра в усилителе, мы использовали только один. Мы поменяли потенциометр, который используется для изменения усиления, на резистор. Так что теперь у нашего проекта есть два потенциометра, один для настройки, а другой для изменения громкости. Потенциометр, который используется для настройки канала, связан с Arduino nano. Центральный вывод потенциометра подключен к выводу A0 Arduino nano, и один из оставшихся двух выводов подключен к 5V, а другой подключен к GND. Другой регулятор используется для управления громкостью радио и подключен, как показано на схеме.


Выводы A4 и A5 Arduino подключены к выводам SDA и SCL RDA5807M. Имейте в виду, что модуль приемника работает только от 3,3 В. Таким образом, подключите вывод 3v3 Nano к выводу VCC модуля приемника. Как только подключение будет завершено, вся установка может иметь примерно такой вид.


FM-радио своими руками на основе Arduino и RDA5807

Код программы Arduino инициализирует модуль приемника, а затем устанавливает канал с предварительно установленной частотой. Когда значение, считываемое Arduino на выводе A0, изменяется (путем изменения потенциометра), частота изменяется, что, в свою очередь, меняет канал. Полный код выглядит следующим образом.



#include <Wire.h>
    /* Выберите частоту, на которую мы хотим настроить
     * путем выбора канала для желаемой частоты 
     */
uint16_t channel = 187; 
    /*
     * если предположить, что диапазон начинается с 87,0 МГц (согласно настройкам ниже)
     * и разнос каналов составляет 100 кГц (0,1 МГц) (согласно настройкам ниже)
     * то канал может быть получен следующим образом:
     *  
     * канал = (<желаемая частота в МГц> - 87,0) / 0,1 
     *
     * что так же, как:
     * <10 x требуемая частота в МГц> - 870
     */
#define RDA5807M_ADDRESS  0b0010000 // 0x10
#define BOOT_CONFIG_LEN 12
#define TUNE_CONFIG_LEN 4
/* 
 *  Эти байты устанавливают нашу начальную конфигурацию
 *  На данном этапе мы не настраиваемся на канал.
 *  Но вместо этого инициируем сброс.
 */
uint8_t boot_config[] = {
  0b00000011,
  /*регистр 0x03 */
    /* Не пытайтесь настроиться на канал на этом этапе*/
  0b00000000, 
    /* 
     * Канал CHAN выбирает 8 старших значащих бит из 10
     * 0000 0000 = не надо программировать канал в это время
     */
  0b00000000,   
  /* регистр 0x04 */
  0b00001010, 
  0b00000000, 
  /* регистр 0x05 */
  0b10001000,  
  0b00001111, 
  /* регистр 0x06 */
  0b00000000, 
  0b00000000,    
  /* регистр 0x07 */
  0b01000010,     
  0b00000010, 
};
/* После сброса мы можем настроить устройство
 * Нам нужно запрограммировать только первые 4 байта, чтобы сделать это
 */
uint8_t tune_config[] = {
  /* регистр 0x02 */
  0b11000000, 
   0b00000001, 
   /* регистр 0x03 */
   /* Здесь мы устанавливаем частоту, на которую мы хотим настроиться */
   (channel >> 2), 
   ((channel & 0b11) << 6 ) | 0b00010000
};
void setup()
{
  Serial.begin(9600);
  pinMode(A0,INPUT);
  Wire.begin(); 
  Wire.beginTransmission(RDA5807M_ADDRESS);
  Wire.write(boot_config, BOOT_CONFIG_LEN);
  Wire.endTransmission();
  Wire.beginTransmission(RDA5807M_ADDRESS); 
  Wire.write(tune_config, TUNE_CONFIG_LEN); 
  Wire.endTransmission(); 
}
void loop()
{
  int channel1 =90,newA;
  static int oldA = 0;
  int result = 0;
  newA = analogRead(A0);
  if ((newA - oldA) > 10 || (oldA - newA) > 10){
    Serial.println(newA);
    if(newA!= oldA){
      channel = channel1+(newA/10);
      myChangeChannel(channel);
      oldA=newA;
      }
}
  uint16_t frequency = channel+870;
  uint16_t num1 = (frequency / 1000) % 10;
  uint16_t num2 = (frequency / 100) % 10;
  uint16_t num3 = (frequency / 10) % 10;
  uint16_t num4 = frequency % 10;
  Serial.print(num1);
  Serial.print(num2);
  Serial.print(num3);
  Serial.print(num4);
  Serial.print("--");
  Serial.println(channel+870); 
}
/*
 * Функция для изменения канала на радио RDA5807
 * Пример: channel = 191 
 */
void myChangeChannel(int channel){
  /*
   * сначала впишем новый канал в tune_config
   */
   tune_config[2] = (channel >> 2); 
   tune_config[3] = ((channel & 0b11) << 6 ) | 0b00010000;
      Wire.begin();
      Wire.beginTransmission(RDA5807M_ADDRESS);
      Wire.write(tune_config, TUNE_CONFIG_LEN);
      Wire.endTransmission();
  }

Когда модуль включен, наш код сбрасывает микросхему RDA5807 и устанавливает ее на желаемом канале пользователя (примечание: эта частота берется в качестве базовой частоты, на которую будет увеличиваться частота). При изменении потенциометра (подключенного к A0) значения, считываемые Arduino Nano, изменяются. Если разница между новым и старым значением больше 10, наш код будет учитывать это новое значение. Канал изменяется в зависимости от изменения нового значения по сравнению со старым значением. Увеличение или уменьшение громкости зависит от потенциометра, который подключен между контактом 3 и заземлением.




© digitrode.ru


Теги: Arduino, радио, RDA5807



   Благодарим Вас за интерес к информационному проекту digitrode.ru.
   Если Вы хотите, чтобы интересные и полезные материалы выходили чаще, и было меньше рекламы,
   Вы можее поддержать наш проект, пожертвовав любую сумму на его развитие.


Уважаемый посетитель, Вы зашли на сайт как незарегистрированный пользователь.
Мы рекомендуем Вам зарегистрироваться либо войти на сайт под своим именем.

Комментарии:

Оставить комментарий