Рубрики
Схемы на Arduino

FM приёмник на основе Arduino и модуля RDA5807

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

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

Общие принципы работы FM приёмника

Принцип работы радиостанций заключается в том, что они преобразуют первичные электрические сигналы в радиосигналы (более высокой частоты чем первичные сигналы), усиливают их до необходимого уровня и затем излучают их в окружающее пространство с помощью антенны. В процессе преобразования сигналов в радиостанции они подвергаются модуляции. Одними из самых известных (старейших) методов модуляции являются амплитудная (AM — amplitude modulation) и частотная модуляции (FM — frequency modulation).

Мы в нашем проекте будем рассматривать приемник, предназначенный для приема сигналов частотной модуляции (FM, в рус. языке — ЧМ). В данном виде модуляции частота несущего колебания модулируется (изменяется) по закону амплитуды первичного низкочастотного сигнала. Проектируемый нами приемник сможет принимать сигналы частотной модуляции (ЧМ) на определенной частоте и преобразовывать их в сигналы звуковой частоты (первичный электрический сигнал). Наш FM приемник будет построен на основе микросхемы RDA5807.

Необходимые компоненты

  1. Плата Arduino Nano (купить на AliExpress).
  2. Приемник RDA5807 (RDA5807 receiver) (купить на AliExpress).
  3. Усилитель звуковой частоты.
  4. Потенциометры 10 и 100 кОм (купить на AliExpress).
  5. Перфорированная плата.
  6. Соединительные провода.

Приемник RDA5807

RDA5807 представляет собой однокристальный модуль (микросхему) FM стерео радиоприёмника с интегрированным в него синтезатором частоты. Модуль способен работать в диапазоне частот 50 – 115 МГц, обеспечивать управление уровнем громкости и владеть информацией об уровне принимаемого сигнала. Модуль содержит кварцевый генератор на 32.768 КГц, цифровой усилитель и другие компоненты. Структурная схема модуля RDA5807M представлена на следующем рисунке.

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

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

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

Усилитель звуковой частоты

Усилитель звуковой частоты представляет собой устройство, которое усиливает слабые сигналы звуковой частоты до уровня, необходимого для нормальной работы громкоговорителя (динамика). Для нашего проекта мы спроектировали усилитель звуковой частоты на основе микросхемы LM386, его схема показана на следующем рисунке.

Схема проекта

Схема FM приёмника на основе платы Arduino и модуля RDA5807 представлена на следующем рисунке.

В схеме мы использовали два потенциометра, один из которых используется для настройки приемника на нужную частоту, а второй – для регулировки уровня громкости в усилителе звуковой частоты. При этом для регулировки уровня громкости можно использовать как потенциометр, подключенный между 1 и 8 контактами микросхемы LM386, так и потенциометр, который подключен к контакту 3 микросхемы LM386.

Но по мере тестирования проекта мы решили внести небольшие изменения в схему представленного усилителя звуковой частоты. Так, вместо двух потенциометров в схеме усилителя мы использовали только один, а другой потенциометр мы заменили на обычный резистор.

Потенциометр, который используется для настройки приемника на нужную частоту, подключен к плате Arduino nano – его средний контакт подключен к контакту A0 платы, а остальные два контакта – к 5V и земле (GND) соответственно.

Контакты A4 и A5 платы Arduino (это контакты интерфейса I2C), подключены к контактам SDA и SCL модуля RDA5807M. При этом учитывайте то, что модуль RDA5807M работает от питающего напряжения 3.3V, поэтому его контакт VCC необходимо подключить к контакту 3v3 платы Arduino Nano.

После сборки проекта на макетной плате у нас получилась конструкция следующего вида:

Объяснение программы для Arduino

Полный код программы приведен в конце статьи, здесь же мы кратко рассмотрим его основные фрагменты.

В коде программы нам необходимо инициализировать модуль приемника RDA5807M и установить канал с необходимой частотой. Вращение ручки потенциометра, подключенного к контакту A0 платы Arduino Nano, будет приводить к изменению частоты настройки и, следовательно, к изменению канала приемника.

Вначале в программе нам необходимо инициализировать библиотеку wire для взаимодействия с модулем RDA5807. В переменной “channel” мы будем хранить значение канала настройки. Первоначально у нас в этой переменной будет храниться значение 187, поэтому при включении схемы (подачи на нее питания) наш приемник всегда будет настраиваться именно на этот канал.

Далее нам необходимо загрузить требуемые значения байтов во все регистры микросхемы RDA5807 чтобы произвести ее первоначальную инициализацию.

После того, как мы инициализировали первоначальное состояние приемника, мы можем производить его настройку на требуемый канал. Для настройки приемника на требуемый канал (то есть изменения частоты настройки) нам необходимо изменить только первые 4 байта, передаваемые в регистры модуля. Также нам необходимо начать передачу данных по интерфейсу I2C. В нашей программе нам нет необходимости назначать адрес I2C поскольку в даташите на модуль RDA5807 указано что он имеет фиксированные адреса I2C: 0x02h – для операций записи данных и 0x0Ah для операций считывания данных.

В функции void setup() мы загрузим в модуль RDA5807M его загрузочные настройки по умолчанию.

Во время считывания значения частоты с потенциометра, подключенного к контакту A0, у нас возник ряд проблем. Прежде всего они были связаны с наличием шума, который мешал настройке на нужную частоту. Для уменьшения уровня шума мы использовали керамический конденсатор емкостью 0,1 мкФ, подключенный между контактом A0 и землей схемы (GND). В результате влияние шума на работу нашего приемника уменьшилось, но все равно его влияние ощущалось еще достаточно сильно. Поэтому мы внесли ряд изменений в код программы чтобы нейтрализовать его действие. Опытным путем мы установили, что максимальное значение шума не превышает 10. Поэтому в программу мы добавили специальное условие, которое учитывает изменение положения ручки потенциометра если считываемое с него значение (new value) не менее чем на 10 больше чем предыдущее значение (old value), считанное с него.

Следующая функция используется для установки байтов в массиве tune_config и затем передает данные модулю RDA5807M с помощью протокола I2C.

Тестирование работы FM приёмника

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

Более подробно работа нашего FM приёмника представлена в видео, приведенном в конце статьи.

Исходный код программы (скетча)

Видео, демонстрирующее работу FM приёмника

Источник статьи

13 ответов к “FM приёмник на основе Arduino и модуля RDA5807”

Приветствую, подскажите, данный модуль после настройки с контроллера и отключении от него, работает автономно на той волне, на которую был настроен и сохраняются ли настройки после перезапуска?

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

НЕ ВЕРИФИЦИРУЕТСЯ, В СТРОКЕ СООБЩЕНИЯ:

Arduino: 1.8.19 (Linux), Board: «Arduino Nano, ATmega168»

/home/an/Arduino/rda5807-pot/rda5807-pot.ino:245:13: warning: narrowing conversion of ‘(channel >> 2)’ from ‘uint16_t {aka unsigned int}’ to ‘uint8_t {aka unsigned char}’ inside { } [-Wnarrowing]
(channel >> 2),
~~~~~~~~~^~~~~
/home/an/Arduino/rda5807-pot/rda5807-pot.ino:247:29: warning: narrowing conversion of ‘(((channel & 3) << 6) | 16)' from 'uint16_t {aka unsigned int}' to 'uint8_t {aka unsigned char}' inside { } [-Wnarrowing]
((channel & 0b11) << 6 ) | 0b00010000
~~~~~~~~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~
Sketch uses 4420 bytes (30%) of program storage space. Maximum is 14336 bytes.
Global variables use 426 bytes (41%) of dynamic memory, leaving 598 bytes for local variables. Maximum is 1024 bytes.

Это у вас с резистором на 10 кОм? Попробуйте начать с простого, отключите модуль RDA5807 из схемы и из программы удалите все строки, связанные с ним. Посмотрите, заработает или нет программа в таком усеченном варианте

Здравствуйте.
Как изменить программу для применения переменного резистора номиналом 10ком для настройки приемника на нужную частоту ( в моем случае многооборотного) вместо используемого в статье потенциометра на 100ком.
Спасибо.

Добрый день, можно попробовать поизменять значение шума в 282 строке программы, то есть в команде if ((newA — oldA) > 10 || (oldA — newA) > 10) изменять 10 на какое либо другое значение. Но в минимальном варианте все должно и без изменений заработать, мы же с этого потенциометра считываем только уровень напряжения с помощью АЦП на аналоговом контакте Arduino

Добрый день !

А чувствительность приемника — как то регулируется, не разбирались ?

Здравствуйте, ну здесь она полностью зависит от модуля RDA5807. Надо смотреть даташит на него чтобы разобраться в этом

Собрал без шунта (конденсатора) на pin A0. Да, шумы сильные. Надо попробовать добавить конденсатор.
В Вашем коде пропущены строки
#define RDA5807M_ADDRESS 0b0010000 // 0x10
#define BOOT_CONFIG_LEN 12
#define TUNE_CONFIG_LEN 4
кто будет подключать, учтите.

Как, вроде есть эти строки в коде программы — строки с 16 по 18. Но все равно спасибо за конструктивный комментарий

Не переводил в коде программы комментарии, связанные с настройкой регистров модуля RDA5807M, но если кому нужна помощь в этом вопросе, пишите об этом здесь в комментариях, помогу чем смогу

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

Ваш адрес email не будет опубликован. Обязательные поля помечены *