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

Содержание

Тестирование основной схемы

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

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

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

Schematic and Kicad files

Schematic — pdfmega328_FM_Kicad.zip

  • radio is powered from mini-USB port on arduino nano clone module and is not very picky — small USB charger/power supply, PC USB port or small powerbank work fine;
    in my setup I’m using currently «parasite» power with 5V/1A power supply shared by always on «web thermometer» and this radio
  • maximum audio volume is rather moderate, this is intended to be «kitchen»/small room audio device, full theoretical 2x3W from PAM8403 would be overkill
    and I care more about minimal audio volume (there are 15 volume levels from RDA5807M and lowest level is intended to be used at night time)
  • J4 is alternative to soldering TSOP17xx directly — if you need to mount IR sensor to front panel
  • AUX IN is — you guessed — auxiliary audio input; in my case it is connected to PC audio output thus radio works also as PC speakers
  • audio signal from FM module and AUX IN is mixed together
  • there is no volume control for AUX IN signal (volume control is only «inside» RDA5807M); depending on your preferences you might change R8 and R9 to lower values
    as with 4k7 used PC volume might need to be set to rather high values and it might be not comfortable when switching to e.g. internal laptop speakers
  • device is «always on» (this also means that AUX IN always works), consuming about 50mA (or 250mW)
  • there is place for two electrolytic capacitors near PAM8403 module; I’ve soldered only one of them to limit inrush current which might be a problem if powering from PC USB port (I believe chargers or similar power supplies do not care)
  • I’ve used toner transfer when making PCB and I had to use «Print as image» option, otherwise some pads were missing from printout — this might be some compatibility issue with PDF generator / PDF reader / particular postscript printer

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:

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

Flo Rida — Low ft. T-Pain [Apple Bottom Jeans] (Lyrics)

  • Order:
  • Duration: 3:50
  • Uploaded Date: 01 Aug 2020
  • views: 11385406

Flo Rida — Low ft. T-Pain (Lyrics)
️ Support us: https://bit.ly/3fbT8dC
Suggest a song: https://bit.ly/2TJCief

Turn on notification…
Flo Rida — Low ft. T-Pain (Lyrics)
️ Support us: https://bit.ly/3fbT8dC
Suggest a song: https://bit.ly/2TJCief

Turn on notifications to stay updated with new uploads!

#FloRida #Low #AppleBottomJeans #Lyrics

——

Lyrics: Flo Rida — Low ft. T-Pain

Hmm-mmm-mmm-mmm-mmm-mmm
Let me talk to ’em, let me talk to ’em let it rain
Hmm-mmm-mmm-mmm-mmm-mmm
Let me talk to ’em come on

Shawty had them Apple Bottom jeans (Jeans), boots with the fur (With the fur)
The whole club was lookin’ at her
She hit the flo’ (She hit the flo’), next thing you know
Shawty got low-low-low-low-low-low-low-low
Them baggy sweat pants
And the Reeboks with the straps (With the straps)
She turned around and gave that big booty a smack (Ayy!)
She hit the flo’ (She hit the flo’), next thing you know
Shawty got low-low-low-low-low-low-low-low

I ain’t never seen nothin’ that’ll make me go
This crazy all night spendin’ my dough
Had a million dollar vibe and a bottle to go
Them birthday cakes they stole the show
So sexual, she was flexible
Professional, drinkin’ X and O
Hold up, wait a minute, do I see what I think I, whoa
Did I think I see shawty get low?
Ain’t the same when it’s up that close
Make it rain, I’m makin’ it snow
Work the pole, I got the bank roll
I’ma say that I prefer them no clothes
I’m into that, I love women exposed
She threw it back at me, I gave her mo’
Cash ain’t no problem, I know where it goes
She had them

Apple Bottom jeans (Jeans), boots with the fur (With the fur)
The whole club was lookin’ at her
She hit the flo’ (She hit the flo’), next thing you know
Shawty got low-low-low-low-low-low-low-low
Them baggy sweat pants
And the Reeboks with the straps (With the straps)
She turned around and gave that big booty a smack (Ayy!)
She hit the flo’ (She hit the flo’), next thing you know
Shawty got low-low-low-low-low-low-low-low

Hey, shawty, what I gotta do to get you home?
My jeans full of guap and they ready for shones
Cadillacs, Maybachs for the sexy groan
Patron on the rocks that’ll make you moan
One stack c’mon, two stacks c’mon
Three stacks c’mon, now that’s three grand
What, you think I’m playin’, baby girl?
I’m the man, I’ll bend the rubber bands
That’s what I told her, her legs on my shoulder
I knew it was over, that Henny and Cola
Got me like a soldier, she ready for Rover
I couldn’t control her
So lucky oh me, I was just like a clover
Shawty was hot like a toaster
Sorry but I had to fold her
Like a pornography poster, she showed her

Apple Bottom jeans (Jeans), boots with the fur (With the fur)
The whole club was lookin’ at her
She hit the flo’ (She hit the flo’), next thing you know
Shawty got low-low-low-low-low-low-low-low
Them baggy sweat pants
And the Reeboks with the straps (with the straps)
She turned around and gave that big booty a smack (Ayy!)
She hit the flo’ (She hit the flo’), next thing you know
Shawty got low-low-low-low-low-low-low-low

Whoa, shawty
Yeah she was worth the money
Lil’ mama took my cash
And I ain’t want it back
The way she bent that back
Got her them paper stacks
Tattoo above her crack
I had to handle that
I was on it, sexy woman
Let me showin’ and made me want it
Two in the mornin’, I’m zonin’
And them Rosay bottles foamin’
She wouldn’t stop, made it drop
Shawty did that pop and lock
Had to break her off that guap
Gal was fly just like my Glock

Apple Bottom jeans (Jeans), boots with the fur (With the fur)
The whole club was lookin’ at her
She hit the flo’ (She hit the flo’), next thing you know
Shawty got low-low-low-low-low-low-low-low
Them baggy sweat pants
And the Reeboks with the straps (With the straps)
She turned around and gave that big booty a smack (Ayy!)
She hit the flo’ (She hit the flo’), next thing you know
Shawty got low-low-low-low-low-low-low-low (Come on)

———
https://wn.com/Flo_Rida_Low_Ft._T_Pain_Apple_Bottom_Jeans_(Lyrics)

Production

Разработка устройства от идеи до реализации заняла около 6 месяцев, что, с практически полным отсутствием опыта в данной области, не так уж и плохо. На данный момент у нас есть около 10 полностью собранных комплектов, которые включают в себя всё необходимое для сборки своего собственного устройства: — МК Atmega328P-PU — Преобразователь уровня CD4050BE — Дисплей Nokia 5110 — Приемник RDA5807M — Программатор USBasp — Операционный усилитель LM386N — Разъемы под МК и программатор — USB B, Audio Jack 3.5, три кнопки, провода, однорядные коннекторы — 11 резисторов и 12 конденсаторов, 4 индуктивности, кварц, стабилитрон и светодиод — Динамик — Печатная плата Для сборки понадобится припой, флюс и паяльник, больше ничего не нужно. Все комплектующие упакованы в небольшую коробку из «крафтового» картона: Исходники прошивки уже выложены на Github; Gerber-файл, принципиальная схема и инструкция по сборке будут также опубликованы позднее. Микросхема RDA5807M — это FM радиоприемник нового поколения с поддержкой RDS/RBDS и цифровым управлением по I2C. Микросхема выполнена по CMOS технологии, что определяет ее минимальное энергопотребление. RDA5807M уже содержит все необходимые узлы и требует лишь небольшого числа внешних компонентов. А мощный аудиопроцессор обеспечивает оптимальное качество звука при различных условиях приема. Все это делает RDA5807M удачным выбором для носимых, портативных устройств. В интернет магазинах распространен модуль RRD-102v2, на котором распаяны RDA5807M, кварцевый резонатор и пара компонентов обвязки. В данной статье я опишу как подключить этот модуль к Ардуино и что нужно знать для создания радиоприемника на его основе.

Объяснение программы для Raspberry Pi

Полный код программы приведен в конце статьи, здесь же мы кратко рассмотрим его основные фрагменты.

Программировать плату Raspberry Pi в нашем проекте мы будем с использованием языка Python3. Также можно использовать и язык C/C++ как и в плате Arduino, однако в данном случае преимуществом написания программы на языке python является то, что на нем написана специальная библиотека для работы с модулями nRF24l01, которую можно скачать с ее официальной страницы на github. Но здесь необходимо отметить, что наша программа на python и указанная библиотека должны находиться в одном и том же каталоге, иначе программа на python не сможет найти библиотеку. После скачивания библиотеки извлеките ее из архива и создайте отдельный каталог, в котором будут храниться все программы и библиотеки вашего проекта. Когда установка библиотеки будет закончена, можно приступать к написанию программы.

Первым делом в программе необходимо подключить (импортировать) все используемые библиотеки.

Python

import RPi.GPIO as GPIO
import time
import spidev
from lib_nrf24 import NRF24

1
2
3
4

importRPi.GPIO asGPIO

importtime

importspidev

fromlib_nrf24 importNRF24

Далее установим режим работы контактов (GPIO mode) платы Raspberry Pi «Broadcom SOC channel», что будет означать что мы будем обращаться к контактам платы по их физическим номерам (а не по их номерам на плате).

Python

GPIO.setmode(GPIO.BCM)

1 GPIO.setmode(GPIO.BCM)

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

Python

pipes = , ]

1 pipes=0xE0,0xE0,0xF1,0xF1,0xE0,0xF1,0xF1,0xF0,0xF0,0xE0

Инициализируем модуль nRF24l01 используя контакты GPIO08 в качестве CE и GPIO25 в качестве CSN.

Python

radio.begin(0, 25)

1 radio.begin(,25)

Установим размер пакета (payload size) 32 бита, адрес канала 76, скорость передачи данных 1 Мбит/с и выходную мощность модуля на минимум.

Python

radio.setPayloadSize(32)
radio.setChannel(0x76)
radio.setDataRate(NRF24.BR_1MBPS)
radio.setPALevel(NRF24.PA_MIN)

1
2
3
4

radio.setPayloadSize(32)

radio.setChannel(0x76)

radio.setDataRate(NRF24.BR_1MBPS)

radio.setPALevel(NRF24.PA_MIN)

Откроем каналы и начнем в них запись данных. Также будем выводить на экран основные параметры (details) работы модуля nRF24l01.

Python

radio.openWritingPipe(pipes)
radio.printDetails()

1
2

radio.openWritingPipe(pipes)

radio.printDetails()

Подготовим сообщение в форме строки. Это сообщение мы будем передавать плате Arduino UNO.

Python

sendMessage = list(«Hi..Arduino UNO»)
while len(sendMessage) < 32:
sendMessage.append(0)

1
2
3

sendMessage=list(«Hi..Arduino UNO»)

whilelen(sendMessage)<32

sendMessage.append()

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

Python

while True:
start = time.time()
radio.write(sendMessage)
print(«Sent the message: {}».format(sendMessage))
send
radio.startListening()

1
2
3
4
5
6

whileTrue

start=time.time()

radio.write(sendMessage)

print(«Sent the message: {}».format(sendMessage))

send

radio.startListening()

Если передача сообщения завершена и радио канал закрыт (не доступен) более 2-х секунд, то выведем на экран сообщение о том, что время истекло (timed out).

Python

while not radio.available(0):
time.sleep(1/100)
if time.time() — start > 2:
print(«Timed out.») # print error message if radio disconnected or not functioning anymore
break

1
2
3
4
5

whilenotradio.available()

time.sleep(1100)

iftime.time()-start>2

print(«Timed out.»)# print error message if radio disconnected or not functioning anymore

break

Закрываем прослушивание (listening) радио канала, закрываем соединение и заново открываем соединение спустя 3 секунды чтобы передать другое сообщение.

Python

radio.stopListening() # close radio
time.sleep(3) # give delay of 3 seconds

1
2

radio.stopListening()# close radio

time.sleep(3)# give delay of 3 seconds

Предыстория

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

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

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

Plot

«Tune in for a change» is the tagline attached to Radio in the credits. The storyline is about a girl Priya who comes to the city for a job as a salesgirl in a jewellery shop,with a load of debt to pay off, played by Sarayu. She is new to the ways and customs of the city life. Her co-worker, Iniya character Shweta, gives her accommodation, since she has no place or relative home to stay in the city. Shweta goes out at every night, where Nishan’s character Manu, comes to pick her up. Whole picture of the storyline is clear, Shweta. a five star prostitute and associate Manu as pimp,for securing her business. It is a shock to Priya when she realizes the truth about Shweta and decides to leave her friendship and apartment.

Прошивка

Отдельно стоит остановиться на прошивке. Она написана на C++ и мы распространяем её по лицензии GPLv3: https://github.com/xtremespb/fm_receiver.Я практически не разрабатывал на C/C++, поэтому (вероятно) код далёк от идеала и может содержать ошибки, но GPL на то и GPL, чтобы можно было его дорабатывать сообществом Текущие возможности прошивки включат в себя: — Ручную и автоматическую настройку станций — RDS — Управление громкостью — Включение режима усиленных басов — Включение и отключение подсветки дисплея — Отображение и динамическая визуализация уровня сигнала В следующей, четвёртой по счёту ревизии, мы сделаем ещё несколько полезных «фишек»: подключим левый и правый каналы к аналоговым входам на МК, что позволить «визуализировать» поступающий аудиосигнал. Кстати, возможности устройства не ограничиваются радио! Никто не мешает, например, написать какую-нибудь игру (интереса ради я сделал старый добрый Arkanoid) или другую программу, использующую возможности платы.

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

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

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

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

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

Шаг 3. Проектирование корпуса

Поскольку мы собираемся спроектировать сложный корпус и собираемся использовать множество деталей, мы сначала должны смоделировать каждую деталь в Fusion 360. Таким образом, мы будем уверены, что каждая деталь будет идеально подходить и корпус достаточный, чтобы вместить все внутри. Ушло около недели, чтобы научиться моделировать детали в Fusion 360, а затем смоделировать всё остальное. Еще неделя ушла на разработку корпуса в Fusion 360. Скачать все файлы вы можете ниже:

Результат того стоил. Дизайн выглядит фантастически, а все детали отлично располагаются внутри корпуса. Еще одна интересная особенность, которую предлагает Fusion 360 — это возможность создавать высококачественные рендеры вашего дизайна с использованием различных материалов и видеть, как проект будет выглядеть в реальности.

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

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

Простая мембранная клавиатура

Подключение клавиатуры к 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: Включить или выключить звук на выходе.

Тестирование работы FM приёмника

Когда на схему нашего проекта подается питание происходит сброс модуля RDA5807M и установка в нем канала по выбору пользователя. При вращения ручки потенциометра, отвечающего за настройку приемника на требуемую частоту, подключенного к контакту A0, значения, считываемые платой Arduino Nano с этого контакта, изменяются. Если разница между старым и новым значениями больше 10, мы считаем это изменение истинным (то есть произошедшим не вследствие действия шума) и изменяем в соответствии с ним канал, на который будет настроен радиоприемник. Уровень громкости звука мы изменяем с помощью потенциометра, подключенного между контактом 3 и GND.

Более подробно работа нашего 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 регистрах некоторые биты зарезервированы. Регистры выполняют такие функции как изменение уровня, смена канала и т.д.

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

Добавим LCD дисплей и энкодер

Да, я люблю использовать в своих проектах LCD2004 с I2C интерфейсом и энкодер вращения. Это уже привычные для меня элементы создания пользовательского интерфейса. Используя их, я могу сосредоточиться на текущей задаче, а не заморачиваться с изобретением велосипеда. Поэтому сейчас я добавил их в схему:

Схема радио с дисплеем и энкодером
Макет радио с дисплеем и энкодером
  • Поиск радиостанции вверх/вниз и отображение частоты
  • Регулировка громкости
  • Ввод значения частоты энкодером
  • Выбор поведения при повороте энкодера: регулировка громкости или поиск радиостанции
  • Установка ряда параметров, отвечающих за звук и шумоподавление
  • Сохранение настроек в EEPROM и чтение их при включении радио

На этом пока всё. Продолжение будет в следующей публикации с обзором RDS.Схема радиоприемника</figcaption>

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

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

Регистры RDA5807M

Управление работой RDA5807M заключается в обращении к его регистрам: изменяя одни регистры, мы производим необходимые нам настройки; из других можно читать различную информацию (флаги, данные RDS и т.д.). Регистры 16-разрядные, их адреса и назначение приведены в даташите. Описание весьма скудное, поэтому я решил сам «пощупать» каждый регистр, чтобы понять какой бит за что отвечает. Для этого была написана следующая программа:

Управление работой RDA5807M с компьютера

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

Шаг 2. Электроника

Прежде всего, начнем с электронике, которая является основой нашего радио Ардуино. Сейчас используется Arduino Nano, но позже мы будем использовать Arduino Pro Mini для более низкого энергопотребления. Схема всех наших соединений:

Далее, как и в любом проекте (не только радио) мы собираем все детали вместе и тестируем до того, как поместим всё в корпус.

Если мы включим проект, то увидим, что на дисплее Nokia в течение нескольких секунд отображается заставка, а затем радиостанция загружает из памяти EEPROM предыдущую радиостанцию, которую мы слушали. Мы можем изменить частоту и громкость соответственными ручками. Проект работает нормально. Теперь нужно сделать проект меньше по размеру, чтобы уместить его в корпус. Для этого мы собираемся использовать Arduino Pro Mini. Плата очень маленькая по размеру, а также предлагает более низкое энергопотребление. Мы также собираемся использовать маленькую макетную плату для пайки некоторых компонентов на ней. Но перед этим нужно разработать корпус в Fusion 360 — бесплатное, но чрезвычайно мощное программное обеспечение.

Характеристики 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) в тех случаях, когда требуется отключение питания радио в целях энергосбережения.

Итоговый результат

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

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