Радиоконструктор: FM радио на базе Atmega328-P и RDA5807M


Предыстория

Я думаю, многие из вас не только слышали, но и непосредственно сталкивались с такой платформой, как Arduino. И как показывает моя личная статистика, очень немногие заходят дальше, чем поморгать светодиодами. Когда я познакомился с Arduino в первый раз, меня останавливало то, что не было идей, как именно я бы мог использовать все возможности того же UNO на «полную катушку». Хватило только на сборку простенького робота на двух колёсах и сигнализации. Вместе с тем, хотелось сделать что-то более основательное.
Тогда я вспомнил о своем детстве, в котором были так называемые «радиоконструкторы». Суровый советский DIY Kit, который при правильной сборке и грамотной пайке даже начинал работать, и ловил радиостанции в различных диапазонах: Юность, Электрон-М и другие.

Ни один из таких Kit’ов мне не достался, зато достался ЭКОН-1:

Основной «фишкой» этого конструктора было то, что с его помощью можно было быстро и просто собрать большое количество различных устройств, от простых «пищалок» до вполне полноценного радиоприемника. ЭКОН-1 — одна из многих причин, по которой я вообще оказался в сфере IT. И мне пришло в голову, что было бы неплохо создать современную версию подобного конструктора, чтобы все желающие могли получить удовольствие от только что собранного своими руками девайса.

Радиоприемник ФМ-диапазона(FM) на одной микросхеме(CXA1238S).

Случилось так, что однажды, одному человеку захотелось собрать своими руками хороший приемник ФМ. Подходящий вариант нашелся быстро, на сайте radioshema.ru Схема представляет собой(как потом оказалось)модификацию варианта предложенного производителем специализированной микросхемы CXA1238S(можно найти, набрав в поисковике «datasheet CXA1238S). В оригинальную схему добавлены два транзистора, один в качестве усилителя УВЧ, второй — каскад ПЧ. Кроме того, изменена схема входного контура и гетеродина, а именно — вместо переменных конденсаторов применены варикапы.

К схеме прилагался рисунок печатной платы.

После долгой работы по изготовлению наступил долгожданный момент — приемник был готов к испытаниям.

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

Ведь для того, что бы емкость варикапов менялась, необходимо подавать на них хоть какое-нибудь напряжение. А здесь,
имеется плюс
с источника опорного напряжения(на рисунке отмечен красным) микросхемы, а
минуса — нет!
Заглянув в интернет и пройдясь по тематическим сайтам удалось обнаружить более жизнеспособные варианты, такие как — вариант оригинальной схемы производителя(SONY) или например, вот эту схему (сайт «Dinistor.net»).

Как видите, здесь с настройкой все в порядке. Напряжение на варикапы подается. Оно изменяется при помощи резистора R12. Как вы сами понимаете, полностью переделывать практически готовую схему не было никакого смысла, были внесены поправки в схему настройки(навесным монтажем). После этого все прекрасно заработало. Приемник ловит практически все радиостанции ФМ вещающие в нашем регионе. Качество звука вполне высокое, хотя АЧХ тракта ЗЧ имеет заметный перекос в область более высоких частот. С помощью цепи R14, R14* происходит удержание пойманной радиостанции, эффект усиливается при уменьшении сопротивления резистора R14 и соответственно ослабляется при его увеличении(выбрано около 400кОМ). Лично я бы порекомендовал воспользоваться всем желающим вариантом с «Dinistor.net»(по уже понятным причинам). Схема не содержит редких или дорогих элементов.

Фильтр ПЧ(10,7 МГц).

Электролитические конденсаторы:

Остальные конденсаторы — керамические:

С2 — С6,С8,С10,С23 — С12,С22 — С15, С20- С17, С19- С21 — С24 — С25 — С26 — С27 — С* —0,47мкФ 10-15нФ 0,1мкФ 1нФ 10пФ 10-56пФ 15пФ 180-220пФ 33пФ 3-5пФ 0,1мкФ

Резисторы:

R1, R13 — R2 — R3, R7 — R5 — R6 — R8, R9,R12 — R10 — R11 — R14 — R14′ —2,2 kOm 10 kOm 6,8 kOm 680 Om 100 Om 100 kOm 3,3 kOm 220 Om 100-680 kOm 100 kOm

Контурные катушки L1, L2, L4 — наматываются на оправке диаметром 3 мм (стержень от шариковой ручки) проводом ПЭЛ-0,5. В качестве резистора R12 можно применить любой переменный резистор. Но лучше использовать многооборотный (такие резисторы применялись в старых телевизорах,в блоке выбора программ).

Фильтр ZQ1 можно заменить такой схемой.

Схема замены фильтра L3 — 10… 14 витков ПЭЛ-0,5 на каркасе диаметром 5мм с подстроечным ВЧ сердечником. Сборка и наладка устройства: При питающем напряжении — 2… 7,5В вместо стабилизатора напряжения DA2 следует установить перемычку. Уровень сигнала НЧ на выходе не более 250мВ, для настройки тюнера «на слух» необходимо использовать любой подходящий усилитель ЗЧ. Настройку тюнера следует проводить в зоне уверенного приёма, в следующей последовательности:

1. Входной контур L4, C26 не устанавливается; 2. Контуром L1, C17 гетеродин настраивается на приём любой мощной FM-станции; 3. Контуром L2, C19 настраивается УВЧ по максимальной громкости; 4. Контура настраиваются путём сжатия или растяжения катушек L1, L2 или изменением количества витков; 5. При замене фильтра ZQ1 на LC контур, его необходимо настроить в резонанс на частоту 10,7 МГц. На слух это определяется по минимуму искажений и максимальной громкости; 6. Перемещая движок резистора настройки R12 в крайние положение подстроить контуром L1, C17 частоту гетеродина до полного перекрытия диапазона; 7. резистором R4 подстроить частоту ГУН до надёжного захвата пилот-тона, что определяется по зажиганию VD1 при приёме стерео-передач (выключатель SA1 — разомкнут); 8. Установить входной контур L4, C26 и настроить его по максимальной громкости станций, расположенных по краям диапазона;

Рекомендуется повторить настройку при слабом сигнале для получения максимального качества приёма. После окончания настройки витки катушек необходимо закрепить ваткой пропитанной парафином. Если даже после окончательной настройки при приёме мощных станций остаётся шум рекомендуется заземлить выводы 19, 24 на общий провод через конденсаторы ёмкостью 0,1 мкФ (на схеме обозначены С*).

При эксплуатации обнаружен недостаток в работе АПЧ: неравномерность действия АПЧ от центра диапазона к его краям, поэтому рекомендуется убрать резистор R14, и заменить его цепочкой R14′, и С27 (на схеме — синим цветом). Ёмкость С27 — определяет степень удержания настройки на станции. Расширить диапазон перекрытия тюнера, можно уменьшив ёмкость или выпаяв конденсаторы С17, и С19. При этом потребуется заново подогнать участки диапазона, подстроить гетеродин (L1-6 вит.), настроить УВЧ (L2-7 вит.), подстроить входной контур на середину диапазона (L4), потребуется менять количество витков контурных катушек. Так же следует учесть, что, все настройки желательно проводить в середине РВ диапазона. Ёмкость конденсатора С27 необходимо снизить до значения 1… 3 пФ. На 12-й вывод можно «навесить» светодиод относительно «+» питания, через токоограничивающий резистор аналогичный R5.

Прототип на монтажной плате

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

Для самой первой версии были выбраны следующие компоненты:

1. МК Atmega328P-PU 2. RDA5807M 3. Дисплей Nokia 5110

Такой микроконтроллер используется в Arduino UNO, соответственно, наше устройство совместимо с UNO на аппаратном уровне.

RDA5807M — «сердце» нашего конструктора. Этот тюнер имеет следующие возможности:

— Технология КМОП — Монолитный корпус, не требует внешних компонентов (почти) — Полоса частот: 50-115 МГц — Шаг между каналами – от 200 до 25 кГц — RDS/RBDS — АЦП и встроенный синтезатор частот — Адаптивное подавление шума — Цифровой интерфейс (I2C) — Уровень сигнала (RSSI) — Усилитель — Регулировка громкости звука

Дисплей Nokia — черно-белый, 84х48 пикселей. Он очень прост в подключении и управлении.

После пайки на монтажной плате получилось как-то так:

Было решено использовать Bootloader от Arduino, это позволило сохранить совместимость со всеми многочисленными библиотеками и существенно снизить порог вхождения для тех, кто уже имел какой-либо опыт работы с платформой. Интерфейс взаимодействия с пользователем реализован следующим образом. Три кнопки, подключенные к аналоговому входу МК через резисторы, используются для переключения режимов и управления приемником. Еще одна кнопка служит для перезагрузки МК. Экран, соответственно, отображает информацию о громкости, станции и т.д.

Программирование Arduino

Микросхема Si в этом проекте является ведомым устройство I2C, имеющим фиксированный адрес 0x11; при этом ведущим устройством (мастером) является плата Arduino. Однако скорость обмена информацией по I2C у этой микросхемы относительно медленная: максимальная поддерживаемая скорость 50 кГц. Кроме того, во время процедуры включения питания скорость не должна превышать 10 кГц. Чтобы удовлетворить эти требования, мы должны явно установить у Arduino скорость I2C, которая, как правило, слишком велика для Si4844-A10. К счастью, благодаря большому количеству документации по функциям I2C Arduino, мы можем легко выполнить необходимые изменения.

В принципе, скорость I2C для наших целей определяется в программном обеспечении Arduino двумя переменными. Эти переменные – это TWBR и TWSR. Биты 0 и 1 TWSR управляют предделителем, который работает со значением TWBR для установки скорости I2C. Скорость (тактовая частота) передачи по I2C рассчитывается по формуле:

Частота = Тактовая частота процессора / (16 + (2 * (TWBR) * (предделитель))

Arduino Pro mini 3,3В работает на частоте 8 МГц. Чтобы установить скорость I2C на 10 кГц, мы используем значение TWBR 98 и установим предделитель в значение 4 (путем установки в 1 только бита 0 TWSR). Таким образом,

8 000 000 / (16 + (2 * 98 * 4 )) = 10 000 или 10 кГц

Чтобы установить скорость I2C на 50 кГц, мы используем значение TWBR 18 и установим предделитель в значение 4 (путем установки в 1 только бита 0 TWSR). Таким образом,

8 000 000 / (16 + (2 * 18 * 4)) = 50 000 или 50 кГц

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

Еще один важный момент, связанный с программирование, заключается в том, что нам в коде нужно использовать подпрограмму внешнего прерывания. Мы используем INT0 на Arduino, и, когда Si4844-A10 установит уровень на этом выводе в 1, выполнится простая функция, которая «привязана» к этому прерыванию. Всё, что делает эта функция, это изменяет значение переменной флага, которая может быть проверена и изменена в других частях программы. Si4844-A10 будет запускать прерывания (т.е. подавать уровень логической единицы на вывод INT) при определенных условиях, в основном в случае изменения сопротивления потенциометра настройки. Так Si4844-A10 сообщает Arduino, что вы повернули ручку настройки, и что необходимо обновить данные на дисплее.

ЛУТ, фоторезист и отладка

После успешных испытаний на монтажной плате мы решили создать ещё несколько прототипов методом ЛУТ (а в дальнейшем — фоторезистом). Также мы решили усовершенствовать приемник, добавив туда ещё один усилитель звука для подключения не только наушников, но и внешнего динамика. Выбор пал на PAM8403, это простой и недорогой усилитель, который требует питания 5В.
Первый прототип, изготовленный методом ЛУТ, выглядел следующим образом:

ЛУТ — хорошая штука для относительно быстрого прототипирования в домашних условиях, но когда дело доходит до двухсторонних плат, начинаются сложности. Количество компонентов на плате увеличивалось — например, мы решили разместить на плате разъем для программатора, чтобы не было необходимости каждый раз извлекать МК для перепрошивки. Так, последующий прототип стал двухсторонним, был изготовлен методом фоторезиста и стал выглядеть намного приятнее:

В сборке:

Следующим шагом был отказ от «навесных» компонентов, которые мы размещали на плате при помощи однорядных PINов. Так, было принято заменить усилитель на LM386N, установить преобразователь уровней CD4050BE. Всё это усложнило конструкцию, но устройство стало выглядеть намного лучше.

Итоговый прототип, изготовленный нами в домашних условиях, выглядел так:

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

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

Заказ печатных плат

В Китае можно заказать печатные платы, выполненные промышленным способом. Стоимость выходит относительно небольшой даже при малых тиражах, а время ожидания (включая доставку) как правило не превышает 2-3 недель.
Первую «партию» плат заказали на PCBWay. Так она выглядела:

Одна из проблем, с которой мы по неопытности столкнулись: металлизация «съедает» значительную часть размера самого отверстия, поэтому некоторые компоненты с трудом «влезали» в нужные отверстия. При проектировании схемы необходимо учитывать этот момент.

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

Разъём USB используется для питания приёмника. Питание также подаётся при подключении программатора.

Всё работает!

Прошивка

Отдельно стоит остановиться на прошивке. Она написана на C++ и мы распространяем её по лицензии GPLv3: https://github.com/xtremespb/fm_receiver.Я практически не разрабатывал на C/C++, поэтому (вероятно) код далёк от идеала и может содержать ошибки, но GPL на то и GPL, чтобы можно было его дорабатывать сообществом
Текущие возможности прошивки включат в себя:

— Ручную и автоматическую настройку станций — RDS — Управление громкостью — Включение режима усиленных басов — Включение и отключение подсветки дисплея — Отображение и динамическая визуализация уровня сигнала

В следующей, четвёртой по счёту ревизии, мы сделаем ещё несколько полезных «фишек»: подключим левый и правый каналы к аналоговым входам на МК, что позволить «визуализировать» поступающий аудиосигнал.

Кстати, возможности устройства не ограничиваются радио! Никто не мешает, например, написать какую-нибудь игру (интереса ради я сделал старый добрый Arkanoid) или другую программу, использующую возможности платы.

Программирование Si4844-A10

По сути, Arduino посылает команды микросхеме радиоприемника по шине I2C, затем микросхема выполняет запрошенные действия и возвращает информацию о состоянии. Микросхема Si может работать в нескольких режимах, что позволяет настроить в ней точную частоту и нужные параметры. В этом проекте мы используем чип Si4844-A10 в режиме, который принимает предварительно определенные (или стандартные) диапазоны радиочастот с параметрами по умолчанию. Этот режим был выбран потому, что он легко дает доступ к базовому функционалу и при этом предлагает определенную степень настройки.

Вместо того, чтобы просто устанавливать значение «регистра» СВ/КВ/УКВ, в радиочипе может быть выбран один из 41 различных частотных диапазонов. Диапазоны 0–19 – ультракороткие волны (FM) 87–109 МГц; диапазоны 20–24 – средние волны (AM) 504–1750 кГц; диапазоны 25–40 – короткие волны 5,6–22,0 МГц (SW). Эти дипазоны различаются шириной, что может усложнить настройку. Более того, частотные диапазоны нескольких запрограммированных диапазонов равны или отличаются незначительно, но имеют различные параметры, например, предыскажения (УКВ/FM), ширина канала (СВ/AM), пороги разделения стереосигналов (УКВ/FM) и уровня принимаемого сигнала. Для полного понимания этого необходимо обратиться к техническому описанию и примечаниям к применению, где вы сможете увидеть таблицы диапазонов, а также все режимы, команды программирования и форматы ответов и статуса.

В данном проекте программное обеспечение будет обеспечивать доступ ко всем стандартным диапазонам, а также к управлению основными параметрами, включая изменение режима (AM/FM/SW), громкость, тон и отключение звука.

Production

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

— МК Atmega328P-PU — Преобразователь уровня CD4050BE — Дисплей Nokia 5110 — Приемник RDA5807M — Программатор USBasp — Операционный усилитель LM386N — Разъемы под МК и программатор — USB B, Audio Jack 3.5, три кнопки, провода, однорядные коннекторы — 11 резисторов и 12 конденсаторов, 4 индуктивности, кварц, стабилитрон и светодиод — Динамик — Печатная плата

Для сборки понадобится припой, флюс и паяльник, больше ничего не нужно. Все комплектующие упакованы в небольшую коробку из «крафтового» картона:

Исходники прошивки уже выложены на Github; Gerber-файл, принципиальная схема и инструкция по сборке будут также опубликованы позднее.

Добавление клавиатуры

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


Простая мембранная клавиатура
Подключение клавиатуры к Arduino

КлавиатураArduino
Строка 1D8
Строка 2D9
Строка 3D10
Строка 4D11
Столбец 1D13
Столбец 2D14
Столбец 3D15

В программном обеспечении я использовал библиотеку от Марка Стэнли и Александра Бревига, которая выпущена под лицензией GNU General Public License. Для проекта мы сопоставим функции с кнопками, как показано ниже.


Назначение кнопок для управления радиоприемником

Назначение кнопок клавиатуры:

  • AM: переключить в режим AM (средние волны), диапазон 22;
  • FM: переключить в режим FM (ультракороткие волны), диапазон 8;
  • SW: переключить в режим SW (короткие волны), диапазон 31.

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

  • Vol+ / Vol- : Увеличить или уменьшить громкость на один шаг. Есть 64 уровня громкости. Поскольку в проекте используются колонки со встроенным усилителем, эти кнопки не сильно важны, но их наличие всё равно радует;
  • Band+/Band- : Изменение диапазона на один шаг, но из числа доступных в текущем режиме;
  • B/T+ / B/T- : Увеличить или уменьшить тон на один шаг. Я признаю, что несколько вольно использую термин «тон». Для режима FM это увеличит или уменьшит уровень низких частот от 0 (макс. бас) до 8 (макс. высокий). Для режимов AM/SW это установит канальный фильтр от 1 до 7. Фильтры составляют 1.0 кГц, 1.8 кГц, 2.0 кГц, 2.5 кГц, 2.83 кГц, 4.0 кГц и 6.0 кГц соответственно. Также обратите внимание, что для простоты и удобства программирования (т.е. лени) в режимы AM/SW могут быть добавлены уровни 0 и 8, но они не будут отличаться от уровней 1 и 7 соответственно;
  • Mute: Включить или выключить звук на выходе.
Рейтинг
( 1 оценка, среднее 5 из 5 )
Понравилась статья? Поделиться с друзьями:
Для любых предложений по сайту: [email protected]