Собираем управляемый arduino радиоприемник с am на св/кв и fm в укв диапазоне

Содержание

Введение

Мы собираемся создать FM-радиоприемник в стиле ар-деко. Дизайн этого радио основан на впечатляющем радиоприемнике AWA 1935 года. Можно найти фото этого старого радио в Интернете. Дизайн этого радио очень красивый, так что сделать свой радиоприемник в аналогичном стиле — отличный вызов. Ушел ровно месяц на то, чтобы реализовать такой проект с нуля, но повторить результат теперь каждый сможет буквально за один день.

В уроке используется ЖК-дисплей Nokia 5110 для отображения частоты, которую мы слушаем. Используется поворотный регулятор для изменения частоты и другая ручка для увеличения или уменьшения громкости. На фото выше видно, что на ЖК-дисплее FM-радио Ардуино используется шрифт в стиле ар-деко. Кроме того, если мы прослушиваем одну и ту же радиостанцию ​​более 5 минут, радиостанция автоматически сохранит ее в памяти, поэтому при следующем включении радиостанции она автоматически настроится на частоту, которую мы использовали ранее. Радио также имеет встроенную литиевую батарею и соответствующее зарядное устройство, поэтому оно может работать от батарей в течение нескольких дней.

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

Подключение Arduino

Еще одна вещь, которую надо решить до включения схемы для тестирования, – это взаимодействие с Arduino. Здесь я решил использовать плату Arduino Pro Mini 3В/8МГц. Это небольшая плата Arduino, полностью работающая на напряжении 3,3 В и совместимая с Si4448-A10, что является главным преимуществом. Небольшой размер платы – второе преимущество. Подключение к Si4448-A10 осуществляется по четырем линиям, как описано ниже:

Подключение Arduino к Si4844-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.

Программирование 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 и аудиоколонки со встроенным усилителем, вы сможете запустить тестовую программу, которая приведена в архиве в конце статьи (Si4844_Quick_Test.ino). Эта программа выполняет простой тест, который включает питание устройства, устанавливает диапазон FM (УКВ) и предоставляет информацию о версии микросхемы. Если всё пройдет хорошо, вы сможете настроить частоту радиоприемника, повернув ручку VR1, увидите частоту, динамически отображаемую на экране и, конечно, услышите то, что выдает радиоприемник.

Скриншот экрана с результатами вывода тестовой программы

Если основная схема и ее подключение к Arduino работают, то можно собирать полноценный радиоприемник.

Характеристики RDA5807M

Сразу даю ссылку на даташит: RDA5807M_datasheet_v1.1, наиболее полную информацию о характеристиках RDA5807M вы можете найти в нем. Я перечислю некоторые из них:

  • Напряжение питания 2.7 — 3.3В
  • Потребляемый ток (при напряжении питания 3В):
    • в рабочем режиме — не более 20мА
    • в режиме сна — не более 15мкА
  • Диапазон принимаемых частот 50 — 115МГц
  • Выбираемый шаг изменения частоты: 200кГц, 100кГц, 50кГц, 25кГц
  • Выбираемый источник тактового сигнала: внешний или внутренний генератор (для внутреннего генератора требуется резонатор 32.768кГц)
  • Поддержка RDS/RBDS
  • Управление по шине I2C
  • Возможность прямого подключения нагрузки от 32Ом

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

Общие принципы работы FM приёмника

Принцип работы радиостанций заключается в том, что они преобразуют первичные электрические сигналы в радиосигналы (более высокой частоты чем первичные сигналы), усиливают их до необходимого уровня и затем излучают их в окружающее пространство с помощью антенны. В процессе преобразования сигналов в радиостанции они подвергаются модуляции. Одними из самых известных (старейших) методов модуляции являются амплитудная (AM — amplitude modulation) и частотная модуляции (FM — frequency modulation).

Мы в нашем проекте будем рассматривать приемник, предназначенный для приема сигналов частотной модуляции (FM, в рус. языке — ЧМ). В данном виде модуляции частота несущего колебания модулируется (изменяется) по закону амплитуды первичного низкочастотного сигнала. Проектируемый нами приемник сможет принимать сигналы частотной модуляции (ЧМ) на определенной частоте и преобразовывать их в сигналы звуковой частоты (первичный электрический сигнал). Наш FM приемник будет построен на основе микросхемы RDA5807.

Intro to the Arduino Arduino FM Radio project

Hello, guys, I am Nick and welcome to educ8s.tv a channel that is all about DIY electronics projects. In this channel, I share everything about the projects I build to help you build similar projects or inspire you to start building things because it is easy, fun and creative. Subscribe to the channel now if you do not want to miss any future video.

In this video, we are going to build this. A simple Arduino FM Radio receiver on a breadboard. Let’s listen to it for a few seconds … As you can see the radio is working fine and we can hear some music coming out of it. I am transmitting some YouTube safe tracks using this inexpensive FM transmitter at this frequency. I am using the Nokia 5110 LCD display, to display the selected frequency, the signal strength, and a stereo icon if we are receiving stereo sound. The brains of the project are the small and inexpensive Arduino Nano. We can control the volume of the speaker using this potentiometer, and we can change the Radio frequency using this potentiometer. It is a fascinating project and relatively easy to build. Let’s see how to build it.

Добавление дисплея

Теперь, когда у нас есть устройство ввода, нам необходима возможность отображать настройки радиоприемника. Я не смог придумать ничего лучше, чем использовать дисплей от старых мобильных телефонов Nokia 5110/3310.

Дисплей Nokia 5110/3310

При работе с этим дисплеем необходимо учитывать два важных момента. Во-первых, существует несколько разновидностей этих дисплеев, и у них могут быть разные распиновки. Вы должны проверить распиновку на своем дисплее, убедиться, что он на самом деле работает от 3,3 В, и проверить правильность подключения к Arduino Pro Mini. Во-вторых, поскольку все входы/выходы Arduino используют напряжение 3,3 В, мне не пришлось использовать понижающие резисторы, которые вы обычно видите, когда эти дисплеи используются 5-вольтовыми платами Arduino, например, Uno.

Подключение дисплея Nokia 5110/3310 к Arduino
Вывод дисплея / Назначение Вывод 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) и выключения звука (если активно).

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

Схема проекта

Схема FM приёмника на основе платы Arduino и модуля RDA5807 представлена на следующем рисунке.

В схеме мы использовали два потенциометра, один из которых используется для настройки приемника на нужную частоту, а второй – для регулировки уровня громкости в усилителе звуковой частоты. При этом для регулировки уровня громкости можно использовать как потенциометр, подключенный между 1 и 8 контактами микросхемы LM386, так и потенциометр, который подключен к контакту 3 микросхемы LM386.

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

Потенциометр, который используется для настройки приемника на нужную частоту, подключен к плате Arduino nano – его средний контакт подключен к контакту A0 платы, а остальные два контакта – к 5V и земле (GND) соответственно.

Контакты A4 и A5 платы Arduino (это контакты интерфейса I2C), подключены к контактам SDA и SCL модуля RDA5807M. При этом учитывайте то, что модуль RDA5807M работает от питающего напряжения 3.3V, поэтому его контакт VCC необходимо подключить к контакту 3v3 платы Arduino Nano.

После сборки проекта на макетной плате у нас получилась конструкция следующего вида:

MIT License

Copyright (c) 2019 Ricardo Lima Caratti

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the «Software»), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED «AS IS», WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE ARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

Основная схема

Схема радиоприемника

На рисунке 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 Телескопическая/штыревая антенна

Broadcast bands

Throughout the world, the FM broadcast band falls within the VHF part of the radio spectrum. Usually 87.5 to 108.0MHz is used, or some portion thereof, with few exceptions:

In the former Soviet republics, and some former Eastern Bloc countries, the older 65–74MHz band is also used. Assigned frequencies are at intervals of 30kHz. This band, sometimes referred to as the OIRT band, is slowly being phased out in many countries. In those countries the 87.5–108.0MHz band is referred to as the CCIR band.
In Japan, the band 76–90MHz is used.

The frequency of an FM broadcast station (more strictly its assigned nominal center frequency) is usually an exact multiple of 100kHz. In most of South Korea, the Americas, the Philippines and the Caribbean, only odd multiples are used. In some parts of Europe, Greenland and Africa, only even multiples are used. In the UK odd or even are used. In Italy, multiples of 50kHz are used. There are other unusual and obsolete standards in some countries, including 0.001, 0.01, 0.03, 0.074, 0.5, and 0.3MHz. However, to minimise cross-channel interference, stations operating from the same or geographically close transmitters tend to keep to at least a 0.5MHz frequency separation even when closer spacing is technically permitted, with closer tunings reserved for more distantly spaced transmitters as potentially interfering signals are already more attenuated and so have less effect on neighbouring frequencies. RCA stereo models use multiples of 0.2MHz, starting at 87.50 and ending at 107.90.

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

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

Собранный радиоприемник

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

Макет радиоприемника на Arduino

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

Я был очень впечатлен качеством приема с учетом того, что это просто макет. В FM всё очень хорошо. На средних волнах тоже всё нормально, и я смог принять довольно много сигналов на коротких волнах. Тем не менее, качество приема может быть улучшено за счет использования нормальных антенн.

Интерфейс управления

Здесь я хочу обратить внимание на имеющуюся в технической документации неточность (даташит на эту микросхему вообще очень мутный): в ней говорится, что I2C адрес микросхемы 0x10h, что внутренние адреса ее регистров не видны и что чтение и запись выполняются последовательно, начиная с фиксированного стартового адреса (0x0Ah для чтения, 0x02h для записи). После каждой операции чтения/записи происходит инкремент внутреннего счетчика и очередная операция будет выполняться уже для следующего регистра

Так до тех пор, пока внутренний счетчик не дойдет до верхней границы 0x3Ah, после этого он вернется к своему начальному значению. На самом деле RDA5807M отзывается на три I2C адреса, в чем легко убедиться, воспользовавшись I2C сканером:

I2C адреса RDA5807M

Адрес 0x10h используется для последовательного обращения к регистрам, как было описано выше.Адрес 0x11h позволяет обращаться к произвольным регистрам.Адрес 0x60h позволяет работать с RDA5807M в режиме совместимости с TEA5767. Упоминание адреса 0x11h можно найти в документе RDA5807P_ProgManual_1.0. Хоть он и предназначен для другой микросхемы, но практически всё применимо и для RDA5807M. Ниже приведен фрагмент из данного документа, описывающий формат I2C обмена при использовании адреса 0x11h:

Формат обмена с RDA5807M по I2C адресу 0x11h

Как можно видеть, при записи в режиме произвольного доступа первым передается адрес интересующего регистра (REGISTER ADDRESS), затем старший и младший байты данных. Для чтения содержимого регистра из RDA5807M микроконтроллер сначала передает его адрес, затем считывает старший и младший байты. Чуть позже я приведу пример чтения/записи регистров, а пока разберемся с их назначением.

RDA5807M documentation

Poor documentation might be main issue of RDA5807M. There are two datasheet version on the Internet, 1.0 and 1.1, both from 2011 and they are (surprisingly)
written in close to correct English, but it seems that either chip was updated or documentation was incomplete and this cost me few solid hours. In «TEA5767 mode»
chip had decent reception, but once I switched to native mode it was practically unusable, barely receiving any stations through the noise when placed near the window.
Comparing initialization procedure with few other project initially gave no clues. Then small arduino test code
got interesting as reception was good with it. Upon closer inspection that code works because it actually doesn’t do anything — it sets software reset bit in R2
and apparently this causes all changes to base configuration to be ignored. With try and error R5 writing was proven to cause problem and this is register that also controls volume,
so skipping writing to it was not a good option. Reading this register to get default value does not seem to be possible. Accidentally I’ve looked
into code — there is 0x0080 bit set in R5 (in datasheet described
as «Resvered» with default value = 0) and this works. This bit deserves to be named «R5_UNDOCUMENTED_SHIT» in source code below.

As I’ve ordered and received my RDA5807M modules in 2018 and this undocumented bit is not set in most existing projects, my theory is that RDA5807M
received some update while related datasheet version is still not available.

Программирование 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), громкость, тон и отключение звука.

Member Data Documentation

RADIO::_band
protectedinherited

Last set band.

bool RADIO::_bassBoost
protectedinherited

Last set bass Boost effect.

bool RADIO::_debugEnabled
protectedinherited

Set by and controls debugging functionality.

RADIO::_freq
protectedinherited

Last set frequency.

RADIO::_freqHigh
protectedinherited

Highest frequency of the current selected band.

RADIO::_freqLow
protectedinherited

Lowest frequency of the current selected band.

RADIO::_freqSteps
protectedinherited

Resulution of the tuner.

bool RADIO::_mono
protectedinherited

Last set mono effect.

bool RADIO::_mute
protectedinherited

Last set mute effect.

RADIO::_sendRDS
protectedinherited

Registered RDS Function that is called on new available data.

bool RADIO::_softMute
protectedinherited

Last set softMute effect.

uint8_t RADIO::_volume
protectedinherited

Last set volume level.

const uint8_t RDA5807M::MAXVOLUME = 15

max volume level for radio implementations.

uint16_t RDA5807M::registers
private
  • src/RDA5807M.h
  • src/RDA5807M.cpp

Шаг 1. Собираем все комплектующие

Нам понадобится много деталей, чтобы сделать этот проект. Если вы новичок в Arduino, сначала постарайтесь сделать несколько более простых проектов (посмотрите наши уроки), потому что это продвинутый проект и есть много вещей, которые могут быть непонятны или пойти не так.

Итак, нам понадобятся следующие части:

  • Arduino Pro Mini
  • Программатор FTDI
  • Модуль FM-радио TEA5767 FM 76-108MHZ
  • Динамик 3 Вт
  • Модуль усилителя PAM8403
  • Поворотный регулятор
  • ЖК-дисплей Nokia 5110
  • Аккумуляторная батарея, шилд Wemos
  • Аккумулятор 18650
  • Держатель батареи 18650
  • Переключатель
  • Макетная плата 5×7 CM
  • Провода
  • Сетка

Общая стоимость проекта может получиться в районе $22.

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

Давайте начнем с простенького скетча. Если вы попробуете управлять RDA5807M из моей программы, то обнаружите, что для того чтобы заставить его работать достаточно установить несколько битов: ENABLE, DHIZ, DMUTE, SEEK. Установка последнего запустит поиск радиостанции. Эти же действия можно выполнить программно при помощи следующего скетча:

voidsetup() {   Wire.begin();   setRegister(0x02, 0xC101);  }  voidloop() { }  void setRegister(uint8_t reg, const uint16_t value) {   Wire.beginTransmission(0x11);   Wire.write(reg);   Wire.write(highByte(value));   Wire.write(lowByte(value));   Wire.endTransmission(true); }

Подключите RDA5807M к Ардуино по приведенной ранее схеме и залейте в нее скетч. Приемник выполнит поиск и настроится на первую найденную радиостанцию. Бит Tune при этом сбрасывается. Нажатие кнопки Reset на Ардуино и повторное выполнение функции setup будут снова устанавливать этот бит, инициируя поиск следующей станции. Работает? Двигаемся дальше. В примере скетча выше мы записали в регистр 02h заранее определенное значение. На деле такое требуется редко, разве что для инициализации некоторых регистров. В основном же значения регистров формируются в процессе работы программы при изменении отдельных битов. В таких случаях удобно использовать константы, содержащие номера этих битов или маски для их установки. Ниже приведен пример такого скетча. Он позволяет настроиться на конкретную радиостанцию, установить громкость и получить RSSI.

                      uint8_t volume = 1;  uint16_t freq = 1073;  uint16_t reg02h, reg03h, reg05h, reg0Bh;  voidsetup() {   Serial.begin(9600);   Wire.begin();      reg02h = RDA5807M_FLG_ENABLE | RDA5807M_FLG_DHIZ | RDA5807M_FLG_DMUTE;   setRegister(RDA5807M_REG_CONFIG, reg02h);         reg02h |= RDA5807M_FLG_BASS;   setRegister(RDA5807M_REG_CONFIG, reg02h);               reg03h = (freq - 870) << RDA5807M_CHAN_SHIFT;    setRegister(RDA5807M_REG_TUNING, reg03h | RDA5807M_FLG_TUNE);         reg05h = getRegister(RDA5807M_REG_VOLUME);    reg05h &= ~RDA5807M_VOLUME_MASK;    reg05h |= volume << RDA5807M_VOLUME_SHIFT;    setRegister(RDA5807M_REG_VOLUME, reg05h); }  voidloop() {      reg0Bh = getRegister(RDA5807M_REG_RSSI);   uint8_t RSSI = (reg0Bh & RDA5807M_RSSI_MASK) >> RDA5807M_RSSI_SHIFT;   Serial.print("RSSI = ");   Serial.print(RSSI);   Serial.println(" (0-min, 127-max)");   delay(500); }  void setRegister(uint8_t reg, const uint16_t value) {   Wire.beginTransmission(0x11);   Wire.write(reg);   Wire.write(highByte(value));   Wire.write(lowByte(value));   Wire.endTransmission(true); }  uint16_t getRegister(uint8_t reg) {   uint16_t result;   Wire.beginTransmission(RDA5807M_RANDOM_ACCESS_ADDRESS);   Wire.write(reg);   Wire.endTransmission(false);   Wire.requestFrom(0x11, 2, true);   result = (uint16_t)Wire.read() << 8;   result |= Wire.read();   return result; }

В этом примере значения регистров получаются установкой отдельных разрядов. Для этого используются определенные в начале скетча флаги и маски. Я описал несколько из них для примера, остальные добавляются по аналогии. Чтобы настроить RDA5807M на интересующую частоту необходимо установить значения BAND и SPACE и затем изменять только значение CHAN. Итоговая частота определяется по формуле:F = BAND + CHAN * SPACE. В скетче используются определенные по умолчанию BAND и SPACE (87..108МГц  и 100кГц соответственно). По ним можно определить значение, которое должно быть записано в биты CHAN для получения интересующей частоты. Не забывайте при записи CHAN устанавливать также бит TUNE. Для изменения громкости значение регистра 05h считывается из RDA5807M в переменную. Затем осуществляется сброс битов VOLUME. И уже после этого можно устанавливать новое значение громкости и записывать результат в регистр. Для получения RSSI выполняются обратные действия: в считанном из регистра 0Bh значении сбрасываются все биты, кроме содержащих RSSI. Затем результат сдвигается вправо, чтобы младший бит RSSI оказался в младшем разряде переменной. Так мы получим нужное нам значение. Теперь, когда описаны основные приемы управления RDA5807M, можно приступить к программированию. Нужно лишь определиться с функционалом и интерфейсом.

Программирование 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, что вы повернули ручку настройки, и что необходимо обновить данные на дисплее.

IR kit

Main addition to previous (ATmega8) version is infrared remote control. For this purpose
I’ve bought cheapest «arduino» IR kit: tiny remote controller, VS1838B IR receiver
and (unnecessary) board for this receiver. Remote controller seems to be really low quality — it was only $1.27 including shipping
and I’m not even sure if it is worth it, so only plus is it is easily replaceable and manufactured in millions. Mine is almost unused,
just laying around few months but front is already delaminated.

Controller is intented to be powered with CR2025 cell but popular and cheap CR2032 fits also.
I’ve accidentally discovered that this kit can work with depleted cell (2.90V with no load, 1.25V on 1k load) but range is limited to ~30 cm then.
With fresh cell this remote + receiver set works across the room (few meters) with no problems, although it requires aiming.

This remote sends signals following NEC protocol (basic variant with 8 bit address)

For precise time readings: NEC.json for miniscope v4

For decoding NEC protocol I’ve used slightly modified nec-decoder library
by Malte Pцggel. Timings generated by my $1 remote were little different than nominal (e.g. 10 ms burst) and original code was not accepting this.

NEC standard codes sent by remote have address = 0x00 and following command values (hexadecimal):

I’ve received very similar remote controller with popular USB DVB-T RTL2832U tuner:

It has identical size to «Car mp3» controller, NEC address code is identical (0x00) but command codes assigned to buttons are different.
You can change mapping from NEC command code to function (ON/OFF, VOLUME UP/DOWN, SEEK UP/DOWN, …) in ir_remote_s1_car_mp3.c file.

Another popular remote controllers that are using NEC codes are ones from DVB-T tuners based on MSTAR chip:

Приемник RDA5807

RDA5807 представляет собой однокристальный модуль (микросхему) FM стерео радиоприёмника с интегрированным в него синтезатором частоты. Модуль способен работать в диапазоне частот 50 – 115 МГц, обеспечивать управление уровнем громкости и владеть информацией об уровне принимаемого сигнала. Модуль содержит кварцевый генератор на 32.768 КГц, цифровой усилитель и другие компоненты. Структурная схема модуля RDA5807M представлена на следующем рисунке.

Модуль построен на цифровой архитектуре и включает малошумящий усилитель, работающий в диапазоне от 50 до 115 МГц. Также модуль содержит программируемый усилитель на ПЛИСах (PGA), АЦП (аналого-цифровой преобразователь) высокого разрешения и высокоточный ЦАП (цифро-аналоговый преобразователь). Амплитудный ограничитель на входе модуля предотвращает его перегрузку (по уровню) и ограничивает число интермодуляционных составляющих, создаваемых соседними каналами. Усилитель на ПЛИСах усиливает входной сигнал, который затем преобразуется в цифровую форму с помощью АЦП. Ядро цифровой обработки сигналов модуля управляет выбором каналов, демодуляцией FM сигналов и разуплотнением стерео сигнала. Назначение контактов (распиновка) микросхемы RDA5807 представлено на следующем рисунке.

Питающее напряжение для модуля составляет от 1.8 до 3.3V. Подключить модуль RDA5807 к микроконтроллеру можно по интерфейсу I2C. Модуль имеет 13 16-битных регистров, каждый из которых выполняет свою определенную функцию. Адреса регистров начинаются с 00H и заканчиваются 0FH. Во всех 13 регистрах некоторые биты зарезервированы. Регистры выполняют такие функции как изменение уровня, смена канала и т.д.

Модуль проблематично использовать для подключения к нему соединительных проводов, поэтому мы использовали перфорированную плату, чтобы с ее помощью и олова сделать контакты для подключения проводов как показано на выше приведенном рисунке.