АУДИО Простой 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.

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

Вложения

Изменено:

Комментарии

Олег Поляков

★★★✩✩✩✩
18 Янв 2022
107
113
www.1812.ru
@Moldik,
посмотрел исходные коды - освежил в памяти. В предыдущем сообщении ошибся. Настройки сохраняются не по времени, а по событию выхода из меню в режим приёмника. Если у вас не сохраняются настройки, то прежде всего, попробуйте изменить ключ первого запуска в строке №18 файла pov-radio.ino:
C++:
#define INIT_KEY 28     // ключ первого запуска. 0-254, на выбор
 
  • Лойс +1
Реакции: Moldik

Moldik

✩✩✩✩✩✩✩
27 Дек 2023
8
0
@Олег Поляков, Спасибо сейчас проверю.
А как правильно сюда посчитать частоту станции, если просто вписываю частоту в килогерцах записывается какая-то ерунда.
C++:
int32_t fav = 9860;       // частота любимой радиостанции
 

Олег Поляков

★★★✩✩✩✩
18 Янв 2022
107
113
www.1812.ru
@Moldik,проще всего сделать так:
1. Выбрать энкодером приёмника станцию.
2. Зайти в меню настроек в пункт "Радиостанции".
3. Выбрать поворотом энкодера пункт "Любимое" и один раз нажать на кнопку энкодера.
4. В [ ] отобразится частота текущей радиостанции. Вот это число и нужно будет прописать в скетч в качестве вашей любимой станции по-умолчанию.
 

Moldik

✩✩✩✩✩✩✩
27 Дек 2023
8
0
@Олег Поляков, да так и сделал, но вопрос остался - настройки не сохраняются,
параметр который вы указали относится к первому запуску т.е. к записи в ЕЕПРОМ первых данных, а не через меню (насколько я конечно понял(((
C++:
if (EEPROM.read(INIT_ADDR) != INIT_KEY) { // первый запуск
    EEPROM.write(INIT_ADDR, INIT_KEY);    // записали ключ
Больше он нигде не проверяется
Но я могу сильно ошибаться(((
 

Олег Поляков

★★★✩✩✩✩
18 Янв 2022
107
113
www.1812.ru
@Moldik, странная ситуация. Проверил на своём рабочем приёмнике: настройки сохраняются и при включении приёмника корректно считываются из EEPROM.
 
  • Лойс +1
Реакции: Moldik

Moldik

✩✩✩✩✩✩✩
27 Дек 2023
8
0
@Олег Поляков, я уже голову сломал, пробовал и при закрытии меню записывать и при открытии, после снятия питания все повторяется.. просто
save_param ();
почему-то не работает у меня...
 

samand587

★✩✩✩✩✩✩
31 Май 2021
91
23
Уважаемый автор! Получил очередной дисплей 1,3" ОЛЕД 1306 и снова имею вот такую картину. В чем может быть проблема?

З.Ы. С дисплеем 0,96" ОЛЕД 1306 картинку нормальная.

З.Ы.1 Не могу же я скупить весь Али для поиска правильного дисплея. Дайте, пожалуйста, ссылку где Вы покупали дисплей.
 

Вложения

Олег Поляков

★★★✩✩✩✩
18 Янв 2022
107
113
www.1812.ru
@samand587, выяснил в чём проблема. Проблема в авторе, а точнее в его невнимательности. :(
Очень много разных дисплеев для разных проектов заказываю и, после сборки приёмника в корпус, когда дисплей был уже прочно посажен на своё место, стал отрисовывать принципиальную схему. И вот здесь произошло фатальное: вместо 0.96 промаркировал дисплей в 1.3", который лежал отдельным модулем перед глазами.
Посыпаю голову пеплом за ваши траты времени и средств! Прошу понять и... простить.
Маркировку дисплея на схеме сейчас срочно исправлю.
Большие экраны тоже будут работать в проекте Радио, но не с ардуино Нано, а после адаптации кода под esp8266, у которой с запасом хватит памяти для поддержки таких экранов.

Благодарю вас за выявленную серьёзную опечатку в схеме и ещё раз прошу извинить!
 
Изменено:

PashaNN

✩✩✩✩✩✩✩
28 Апр 2024
1
0
Собрал схему , но вот как загружать эти файлы вообще не понимаю .Их тут куча , в какой последовательности. или надо только одну . И какой программой лучше ?
 

Vin4ter

✩✩✩✩✩✩✩
19 Июн 2024
1
0
@Eugeniy59, Можно jdy 62 bluetooth audio модуль поставить и включать его через npn транзистор, а rda 5807 выключать по i2c. Звук с блютуз модуля подключается во вход к усилителю вместе с rda.
 

Bula

✩✩✩✩✩✩✩
16 Ноя 2023
9
1
Понравился приемник,много их насобирал но такой еще не собирал
В ардуино ниже новичка,знаю только поверхностно,вопрос-сложно ли переделать с энкодера на кнопки?
 

Олег Поляков

★★★✩✩✩✩
18 Янв 2022
107
113
www.1812.ru
@Bula, нет, не сложно. Для кнопок можно использовать библиотеку GyverButton. По примерам Алекса Гайвера к ней с задачей переделки управления с энкодера на кнопки справится даже новичок.
См. Подключение кнопки к Arduino. GyverButton v3.8 | AlexGyver
 
  • Лойс +1
Реакции: Moldik

Bula

✩✩✩✩✩✩✩
16 Ноя 2023
9
1
Спасибо! Просто тупо опросить пин не сложно,а вот антидребезг
Купил на али энкодеры но они быстро выходят из строя-пару месяцев работы и нет контакта,начинается геморр с разборкой и чисткой
Спаяю,потом обращусь если будут проблемы (в планах заменить дисплей на ST7565,он побольше чем 1306,но это потом,сначала разберусь с кнопками)
 

Олег Поляков

★★★✩✩✩✩
18 Янв 2022
107
113
www.1812.ru
@Bula, по поводу дисплея большего разрешения: есть большие сомнения в возможности их использования в этом проекте на Ардуино Нано. Критически мало свободной памяти осталось...
 

Bula

✩✩✩✩✩✩✩
16 Ноя 2023
9
1
Я уже вытравил и спаял с дисплеем SSD1306,предусмотрел 5 кнопок,разбираюсь с ними
Радио принимает,часы показывают ересь (у вас так и написано,время постоянно скачет,но оно пока мне не надо-на будущее на плате предусмотрел DS3231)

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

По примерам Алекса Гайвера к ней с задачей переделки управления с энкодера на кнопки справится даже новичок.
Увы,даже примеры оттуда пишет ошибку-
C++:
Arduino: 1.8.10 (Windows 10), Плата:"ATmega328, No bootloader, EEPROM retained, Default, 328P / 328PA, BOD 2.7V, LTO enabled, Internal 8 MHz"

Несколько библиотек найдено для "EncButton.h"
In file included from C:\Program Files\arduino-1.8.10\libraries\GyverButton\src/core/VirtButton.h:5:0,

Используется: C:\Program
                 from C:\Program Files\arduino-1.8.10\libraries\GyverButton\src/EncButton.h:4,

                 from C:\Program Files\arduino-1.8.10\libraries\GyverButton\examples\demo\demo.ino:14:

C:\Program Files\arduino-1.8.10\libraries\GyverButton\src/core/io.h:3:10: fatal error: GyverIO.h: No such file or directory

#include <GyverIO.h>

          ^~~~~~~~~~~

compilation terminated.

exit status 1
Ошибка компиляции для платы ATmega328.

Этот отчёт будет иметь больше информации с
включенной опцией Файл -> Настройки ->
"Показать подробный вывод во время компиляции"
Пробовал ардуино нано,уно-везде ошибка-нет файла GyverIO.h

по поводу дисплея большего разрешения
Дисплей как и SSD1306-128*64 точки,монохромный


А почему нельзя писать сюда несколько сообщений? Сколько сообщений я могу написать в этой теме? Никогда с таким не сталкивался...
 
Изменено:

Олег Поляков

★★★✩✩✩✩
18 Янв 2022
107
113
www.1812.ru
@Bula, не сталкивался с подобными ошибками, хотя во многих проектах использовал эту библиотеку.
В качестве возможных путей решения:
1. Уменьшите версию самой библиотеки.
2. Попробуйте собрать штатные демонстрационные примеры под Arduino IDE 2.x.x.
 

samand587

★✩✩✩✩✩✩
31 Май 2021
91
23
@SP634, понятно, с таким я собирал. Уж больно маленький. По фото выше показалось ,что по больше диагональ.