Найти тему
Terrabyte

Вызов для программиста: микро FM-радио на RDA5807M и ATtiny13A своими руками

Оглавление

А начиналось все совершенно спокойно! Мне понадобилось радио для командировок. В основном, чтобы занять себя в ходе ожидания самолетов-поездов. Да и в самом поезде (а то и в самолете)... Страшно надоело пялится в экран мобильника. Никакого зрения не хватит! То ли дело - сиди себе, слушай новости, музыку, умные (кхе-кхе) мысли...

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

Ладно, слезы лить не стану, сделаю приемник сам. Чего там делать! Тем более, что в продаже есть удивительные дешевые и малюсенькие модули, не требующие настройки - RDA5807M. На Али так их вообще на вес продавали! Купил год назад по-случаю! Как обычно - пусть лежат. И вот их время пришло!

Модуль на RDA5807M
Модуль на RDA5807M

Завязка сюжета

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

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

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

Микроприемник FM на RDA5807M первая версия
Микроприемник FM на RDA5807M первая версия
Микроприемник FM на RDA5807M первая версия, вид со стороны разъемов
Микроприемник FM на RDA5807M первая версия, вид со стороны разъемов
Микроприемник FM на RDA5807M первая версия, вид изнутри
Микроприемник FM на RDA5807M первая версия, вид изнутри

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

Тем не менее, именно эта конструкция поехала со мной в командировку и безусловно оправдала возложенные на нее ожидания как по качеству приема, так и по громкости. А небольшие размеры (38x70x8 мм) позволяли без труда спрятать ее в любом кармане!

Вместе с этим проявились и неудобства конструкции. Аппетит-же приходит во время еды! К недостаткам можно отнести:

  • невозможность определить радиостанцию, пока она не передаст позывной,
  • невозможность вернуться на предыдущую волну,
  • отсутствие памяти для запоминания любимых станций.

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

Так возникла идея расширения функционала модели. Правда, программист, в глубине моей души всячески меня убеждал, что ресурсов "тиньки" не хватит на все мои губораскатки, и что надо, пока не поздно, сменить микроконтроллер, но инженер и авантюрист навалились на него и убедили попробовать! И если честно, мне эта задача показалась очень увлекательной - взять и выжать все возможные соки из маленького ATtiny13. Тем более, что больше половины из килобайта его памяти программ еще оставалось свободными!

Мини FM радио с расширенным функционалом

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

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

Получается, нужно подключить 5 кнопок к трем выводам микроконтроллера. В лоб эта задача не решается, но если вспомнить, что 3 логических бита позволяют передавать 8 состояний, то возникает уже более реалистичная задача кодирования - при нажатии на кнопку менять двоичный код на входах микроконтроллера. Задача это не такая сложная как может показаться на первый взгляд. Можно обойтись без карт Карно и вообще логических элементов. Схема легко реализуется на обычных диодах. Ниже я ее приведу.

Вторая проблема - подключение средств отображения информации (частота, громкость,...). С этим проще. Поскольку выводов у нас уже не осталось, требуется средство вывода с универсальным интерфейсом I2C, на который мы уже повесили наш УКВ-модуль RDA5807M. Выбор тут небольшой, а если учесть компактность и требования по энергопотреблению, то остается лишь компактные OLED-дисплеи. У меня под рукой оказался дисплей с диагональю 0,96 дюйма и разрешением 128x64 пикселя.

OLED-дисплей с диагональю 0,96 дюйма и интерфейсом I2C.
OLED-дисплей с диагональю 0,96 дюйма и интерфейсом I2C.

Кстати, их несомненное достоинство, помимо прочих - низкая стоимость.

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

Принципиальная схема микро FM-радио на RDA5807M и ATtiny13
Принципиальная схема микро FM-радио на RDA5807M и ATtiny13

Сверху - стабилизатор питания на 3 вольта. В середине - микроконтроллер с подключенными кнопками. Диоды как раз и обеспечивают управление логическими состояниями. При нажатии на кнопки "VOLUME+" и "CHANNEL-" - нулевой уровень подается сразу на два вывода. Выводы микроконтроллера 2 и 3, задействованные для реализации интерфейса I2C подтянуты через резисторы к плюсу питания. К питанию подтянут и 1-й вывод - сигнал сброса, по-умолчанию. В нижнем ряду слева OLED-дисплей, который подключается без какой-либо обвязки (она уже есть на его плате). В середине сам модуль RDA5807M к которому добавлены разделительные конденсаторы для наушников и дроссель, который совместно с конденсатором, установленным в модуле, образует фильтр высоких частот, не пропускающий низкочастотный аудиосигнал от наушников на антенный вход.

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

Значит, проблемы с железом решены. Остается самая страшная...

Третья проблема - софт! Из анекдота: "...а теперь со всей этой х...ней мы попробуем взлететь!".

Честно! Я не был уверен в своих силах приступая к созданию софта для этого радио. Но, что может принести больше удовольствия чем решение сверхзадачи! Для меня это было именно "сверх". Для пущей храбрости я убедил себя, во-первых, что остановлюсь, когда сам сочту нужным, а во-вторых, что я не обязан реализовывать все хотелки, которые растут как снежный ком. Однако, даже с учетом этих предпосылок мне было страшно (да и неудобно это) программировать законченное железо. Потому решил заниматься любовью с отладочным вариантом изделия. Макетом, то есть.

Вот такой мега-девайс я собрал за несколько часов на кусочке "слепыша".

Макетная плата микро FM-приемника
Макетная плата микро FM-приемника

Размещен рядом с моим ноутом, на котором я и "пилил" прошивку. С другой стороны монтаж выглядел так.

Макетная плата микро FM-приемника (вид с обратной стороны)
Макетная плата микро FM-приемника (вид с обратной стороны)

Сам контроллер для удобства установлен на DIP-переходник, а для программирования я использовал самодельный ArduinoISP-программатор из связки Arduino Nano и DigiSpark с DIP-панелькой. Выглядит вот так.

ArduinoISP-программатор
ArduinoISP-программатор

Для работы с OLED-дисплеем я позаимствовал упрощенный вариант от того же автора - ATtiny13-TinyOLEDdemo. А вот все остальное - результат напряженного четырехдневного труда по оптимизации кода. Программировал я на чистом C с минимальным использованием библиотек. Работа ведется с регистрами напрямую, без оберток. Работа больше исследовательская, поскольку, как оказалось, однозначно интерпретировать поведение компилятора в разных ситуациях практически невозможно (ну или я такой умелец)!

В любом случае, задача, как я ее видел в первом приближении, была решена! Скетч также содержится в архиве. Знакомьтесь, критикуйте, улучшайте! У меня получилось уложить все в 1002 байта из 1024 возможных. Полагаю, что возможность улучшить этот результат и добавить дополнительную функциональность еще имеется!

Результат компиляции кода
Результат компиляции кода

Код я старался подробно комментировать. Там где комментарии на английском языке - это фрагменты первоисточника. На русском - мои.

Реализованы были следующие задачи:

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

Это был именно тот минимум при котором мое программистское самолюбие было удовлетворено и наступала стадия реализации проекта в чистовом железе.

Инжениринг изделия

Плата разрабатывалась в SprintLayout (есть в архиве). Я старался сделать ее односторонней, чтобы уменьшить толщину монтажа. Но, все же 4 перемычки пришлось добавить.

Печатная плата в SprintLayout
Печатная плата в SprintLayout

Кстати, уже после изготовления я обнаружил, что немного промахнулся с размерами посадочных мест под диоды. Потом исправил. В архиве исправленная версия. Из-за проблем с покупкой нужных SMD-дросселей я также использовал DIP-вариант, под который на плате оставлено место. Кстати, все DIP-компоненты также монтируются со стороны печатных проводников. Выводы обрезаются заподлицо с обратной стороны платы. Иначе не получится нужная толщина!

Кнопки тоже выбраны поменьше размером чем те, что использовались в первой версии и прототипе. К ним еще нужно будет придумать толкатели.

Плата изготовлена из фольгированного стеклотекстолита толщиной 1 мм на моем небольшом фрезерном станочке CNC1610. Надо сказать, он меня жутко выручает при изготовлении. Дорожки красивые, ровные. Сверлить вручную не надо! Вырезать тоже!

Вырезание дорожек печатной платы на фрезерном станке
Вырезание дорожек печатной платы на фрезерном станке
Дорожки вырезаны
Дорожки вырезаны
Лишняя фольга снята
Лишняя фольга снята
Сверление отверстий
Сверление отверстий
Вырезание платы по контуру
Вырезание платы по контуру

По окончании плата покрывается сплавом Розе для предупреждения окисления медных дорожек. Результат выглядит так.

Плата, покрытая сплавом Розе
Плата, покрытая сплавом Розе

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

Наклеиваем скотч и обрезаем его по внутреннему периметру контактов
Наклеиваем скотч и обрезаем его по внутреннему периметру контактов

Смонтированная плата выглядит следующим образом.

Смонтированы SMD-компоненты
Смонтированы SMD-компоненты

Видно, что контакты земли и питания под OLED-дисплей были перепутаны местами. Также хорошо видны 4 перемычки из обмоточного провода диаметром 0,35 мм. Сверху хорошо заметно полосатый дроссель в DIP-корпусе.

Остается установить разъем для наушников, выключатель и модуль зарядки. Это все у меня было (покупал по-случаю на Али десятками занедорого).

Установлены разъем наушников, выключатель питания и модуль заряда аккумулятора
Установлены разъем наушников, выключатель питания и модуль заряда аккумулятора

Теперь готовим плату к установке OLED-дисплея. Для этого запаиваем в 4 оставшиеся отверстия провода от выводов резисторов предварительно сделав на них изгибы. Они в последствии позволят выровнять плату как в горизонтальной, так и в вертикальной плоскости.

Из дисплея нужно штатные штыри выпаять. Это будет проще сделать по одному, предварительно стянув с них пластмассовую обойму.

Запаяны выводы для установки дисплея
Запаяны выводы для установки дисплея

С этого ракурса не очень видно, но в основании выводов под дисплей есть изгиб диаметром примерно 2...2,5 мм. Делал небольшими круглогубцами.

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

Заклеили модуль радио каптоновым скотчем
Заклеили модуль радио каптоновым скотчем

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

После этого можно установить экран. Экран устанавливается на такой высоте, чтобы суммарная толщина всего "бутерброда" не превышала 8 мм. Это должно получиться без труда. В некоторых модулях RDA5807M может потребоваться "утопить" кварц поглубже, слегка нагрев паяльником место пайки его корпуса.

Я забыл сделать снимок сразу, поэтому отогнул дисплей, чтобы показать как я наклеил скотч.

Плата с установленным экраном
Плата с установленным экраном

Аккумулятор, который я использовал имеет типоразмер 602530 (размеры 25x30x6 мм). Он хорошо подошел по ширине основной платы.

Корпус для приемника я спроектировал в программе Компас-3D, на которую уже полностью перешел с детища, отвернувшегося от нас Adobe - Fusion-360. Об этом не жалею! Компас - рулит!

Проект корпуса микроприемника
Проект корпуса микроприемника

Корпус был напечатан на 3D-принтере Anycubic i3 Mega S из ABS-пластика. Конечно я забыл дать припуск на усадку, поэтому первый комплект деталей выкинул! Не жалко! Они маленькие. Печатаются менее 40 минут. ABS - только с термокамерой! Сопло 240 градусов, стол - 100.

Печать нижней крышки корпуса
Печать нижней крышки корпуса

Результат печати крышек выглядит так. Кстати, модели для изготовления корпуса также будут в архивном приложении к статье.

Крышки корпуса с лицевой стороны
Крышки корпуса с лицевой стороны
Крышки корпуса с обратной стороны
Крышки корпуса с обратной стороны

Немного узковато получилось отверстие под дисплей. Проточил его надфилем побольше.

Для большей надежности крышки корпуса фиксируются между собой одним винтом. Это необязательно, поскольку они и так прочно защелкиваются. Но, чтобы избежать инцидентов при падении, например, на кафель - не повредит! Под винт крепления M2 устанавливаю латунную резьбовую вставку.

Латунная резьбовая вставка
Латунная резьбовая вставка

Теперь изделие можно окончательно собирать.

Укладываем начинку в нижнюю крышку.

Сборка микроприемника
Сборка микроприемника

Снимаем защитную пленку с экрана, устанавливаем кнопки в верхнюю крышку и защелкиваем ее с нижней. Снизу ввинчиваем винт с потайной головкой.

Все! Любуемся и наслаждаемся!

Готовое изделие
Готовое изделие

Кнопки работают так. Левые две - настройка по частоте. Две вертикальные справа - громкость. Третья справа внизу - запомнить текущую станцию. Возврат к ней осуществляется если при включении удерживать кнопку памяти зажатой.

Заключение

Хотелось бы отметить недостатки или особенности (кому как) получившегося устройства.

Прежде всего дизайн. Даже не цветовое решение, которое кому-то может показаться слишком детским (мне нравится, я в таком же стиле осциллограф делал). Как-то уж очень не на месте получились кнопки. Это дань компактности. Не слишком много было свободы в их расположении. Так получилось!

Толщина конструкции тоже выросла (при неизменных габаритах). Теперь она составляет 11 миллиметров вместо исходных 8-ми. Монитор потребовал увеличения. И хотя его общая толщина - 4,5 мм, я отдал ему только 3!

Память, возможно, тоже работает не лучшим образом. Нет часов. Нет информации RDS. И еще много чего нет! Но! не забываем - у нас ATtiny13! Настоящий вызов для программиста!

Архив с документацией, необходимой для повторения конструкции находится здесь.

Буду рад ответить на ваши вопросы! А еще больше буду рад, если посоветуете - как сделать код еще компактнее!

Спасибо, что читаете-смотрите Terrabyte! Подписывайтесь, если вам интересна тематика мини-ПК, необычных компьютерных решений и инновационных разработок! Спасибо всем, кто нас смотрит и поддерживает своими комментариями и лайками!

Наша группа ВК: https://vk.com/terrabyte

Наш канал на YouTube: https://www.youtube.com/@TERRABYTE

Вам будет интересно:

Корпус-конструктор для мини-ПК: от идеи до изделия

Температурный монитор для ПК

Прибор компьютерного мастера: осциллограф, частотомер, спектроанализатор