АУДИО Простой FM-радиоприёмник на модуле RDA5807m и Arduino Nanо

Простой FM-радиоприёмник на модуле RDA5807m и Arduino Nanо
Простой FM-приёмник на Ардуино Нано


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

Предлагаю вниманию новичков в радио-деле (мастеров такими поделками не удивить) реализацию FM-радиоприёмника, собранном на Arduino Nano и замечательном крохотном модуле RDA5807m, в котором уместились приёмная высокочастотная часть приёмника (всемирной полосы частот 50 -115 MHz), rds-декодер и предварительный усилитель низкой частоты. Кроме того, модуль имеет интерфейс управления I2C.

Для отображения информации о частоте, названии радиостанций, текстовых RDS-оповещений радиостанций, качества приёма, уровня громкости и т.п., я решил использовать недорогой и популярный у самодельщиков OLED-дисплей SSD1306.
(Важное примечание: рекомендую использовать OLED-дисплей 0,96" 128x64)

От кнопочного управления решил отказаться полностью, заменив его на один энкодер GSMIN AK291.

Для усиления звука в приёмнике использован модуль УНЧ PAM8403, который выводит звук на два компактных 1/4 вт. динамика.

Автономное питание приёмника (на принципиальной схеме не прорисовано) было построено на зарядном модуле для li-ion аккумуляторов. В качестве элемента питания использовал плоский аккумулятор ёмкостью в 1000 мАч.

Приёмник с вышеперечисленной начинкой получился весьма компактных размеров - точно с пачку сигарет - 80x50x25.
Этот "малыш" многое умеет:
  1. Воспроизводит трансляцию станций мирового fm-диапазона.
  2. Всё управление осуществляется одним энкодером.
  3. Автоматически производит настройку на следующую/предыдущую станцию.
  4. Имеет ручную настройку частоты.
  5. Отображает на экране (128 x 64): качество приёма текущей радиостанции; название радиостанции (RDS); уровень установленной громкости; моно или стерео-трансляция; частоту радиостанции; динамику изменения громкости трансляции в изменяющихся по длине горизонтальных разнонаправленных от центра лучей (во, загнул! :) ); текстовые субтитры-сообщения от радиостанции (RDS); время в радио-студии (RDS, как правило, там выставлено бредовое время и за ним никто не следит).
  6. Перестраиваемый экран. Если RDS выключен в настройках приёмника или радиостанция не использует RDS, то экран перестраивается, шрифты увеличиваются, пустоты и пустые поля убираются, чтобы с максимальной наглядностью использовать маленький дисплей.
  7. Увеличение, уменьшение громкости.
  8. Отключение звука (Mute).
  9. Автоматическое отключение экрана и звука через установленный промежуток времени (1, 2, 3, 4, 5 часов).
  10. Принудительное включение/отключение RDS.
  11. Установка чувствительности (низкая, средняя, высокая) для поиска радиостанций.
  12. Сохранение текущей радиостанции в любимые. При следующем включении приёмник сразу же настроится на волну этой радиостанции.
  13. Включение/выключение стерео.
  14. Включение/выключение усиленных басов
  15. Включение/выключение динамической визуализации изменения громкости звуковой трансляции.
  16. Настройка яркости экрана (слабая, средняя, максимальная).
  17. Сохранение всех настроек в энергонезависимую память для восстановления состояния приёмника при следующем включении.
Принципиальная схема приёмника
schemas.jpg

Фотография готового приёмника

fm-radio.jpg screens.jpg

Скетч

В скетче используется ряд библиотек, которые легко устанавливаются через Arduino IDE.
Единственная библиотека требует установки более ранней её версии из-за несовместимости версий. Это библиотека Radio от Matthias Hertel. Следует устанавливать версию 2.0.0.

Актуальная версия: 1.2.

02.01.2025. Исправлена ошибка с регулировкой громкости.

Скачать схему и скетч можно отсюда: https://cloud.mail.ru/public/WKus/P119rnscM
Необходимые библиотеки: https://cloud.mail.ru/public/9Fuo/V8qkTeGpM
 

Вложения

Изменено:

Комментарии

maksland

★★★✩✩✩✩
13 Янв 2019
576
134
Omsk
а измерение уровня заряда батареи не будете делать (когда-нибудь )?
 

Олег Поляков

★★★✩✩✩✩
18 Янв 2022
179
153
www.1812.ru
@maksland, и в этом проекте, и в интернет-радио хочу это сделать, но времени свободного пока на этот нет. Может быть кто-нибудь из форумчан окажет милость и сделает.
 

maksland

★★★✩✩✩✩
13 Янв 2019
576
134
Omsk
а какой вывод можно зарезервировать тогда ? там два резистора всего и пин контроллера
я на плате предусмотрю возможность тогда
 

maksland

★★★✩✩✩✩
13 Янв 2019
576
134
Omsk
1742296134848.png
1742297372566.png
зарезервировал контроль батареи на A2

у приемника название "анархия" ? :)
в урч что за номинал конденсатора 500-3H ?
 
Изменено:
  • Лойс +1
Реакции: Олег Поляков

maksland

★★★✩✩✩✩
13 Янв 2019
576
134
Omsk
рисунок отправьте в личку, переведу на плату
а то своего вставил 1742372037205.png
можно именем дочери назвать было :)
 

prohard

✩✩✩✩✩✩✩
8 Янв 2025
6
1
Напишите пожалуйста, как работает автонастройка. У меня RDA5807m v.2.0, Arduino Nano noname, IDE 2.3.4. Версия радио 1.2 компилируется и загружается без ошибок. При повороте энкодера появляется частота, строка поиск до первой остановки. И дальше поиск не идет. Поворот энкодера - поиск идет дальше и останавливается. И еще одна проблема. Устанавливаю в скетче частоту любимой станции 10060. При включении отображается эта частота, а приемник шипит. Один поворот энкодера - станция начинает звучать. И еще один момент. Такое впечатление, что при перезагрузке скетча настроенные ранее станции почему-то сохраняются, но вроде все должно быть с нуля. Пожалуйста проясните эти вопросы.
 

Олег Поляков

★★★✩✩✩✩
18 Янв 2022
179
153
www.1812.ru
@prohard, автонастройка работает по уровню сигнала радиостанции. При повороте энкодера по часовой стрелке происходит пошаговое увеличение частоты приёма до появления радиосигнала. После чего частота фиксируется и процесс автопоиска прерывается до следующего поворота энкодера. При вращении ручки против часовой стрелки происходит аналогичный процесс, но с пошаговым уменьшением частоты приёма. Таким образом, автонастройка работает в приёмнике последовательно на одну станцию в ту или иную сторону частотного диапазона. В настройках радио в меню "Радиостанции" есть параметр "Чувствительность". Значениями "низкая", "средняя" или "высокая" вы можете задать уровень сигнала, на который будет реагировать приёмник при автонастройке с одной станции на другую.

Там же, в меню "Радиостанции" есть пункт "Любимое", в котором отображается частота любимой радиостанции. Для прошивки в скетч нужно вписывать частоту, которая отображается в этом пункте меню. Зафиксировали в приёмнике текущую станцию как любимую, посмотрели в меню и вбили в скетч число.

При выключении и последующем включении приёмника, он настраивается на частоту любимой станции.
 

prohard

✩✩✩✩✩✩✩
8 Янв 2025
6
1
Спасибо за ответ. В том то и дело, что не настраивается. Просто шипит. И еще один вопрос. Можно ли записать в память частоты в режиме ручной настройки?
 

Олег Поляков

★★★✩✩✩✩
18 Янв 2022
179
153
www.1812.ru
@prohard, если шипит на всём диапазоне, то либо антенна слабовата, либо приёмник находится в большом удалении от станций радиовещания.
Запоминать массив частот радиостанций в Ардуино Нано нет физических возможностей из-за ограниченности памяти.
 

prohard

✩✩✩✩✩✩✩
8 Янв 2025
6
1
И еще одна проблема. Устанавливаю в скетче частоту любимой станции 10060. При включении отображается эта частота, а приемник шипит. Один поворот энкодера - станция начинает звучать.
Причем тут антенна? В библиотечном TestRDA5807M такого эффекта нет. При выключении/включении прием восстанавливается.
 

Олег Поляков

★★★✩✩✩✩
18 Янв 2022
179
153
www.1812.ru
@prohard, в предыдущем вопросе был непонятен контекст. Если речь идёт о настройке на станцию по умолчанию при включении приёмника, то:
1. Настройтесь на нужную вам радиостанцию.
2. Зайдите в меню настроек приёмника в раздел "Радиостанции".
3. Переместите курсор в пункт меню "Любимая".
4. Нажмите один раз на энкодер для фиксации текущей радиостанции как любимой.
5. Цифры частоты после этой процедуры в подсвеченной строке "Люб.:" изменятся. Сама частота сохранится в EEPROM и при последующих включениях приёмника будет сразу производится настройка на эту станцию.

Если вы всё это проделали, а ситуация не поменялась, то будем разбираться дальше.
 

S_Sergey_G

✩✩✩✩✩✩✩
23 Фев 2021
168
3
И еще один момент. Такое впечатление, что при перезагрузке скетча настроенные ранее станции почему-то сохраняются, но вроде все должно быть с нуля
Перед прошивкой в Arduino в инструментах надо в "Erase Flesh: выставить "All Flash Contents:
 

prohard

✩✩✩✩✩✩✩
8 Янв 2025
6
1
Если вы всё это проделали, а ситуация не поменялась, то будем разбираться дальше.
Спасибо за внимание к моему вопросу. Да, проделал, и неоднократно. При включении на дисплее частота "любимой" станции, приемник шипит. Один поворот энкодера, иногда два, станция включается. Предполагаю, что при включении питания RDA5807m не получает от МК первичную настройку или она приходит не полностью. Проверил на скетче из библиотеки, в который вставил следующий код:
Задержка для RDA5807m:
#include <Wire.h>

// Настраиваемая задержка при включении (в миллисекундах)
const unsigned long INITIAL_DELAY = 2000; // 2 секунды по умолчанию

// Флаг для отслеживания первого включения
bool firstPowerOn = true;

void setup() {
  Serial.begin(9600);
  Wire.begin();
 
  // Проверяем, нужно ли выполнить задержку
  if (firstPowerOn) {
    Serial.println("Первое включение - выполняется задержка...");
    delay(INITIAL_DELAY);
    firstPowerOn = false; // Устанавливаем флаг, чтобы больше не выполнять
  }
А вот в какое место вставить этот кусок в Ваш скетч затруднился. Может быть посмотрите?
 
Изменено:

Олег Поляков

★★★✩✩✩✩
18 Янв 2022
179
153
www.1812.ru
@prohard, у меня есть предположение, что частота станции некорректно сохраняется в EEPROM. Скажите, а вы пробовали изменить ключ?
C++:
#define INIT_KEY 28     // ключ первого запуска. 0-254, на выбор
Что касается приведённого вами кода, то флаг
// Флаг для отслеживания первого включения bool firstPowerOn = true;
бесполезен, т.к. функция setup всегда исполняется единожды при включении ардуино.
Можно обойтись всего одной строчкой: delay(2000);
C++:
  Wire.begin();
  Wire.setClock(400000L);
  delay(2000);
  radio.init();
  radio.setVolume(volume);
 
Изменено:
  • Лойс +1
Реакции: prohard

prohard

✩✩✩✩✩✩✩
8 Янв 2025
6
1
Можно обойтись всего одной строчкой: delay(2000);
Это сработало. Вставил после 182-й строки текста. Спасибо. А можно попросить Вас сделать вариант (версию), в которой автонастройка заменена фиксированным списком, который переключается энкодером? Дело в том, что частоты станций не меняются годами и автонастройка практически не нужна, так как все частоты известны заранее.

Перед прошивкой в Arduino в инструментах надо в "Erase Flesh: выставить "All Flash Contents:
В IDE 2.3.4 в меню инструменты такого нет.
 

maksland

★★★✩✩✩✩
13 Янв 2019
576
134
Omsk
в общем платы едут, схему больше не меняем ! :)
работаем только над улучшением кода... если надо
 

prohard

✩✩✩✩✩✩✩
8 Янв 2025
6
1
Контур на антенном входе ставили? Я попробовал, автопоиск стал меньше на помехах останавливаться. Катушка 6 витков ПЭЛ-0,5 виток витку диаметр 4 мм и конденсатор 22 пф.
 
  • Лойс +1
Реакции: Олег Поляков