Добавление дисплея
Теперь, когда у нас есть устройство ввода, нам необходима возможность отображать настройки радиоприемника. Я не смог придумать ничего лучше, чем использовать дисплей от старых мобильных телефонов Nokia 5110/3310.
Дисплей Nokia 5110/3310
При работе с этим дисплеем необходимо учитывать два важных момента. Во-первых, существует несколько разновидностей этих дисплеев, и у них могут быть разные распиновки. Вы должны проверить распиновку на своем дисплее, убедиться, что он на самом деле работает от 3,3 В, и проверить правильность подключения к Arduino Pro Mini. Во-вторых, поскольку все входы/выходы Arduino используют напряжение 3,3 В, мне не пришлось использовать понижающие резисторы, которые вы обычно видите, когда эти дисплеи используются 5-вольтовыми платами Arduino, например, Uno.
Вывод дисплея / Назначение | Вывод Arduino или точка на схеме |
---|---|
1-RST | D3 |
2-CE | D4 |
3-DC | D5 |
4-DIN | D6 |
5-CLK | D7 |
6-VCC | Vcc (3.3v) |
7-LIGHT | GND |
8-GND | GND |
В программе я решил использовать библиотеку LCD5110_Basic, которая быстра и очень проста в использовании.
На рисунке ниже показан заполненный данными дисплей радиоприемника.
Дисплей Nokia 5110/3310 при использовании в радиоприемнике (на скриншоте некорректно показаны единицы измерения частоты mHz, в прошивке это исправлено MHz)
Начиная с левого верхнего угла, мы показываем:
- строка 1 – режим (AM/FM/SW) и номер диапазона;
- строка 2 – частотный диапазон;
- строка 3 – уровни громкости и баса/тембра;
- строка 4 – текущая частота (МГц или кГц);
- строка 1 – индикаторы стерео (только для FM) и выключения звука (если активно).
Разумеется, эта информация постоянно обновляется, чтобы показывать изменения в настройках или вводе с клавиатуры.
Программирование 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), громкость, тон и отключение звука.
Подключение Arduino
Еще одна вещь, которую надо решить до включения схемы для тестирования, – это взаимодействие с Arduino. Здесь я решил использовать плату Arduino Pro Mini 3В/8МГц. Это небольшая плата Arduino, полностью работающая на напряжении 3,3 В и совместимая с Si4448-A10, что является главным преимуществом. Небольшой размер платы – второе преимущество. Подключение к Si4448-A10 осуществляется по четырем линиям, как описано ниже:
Arduino (3.3 В) | Si4844-A10 |
---|---|
A5/SCL | SCLK |
A4/SDA | SDIO |
D2 | INT |
D12 | RST |
Кроме того, используется стандартный преобразователь USB/TTL для подключения Arduino к компьютеру для программирования. Таким образом, у Arduino также будут задействованы выводы TX, RX и GND. Так вы сможете программировать и тестировать Si4844-A10 «внутрисхемно», что облегчает разработку и экспериментирование. Когда всё будет завершено, это подключение может быть убрано для автономной работы нового радиоприемника. Питание платы радио и платы Arduino должно осуществляться внешним стабилизированным источником питания на 3,3 В. Не пытайтесь запитывать их от преобразователя USB/TTL, даже если у него есть выходной вывод 3,3 В – нельзя полагаться, что он обеспечит необходимый ток для питания и Arduino, и Si4844-A10.
Добавление клавиатуры
Для управления радиоприемником нам необходимо устройство ввода. Для наших целей достаточно простой мембранной клавиатуры. Их легко подключить к Arduino. Ниже приведена иллюстрация назначения выводов клавиатуры (где строки, а где столбцы), которую использовал я, вы должны убедиться, что ваша клавиатура аналогична.
Простая мембранная клавиатура
Клавиатура | Arduino |
---|---|
Строка 1 | D8 |
Строка 2 | D9 |
Строка 3 | D10 |
Строка 4 | D11 |
Столбец 1 | D13 |
Столбец 2 | D14 |
Столбец 3 | D15 |
В программном обеспечении я использовал библиотеку от Марка Стэнли и Александра Бревига, которая выпущена под лицензией 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 представлена основная схема радиоприемника, взятая и адаптированная из технического описания Silicon Labs Si4844 и рекомендаций по применению. Для приема в диапазоне КВ я использовал ферритовую антенну от старого портативного приемника. Q1 – усилитель для СВ/УКВ, здесь я так же использовал телескопическую антенну от старого приемника. Стоит заметить, что руководство по проектированию, приведенное выше, дает несколько альтернатив и различные подходы к антеннам.
Переменный резистор (VR1) является критичным элементом схемы, поскольку он будет использоваться для настройки частоты приемника (ручка настройки). Рекомендуется использовать линейный потенциометр. Для аудиовыхода я решил использовать пару «экономичных» аудиоколонок со встроенным усилителем, которые у меня остались от старого компьютера. Разумеется, можно использовать простой стереоусилитель.
Возможно, наиболее сложная часть сборки – это работа с микросхемой в корпусе SSOP-24. Если у вас нет опыта работы с SMD микросхемами, возможно, самым простым способом будет использование переходной платы. У меня была переходная плата SSOP-28; немного пайки, и с микросхемой стало можно работать, как с микросхемой в DIP корпусе. Другими потенциально трудными компонентами для работы является пара из ферритового фильтра (бусинки) и конденсатора. Эти компоненты также можно припаять на переходную плату, чтобы работать с ними как с DIL элементом.
SMD компоненты, припаянные на переходные платы
Компонент | Описание |
---|---|
B1 | Ферритовый фильтр (бусинка) 2,5 кОм (100 МГц) |
C1,C2,C5 | Неполярный конденсатор 4,7 мкФ |
C3,C4 | Конденсатор 22 пФ |
C6,C7,C9 | Конденсатор 0,1 мкФ |
C8 | Неполярный конденсатор 47 мкФ |
C10,C11 | Конденсатор 0,47 мкФ |
C12,C14 | Конденсатор 33 нФ |
C13 | Конденсатор 33 пФ |
C15 | Конденсатор 10 пФ |
IC1 | Радиоприемник Si4844-A10 |
Q1 | NPN транзистор SS9018 |
R1, R2 | Резистор 2,2 кОм |
R3 | Резистор 1 кОм |
R4,R7 | Резистор 100 кОм |
R5 | Резистор 10 Ом |
R6 | Резистор 120 кОм |
R8 | Резистор 100 Ом |
L1 | Индуктивность 270 нГн |
VR1 | Линейный потенциометр 100кОм |
Y1 | Кварцевый резонатор 32,768 кГц |
ANT1 | Ферритовая антенна |
ANT2 | Телескопическая/штыревая антенна |
Тестирование работы FM приёмника
Когда на схему нашего проекта подается питание происходит сброс модуля RDA5807M и установка в нем канала по выбору пользователя. При вращения ручки потенциометра, отвечающего за настройку приемника на требуемую частоту, подключенного к контакту A0, значения, считываемые платой Arduino Nano с этого контакта, изменяются. Если разница между старым и новым значениями больше 10, мы считаем это изменение истинным (то есть произошедшим не вследствие действия шума) и изменяем в соответствии с ним канал, на который будет настроен радиоприемник. Уровень громкости звука мы изменяем с помощью потенциометра, подключенного между контактом 3 и GND.
Более подробно работа нашего FM приёмника представлена в видео, приведенном в конце статьи.
Собранный радиоприемник
Ниже представлен собранный на макетной плате проект радиоприемника – возможно, не такой аккуратный, каким мог бы быть (хорошо, здесь полный бардак), но полностью рабочий. Конечно, качество его работы можно улучшить только с помощью окончательной сборки.
Макет радиоприемника на Arduino
Программное обеспечение для запуска приемника доступно для загрузки ниже. Оно снабжено комментариями и, надеюсь, легко понятно и при необходимости легко модифицируется. Основной цикл программы очень прост. Он (1) проверяет и отображает любое изменение частоты приемника и (2) проверяет, выполнено ли нажатие клавиши, и, если да, выполняет соответствующую команду. Остальная часть программы состоит из вспомогательных функций.
Я был очень впечатлен качеством приема с учетом того, что это просто макет. В FM всё очень хорошо. На средних волнах тоже всё нормально, и я смог принять довольно много сигналов на коротких волнах. Тем не менее, качество приема может быть улучшено за счет использования нормальных антенн.
Приемник RDA5807
RDA5807 представляет собой однокристальный модуль (микросхему) FM стерео радиоприёмника с интегрированным в него синтезатором частоты. Модуль способен работать в диапазоне частот 50 – 115 МГц, обеспечивать управление уровнем громкости и владеть информацией об уровне принимаемого сигнала. Модуль содержит кварцевый генератор на 32.768 КГц, цифровой усилитель и другие компоненты. Структурная схема модуля RDA5807M представлена на следующем рисунке.
Модуль построен на цифровой архитектуре и включает малошумящий усилитель, работающий в диапазоне от 50 до 115 МГц. Также модуль содержит программируемый усилитель на ПЛИСах (PGA), АЦП (аналого-цифровой преобразователь) высокого разрешения и высокоточный ЦАП (цифро-аналоговый преобразователь). Амплитудный ограничитель на входе модуля предотвращает его перегрузку (по уровню) и ограничивает число интермодуляционных составляющих, создаваемых соседними каналами. Усилитель на ПЛИСах усиливает входной сигнал, который затем преобразуется в цифровую форму с помощью АЦП. Ядро цифровой обработки сигналов модуля управляет выбором каналов, демодуляцией FM сигналов и разуплотнением стерео сигнала. Назначение контактов (распиновка) микросхемы RDA5807 представлено на следующем рисунке.
Питающее напряжение для модуля составляет от 1.8 до 3.3V. Подключить модуль RDA5807 к микроконтроллеру можно по интерфейсу I2C. Модуль имеет 13 16-битных регистров, каждый из которых выполняет свою определенную функцию. Адреса регистров начинаются с 00H и заканчиваются 0FH. Во всех 13 регистрах некоторые биты зарезервированы. Регистры выполняют такие функции как изменение уровня, смена канала и т.д.
Модуль проблематично использовать для подключения к нему соединительных проводов, поэтому мы использовали перфорированную плату, чтобы с ее помощью и олова сделать контакты для подключения проводов как показано на выше приведенном рисунке.
Программирование Arduino
Микросхема Si в этом проекте является ведомым устройство I2C, имеющим фиксированный адрес 0x11; при этом ведущим устройством (мастером) является плата Arduino. Однако скорость обмена информацией по I2C у этой микросхемы относительно медленная: максимальная поддерживаемая скорость 50 кГц. Кроме того, во время процедуры включения питания скорость не должна превышать 10 кГц. Чтобы удовлетворить эти требования, мы должны явно установить у Arduino скорость I2C, которая, как правило, слишком велика для Si4844-A10. К счастью, благодаря большому количеству документации по функциям I2C Arduino, мы можем легко выполнить необходимые изменения.
В принципе, скорость I2C для наших целей определяется в программном обеспечении Arduino двумя переменными. Эти переменные – это и . Биты 0 и 1 управляют предделителем, который работает со значением для установки скорости I2C. Скорость (тактовая частота) передачи по I2C рассчитывается по формуле:
Частота = Тактовая частота процессора / (16 + (2 * () * (предделитель))
Arduino Pro mini 3,3В работает на частоте 8 МГц. Чтобы установить скорость I2C на 10 кГц, мы используем значение 98 и установим предделитель в значение 4 (путем установки в 1 только бита 0 ). Таким образом,
8 000 000 / (16 + (2 * 98 * 4 )) = 10 000 или 10 кГц
Чтобы установить скорость I2C на 50 кГц, мы используем значение 18 и установим предделитель в значение 4 (путем установки в 1 только бита 0 ). Таким образом,
8 000 000 / (16 + (2 * 18 * 4)) = 50 000 или 50 кГц
Для более подробной информации смотрите документацию библиотеки для Arduino. Суть в том, что мы можем выполнить изменение скорости I2C всего парой строк кода, что вы можете увидеть в тестовой программе.
Еще один важный момент, связанный с программирование, заключается в том, что нам в коде нужно использовать подпрограмму внешнего прерывания. Мы используем на Arduino, и, когда Si4844-A10 установит уровень на этом выводе в 1, выполнится простая функция, которая «привязана» к этому прерыванию. Всё, что делает эта функция, это изменяет значение переменной флага, которая может быть проверена и изменена в других частях программы. Si4844-A10 будет запускать прерывания (т.е. подавать уровень логической единицы на вывод INT) при определенных условиях, в основном в случае изменения сопротивления потенциометра настройки. Так Si4844-A10 сообщает Arduino, что вы повернули ручку настройки, и что необходимо обновить данные на дисплее.
Общие принципы работы FM приёмника
Принцип работы радиостанций заключается в том, что они преобразуют первичные электрические сигналы в радиосигналы (более высокой частоты чем первичные сигналы), усиливают их до необходимого уровня и затем излучают их в окружающее пространство с помощью антенны. В процессе преобразования сигналов в радиостанции они подвергаются модуляции. Одними из самых известных (старейших) методов модуляции являются амплитудная (AM — amplitude modulation) и частотная модуляции (FM — frequency modulation).
Мы в нашем проекте будем рассматривать приемник, предназначенный для приема сигналов частотной модуляции (FM, в рус. языке — ЧМ). В данном виде модуляции частота несущего колебания модулируется (изменяется) по закону амплитуды первичного низкочастотного сигнала. Проектируемый нами приемник сможет принимать сигналы частотной модуляции (ЧМ) на определенной частоте и преобразовывать их в сигналы звуковой частоты (первичный электрический сигнал). Наш FM приемник будет построен на основе микросхемы RDA5807.
Тестирование основной схемы
Когда у вас будет собранная на макетной плате схема, подключенные к ней Arduino и аудиоколонки со встроенным усилителем, вы сможете запустить тестовую программу, которая приведена в архиве в конце статьи (Si4844_Quick_Test.ino). Эта программа выполняет простой тест, который включает питание устройства, устанавливает диапазон FM (УКВ) и предоставляет информацию о версии микросхемы. Если всё пройдет хорошо, вы сможете настроить частоту радиоприемника, повернув ручку VR1, увидите частоту, динамически отображаемую на экране и, конечно, услышите то, что выдает радиоприемник.
Скриншот экрана с результатами вывода тестовой программы
Если основная схема и ее подключение к Arduino работают, то можно собирать полноценный радиоприемник.