вторник, 21 января 2020 г.

Радио на RDA5807M. Часть 2 - RDS

Радио на RDA5807M. Реализация RDS

RDS (Radio Data System) — многоцелевой стандарт, предназначенный для передачи информационных сообщений по каналам FM-радиовещания. Передача информации осуществляется с использованием поднесущей частоты и не оказывает влияния на качество основного сигнала и каналы других радиостанций, а для ее приема требуется устройство с поддержкой RDS. Наибольшее распространение эта технология получила в автомобильных приемниках: с ее помощью стало возможным оповещение водителей о сложных дорожных ситуациях, метеоусловиях и т.п.


В США RDS существует в виде несколько измененного стандарта, называемого RBDS (Radio Broadcast Data System) и адаптированного для удовлетворения конкретных потребностей североамериканских FM-радиостанций.

Технологию RDS/RBDS поддерживают многие современные микросхемы FM-радиоприемников. Также существуют отдельные микросхемы для извлечения RDS информации из радиосигнала  - RDS-препроцессоры. И те, и другие берут на себя всю работу, связанную с выделением и демодуляцией RDS/RBDS сигнала, его декодирование, поиск и коррекцию ошибок. Разработчику предоставляются уже готовые к использованию данные. В сегодняшней публикации я расскажу о том, что содержится в этих данных и как с ними работать на примере FM-радиоприемника RDA5807M.

Техническая спецификация RDS

Спецификация стандарта RDS закреплена международным стандартом IEC 62106 и поделена на части, каждая из которых описывает определенные его принципы: модуляционные характеристики и кодирование основной полосы частот, формат сообщений, кодирование и определение характеристик RDS, ряд других не особо интересных моментов. Это первоисточник информации по RDS, ответы на все возникающие вопросы следует искать в этой спецификации. Последнюю её версию можно скачать на форуме RDS по ссылке http://www.rds.org.uk/2010/RDS-Specification.htm Там же вы найдете ссылку - электронный адрес, на который нужно отправить свой запрос на получение пароля для открытия PDF файла спецификации.

На момент написания данной статьи действующей является редакция спецификации от 2018 года. Она значительно изменилась по сравнению с предыдущими версиями. В частности она описывает стандарт RDS2, призванный решить проблему недостаточной ёмкости RDS за счет использования дополнительных поднесущих (до 3 поднесущих):

Поднесущие RDS и RDS2
Поднесущая RDS и три дополнительных поднесущих RDS2

БОльшая ёмкость позволяет улучшить существующие функции технологии RDS и реализовать новые: передавать более детальную информацию о дорожном движении; использовать UTF-8 для текстовых сообщений, т.е. появляется поддержка нелатинских символов; передавать графику, например, для отображения логотипов радиостанций, и многое другое.

Логотипы радиостанций на дисплее автомагнитолы с поддержкой RDS2

Это всё здорово, но приемники серии RDA5807 разработаны давно (их даташиты датируются 2008 - 2011 годами) и умеют работать только с RDS первой версии. Поэтому нам подойдут и прошлые редакции спецификации, которые можно найти в открытом доступе в интернете. Например, эта: RDS_IEC_62106_1999_Standard.pdf

И ещё один хороший ресурс по теме: http://www.g.laroche.free.fr/english/rds/groupes/listeGroupesRDS.htm

Со спецификацией и её версиями разобрались, переходим к рассмотрению формата RDS сообщений.

Формат RDS сообщений


Структура RDS группы: блоки, информационные и контрольные слова
RDS группа, информационные и контрольные слова

Данные в RDS передаются группами по 104 бита. Каждая группа состоит из 4 блоков по 26 бит. Каждый блок содержит информационное слово (16) бит и контрольное слово + смещение (10 бит). Контрольное слово используется для обнаружения и коррекции ошибок. Значение смещения уникально для каждого из 6 возможных блоков и используется для синхронизации, т.е. определения границ блоков и групп.

Структура группы RDS
Общая структура RDS групп

Каждая группа начинается со значения Programme Identification (PI) code - идентификационный код радиостанции. Это значение уникально для каждой радиостанции и занимает первое информационное слово целиком. Представляется как четырехразрядное шестнадцатеричное значение.

Сразу хочу сделать оговорку. В спецификации повсеместно используется термин programme: Programme Identification code, Programme Type code, Programme Service name и т.д. И в русскоязычных публикациях на тему RDS везде приводится их дословный перевод: код идентификации программы, код типа программы, служебное название программы - везде "программа", хотя, на мой взгляд, более уместным здесь было бы слово "радиостанция". Его я и буду использовать в дальнейшем, думаю, так будет понятнее.

Продолжим рассмотрение формата RDS групп. Первые 4 бита (от старшего к младшему разряду) второго блока содержат код группы. Это значение от 0 до 15.

Следующий бит блока определяет версию группы:
  • 0 - версия A
  • 1 - версия B
Совместно эти два параметра определяют назначение группы, т.е. помогают интерпретировать содержимое остальных блоков. Поэтому их используют при обозначении групп, например, 0A, 0B, 1A и т.д.

Группы версии B имеют особенность: их третий блок всегда дублирует значение первого блока - Programme Identification code.

Следующий бит второго блока отведен для флага Traffic Programme (TP) identification. Он сигнализирует о том, что данная радиостанция передает информацию о дорожном движении.

Следующие 5 бит второго блока - это Programme Type (PTy). Данное значение определяет тип контента радиостанции в соответствии со следующей таблицей:

PTy код Тип контента RDS Тип контента RBDS (для Северной Америки)
0 No programme type or undefined No program type or undefined
1 News News
2 Current affairs Information
3 Information Sports
4 Sport Talk
5 Education Rock
6 Drama Classic rock
7 Culture Adult hits
8 Science Soft rock
9 Varied Top 40
10 Pop music Country
11 Rock music Oldies
12 Easy listening Soft music
13 Light classical Nostalgia
14 Serious classical Jazz
15 Other music Classical
16 Weather Rhythm and blues
17 Finance Soft rhythm and blues
18 Children’s programmes Language
19 Social affairs Religious music
20 Religion Religious talk
21 Phone-in Personality
22 Travel Public
23 Leisure College
24 Jazz music Spanish Talk
25 Country music Spanish Music
26 National music Hip Hop
27 Oldies music Unassigned
28 Folk music Unassigned
29 Documentary Weather
30 Alarm test Emergency test
31 Alarm Emergency

Перечисленные выше значения наиболее важные в RDS и их извлечение не должно требовать анализа других блоков, чтобы быть максимально быстрым. Поэтому они присутствуют во всех группах, вне зависимости от их типа и версии. И чтобы данное преимущество было в силе для значения PI code, которое дублируется в третьем блоке групп версии B, для него используется отличное значение смещения. Это помогает сразу идентифицировать данный блок без обращения ко второму блоку для проверки версии. Такая возможность предусмотрена стандартом, а реализована ли она в декодере конкретной микросхемы - это другой вопрос. Например, RDS декодер RDA5807M абстрагируется от внутренней организации групп и их версий, он лишь предоставляет нам декодированные значения блоков.

Что касается остальных разрядов, то их назначение зависит от номера и версии группы. Для их расшифровки следует обращаться к спецификации.

Функции RDS

Реализация RDS в управляющей программе FM-приемника сводится не к декодированию абсолютно всех возможных групп, а к реализации конкретных функций. И, как правило, реализация ограничивается несколькими основными функциями, к которым относятся PI, AF, PS, TP, TA. Для этого достаточно разобрать всего 2 группы: 0A и 0B. Перечень функций RDS и соответствующих им групп приведен в следующей таблице:

Функция
Описание
PI Programme Identification - отображение идентификационного кода радиостанции. Данные для функции присутствуют во всех группах.
AF Alternate Frequency - Альтернативная частота. Используется для передачи альтернативной частоты текущей радиостанции, на которую может настроиться приемник в случае ухудшения сигнала. Использует группу 0A.
PS Programme Service Name - Название радиостанции. Позволяет передавать короткое (до 8 символов) название. Использует группы 0A, 0B.
TP Traffic Programme identification - Признак трансляции сообщений о дорожном движении текущей радиостанцией. Присутствует во всех группах.
TA Traffic Announcement identification - Признак трансляции сообщений о дорожном движении в данный момент. Может использоваться для автоматического увеличения громкости приемником, выхода из других режимов работы (CD/USB) и т.п. Группы 0A, 0B.
CT Clock Time and date - Текущие время и дата. Данная информация может использоваться для автоматической подстройки часов или для вывода на дисплей. Группа 4A.
DI Decoder Identification - Идентификация декодера. Позволяет передавать информацию для приемника: моно/стерео, использование сжатия. Группы 0A, 0B, 15B.
EON Enhanced Other Networks information - Расширенная информация о других сетях. Используется для передачи информации (альтернативные частоты, название, признаки передачи дорожных сообщений и др.) о других радиостанциях, связанных с текущей. Может быть использована для переключения на одну из таких станций в момент передачи сообщений о дорожном движении. Группа 14A.
EWS Emergency Warning System - Система аварийного оповещения. Предназначена для обеспечения кодирования предупреждающих сообщений. Эти сообщения передаются только в критических ситуациях и определяются только специальными приемниками. Данная функция использует группу 9A.
IH In House application - Для внутреннего использования. Позволяет передавать радиостанцией служебную информацию для своих нужд. Разделяет группы 6A и 6B с функцией ODA.
M/S Music Speech switch - Индикатор музыка/речь. Используется приемниками с раздельной регулировкой громкости для музыкальных передач и речи. Группы 0A, 0B и 15B.
ODA Open Data Applications - Открытые прикладные программы данных. Позволяет программам данных, заранее не определённым стандартом, передаваться в числе предопределенных групп RDS. Использует группы 3A, 3B, 4B, 7B, 8B, 9B, 10B, 11A, 11B, 12A, 12B, 13B, а так же следующие группы, если они не используются другими функциями: 5A, 5B, 6A, 6B, 7A, 8A, 9A, 13A.
PTY Programme TYpe - Тип радиостанции. Позволяет определить тип контента текущей радиостанции (новости, музыка, спорт и т.д.), может использоваться для поиска соответствующей радиостанции. Все группы.
RP Radio Paging - Радиопейджинг. Предполагает использование радиостанций и их трансляций в качестве транспорта для передачи коротких сообщений. Использует функции 1A и 7A, если они не задействованы ODA.
RT RadioText - Радиотекст. Передача коротких, до 64 символов, текстовых сообщений, отображаемых на табло приемника. Использует группы 2A и 2B.
TMC Traffic Message Channel - Канал автодорожных сообщений. Предназначен для передачи кодированной информации о дорожной обстановке. Группа 8A.
TDC Transparent Data Channels - Прозрачные каналы данных. Состоят из 32 каналов, которые могут использоваться для передачи любого типа данных. Функция использует группы 5A и 5B.

Выбираем из предложенного списка интересующие функции, разбираемся с соответствующими группами по спецификации или ресурсу G. Laroche, и добавляем их поддержку в свою программу.  Конечно, при условии, что эти группы передаются местными радиостанциями.

Алгоритм работы с RDS на RDA5807M

Сопоставим изложенный материал с нашим RDA5807M. Итак, радио включено и настроено на радиостанцию. 
  1. Для работы с RDS мы устанавливаем флаг RDS_EN регистра 02H.
  2. Если радиостанция передает сообщения по стандарту RDS, то приемник начнет принимать их, бит за битом. При этом еще не понятно к какому блоку относится очередной бит и где границы блоков и групп. Поэтому приемник анализирует входящую последовательность в поисках известных ему значений: смещений. Встретив такое значение, становится известно какой это блок. С этого момента RDS декодер синхронизирован. Данный факт отражается установкой флага RDSS регистра 0AH.
  3. Когда принята очередная группа, RDA5807M помещает в регистры 0CH, 0DH, 0EH, 0FH декодированные информационные слова и устанавливает флаг RDSR регистра 0AH. Другие микросхемы данной серии, имеющие дополнительные выводы, позволяют выводить данный флаг на один из своих выводов и использовать его для генерации прерываний микроконтроллера. В RDA5807M таких выводов нет, поэтому нам остается периодически опрашивать флаг RDSR. Здесь встает вопрос как часто его опрашивать. Скорость передачи данных стандартом RDS составляет 1187.5 бит/c, передача одной группы (104 бита) занимает ~87.6мс, данный временной интервал делится примерно поровну на два промежутка, в течение которых RDSR установлен в 1 и сброшен в 0. Таким образом, чтобы не пропустить получение очередной группы, интервал опроса RDSR не должен превышать 40мс.
  4. При передаче сообщений возможны ошибки, поэтому каждый блок дополняется контрольным словом. Декодер использует его для коррекции ошибок. Информация о количестве выявленных декодером ошибок указывается в битах BLERA, BLERB, BLERC, BLERD регистров 0BH и 10H. При числе ошибок более 5 блок считается поврежденным и не может быть использован.
  5. Отследив установку флага RDSR и убедившись в корректности принятых данных, можно выполнять их расшифровку.
Это общий принцип, отражающий роль флагов и регистров RDA5807M в процессе разбора RDS. На практике же ситуацию осложняют ошибки в декодированных блоках, тогда как значения BLERA..BLERD говорят об их отсутствии. В даташитах и руководствах на микросхемы RDA5807 я не нашел ни слова об этом. А, например, в руководстве по использованию RDS/RBDS в Si4701/03 (это микросхема FM-радиоприемника с поддержкой RDS от Silicon Labs) описаны такие понятия, как ошибка и отказ декодера. Это различные по своей природе явления, приводящие к одному результату - неверному декодированию RDS данных. Поэтому в управляющей программе требуется их постобработка. Полагаю, так же обстоит дело и с микросхемами RDA5807. Ниже наглядный пример этой проблемы: постоянно меняющееся содержимое регистра 0CH в RDA5807M, в котором должен быть идентификатор радиостанции - неизменное значение.

RDA5807M RDS errors
Изменяющееся в следствие ошибок значение регистра 0CH (идентификатор радиостанции)

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

Реализация RDS функций на RDA5807M и Ардуино

Прежде чем приступать к реализации интересующих функций не лишним будет изучить, какие группы передают местные радиостанции. Для этого я написал скетч, показывающий значения принятых блоков, номер и версию группы. Схема подключения RDA5807M к Ардуино приведена в прошлой публикации, предлагаю заглянуть тем, кто не читал её. Заодно я опробовал метод обнаружения некорректно декодированных данных. Заключается он в том, чтобы на основании повторяющихся подряд значений блока A принять решение о его корректности. Затем при получении последующих групп сравнивать их первый блок с принятым ранее за эталонный. И если значения различаются, то вся группа считается некорректной. В случаях, подобных приведенному выше, когда нет возможности определить идентификатор радиостанции из множества случайных значений, это не поможет избавиться от ошибок, но зато и программа не будет пытаться расшифровать принятую кашу. А в остальных случаях метод неплохо работает:

Пример некорректно декодированных RDS данных

Как видите, ошибка в первом блоке нередко говорит о неверном значении и в других блоках. Это позволило выявить некорректные группы. В моем случае групп 13, 5, 12 точно не может быть в передаваемой последовательности: радиостанции в моем городе передают только 0, 1 и 4 группы. Касательно ошибок добавлю, что их наличие зависит от удаленности передающей станции и условий приема.

Итак, местные радиостанции передают всего три группы: 0A, 1A и 4A. С их помощью я могу вывести ID и название радиостанции (функции PI и PS), тип контента (PTY) и текущее время (CT). Мне бы, конечно, хотелось вывести исполнителя и название песни, полагаю, это реализуется поддержкой радиотекста, но увы. Приходится работать с тем, что есть. Поэтому для примера использования RDS я приведу реализацию перечисленных функций.

С выводом идентификатора станции всё понятно: в приведенном ранее скетче уже имеется код для установления его валидности. И хотя он помогает выявить некорректные группы, описанный метод не избавляет от ошибок на 100%. Поэтому для значения PTy я добавил дополнительную проверку: валидным PTy считается значение, принятое два раза подряд, т.е. совпадающее с принятым ранее.

Для вывода названия радиостанции уже необходимо обратиться к спецификации за описанием формата групп 0A и 0B:

Формат группы 0A

Группа 0B отличается от 0A только тем, что в третьем блоке вместо информации об альтернативной частоте передается значение PI code. Таким образом, для извлечения названия радиостанции достаточно проверить тип группы, а её версия не принципиальна.

Для передачи названия радиостанции в стандарте RDS отведено 8 символов. Они передаются парами в четвертом блоке групп 0A и 0B. Если название короче 8 символов, то оставшиеся позиции заполняются пробелами. Чтобы понимать, какая по счету пара получена в данный момент, в структуре группы отведены два разряда C1 и C0:

C1 C0 Принятые символы
0 0 1й и 2й символы названия
0 1 3й и 4й символы названия
1 0 5й и 6й символы названия
1 1 7й и 8й символы названия

Ниже приведен пример четырех групп 0A, в которых передается название EUROPA+ . Кстати, эти же группы вы можете видеть в приведенном ранее скриншоте с некорректными RDS данными.

Блок A Блок B Блок C Блок D Биты C1C0 Первый символ Второй символ
7760 0128 E0CD 4555 00 E U
7760 0129 E0CD 524F 01 R O
7760 012A E0CD 5041 10 P A
7760 012F E0CD 2B20 11 + (пробел)

И опять же помним о возможности принятия некорректного символа. В добавок к этому необходимо учесть следующий момент: многие радиостанции используют функцию Programme Service Name для передачи текста длиной более 8 символов. При этом текст передается частями: сначала первые 8 символов, через некоторое время следующие и так далее. Такой механизм не приветствуется стандартом RDS, тем не менее он существует и называется Scrolling Program Service Name (SPS). С учетом сказанного возможна ситуация, когда мы собрали часть символов от первой порции SPS, часть от второй и вывели полученное значение на дисплей. Чтобы избежать этого я опять же воспользовался тем фактом, что символы названия передаются многократно и можно судить об их корректности, сравнивая с полученными ранее. Если символы различаются, то либо они из разных частей SPS, либо имеет место ошибка, в любом случае ожидаем повторную передачу до получения неизменного значения.

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

RDS данные Радио Рекорд

RDS данные радио Европа Плюс

RDS данные Радио Родных Дорог

И мне остается описать группу 4A, в которой передается дата и текущее время. Опять обращаемся к спецификации и находим формат данной группы:

Формат группы 4A

Дата передается в формате Modified Julian Date (модифицированная юлианская дата, ссылка на вики: https://ru.wikipedia.org/wiki/Юлианская_дата) и представляет из себя пятизначное десятичное значение. Если мы хотим выводить дату, то придется преобразовать ее от MJD к привычному нам виду - дате по Григорианскому календарю.

Для передачи текущего времени в RDS выбран стандарт всемирного координированного времени - UTC. Здесь проще, чем с датой: одни разряды отражают часы 0-23, другие минуты 0-59 и еще 6 разрядов определяют смещение относительно UTC и его знак. Сразу приведу пример для пояснения:

Пример разбора RDS группы 4A

В данном примере разбирается группа 7753 4141 CBE5 0386. В соответствии с приведенным ранее форматом группы 4A выделяем из нее значения, определяющие день по MJD, часы, минуты, смещение и его знак. Формула расчета дня, месяца и года по известному значению MJD приведена в одном из приложений спецификации. Я в примере выше воспользовался онлайн конвертером Modified Julian Day Converter. Далее к часам и минутам прибавляем смещение (оно передается не в часах, а в получасах) и получаем текущие дату и время - 18.01.2020 19:14. Это же время указано в мониторе порта.

Кстати, в приведённом логе монитора порта вы можете видеть группы 2A, которые используются для передачи радиотекста. Вот только передаются в них одни пробелы. К сожалению. На других радиостанциях группу 2A я больше не встречал.

Группа 4A в соответствии со стандартом RDS должна передаваться единожды в момент изменения минут, расхождение не должно превышать 0,1с. Так приемное RDS устройство сможет подстроить свои внутренние часы и их отклонение от эталонных будет минимально. На практике же я столкнулся с тем, что радиостанции не придерживаются спецификации и передают информацию о времени кто как: кто каждую секунду; кто раз в минуту, но при этом передают время, уже учитывающее смещение, которое также присутствует в блоке D и учитывается затем в моем скетче, в итоге выводится время на 4 часа большее действительного. Даже там, где всё передается в соответствии со стандартом, передаваемое время порой сильно расходилось с реальным (на 19 минут в скриншоте RDS данных радио Европа Плюс). Кроме того у нас нет возможности проверить корректность принятых данных, поскольку группа 4A передается 1 раз в минуту.  Суммарно всё это вызывает сомнения в целесообразности разбора данной группы. По крайней мере в моих условиях.

Заключение

В заключение хочу сказать, что результат знакомства с RDS меня несколько разочаровал. Дело не в самом стандарте, а в передаваемых местными радиостанциями данных: единственное, что представляет в них интерес - это название станции. Больше мне взять нечего. Надеюсь, эта статья всё-таки дала представление о стандарте RDS и реализации его функций в управляющей программе. В будущих публикациях я планирую применить изложенный материал при создании карманного радио и радио с часами-будильником на Ардуино, должно получиться интересно.

PS. В предыдущей публикации я привел скетч радио на RDA5807M с дисплеем и энкодером. Сейчас я дополнил его кодом для вывода названия радиостанции, скетч доступен по ссылке. Функция включается через меню Tuner options - RDS. 

33 комментария:

  1. Вот уж спасибо так спасибо !!!
    Я перед новым годом - творил на кухню радиоприемник на RDA5807 - с часами на DS1302, c термометром -гигрометром на DH11 и уперся в нехватку памяти 328-й ардуины.
    Надеюсь теперь , после прочтения ваших СУПЕР-подробных описаний чипа и регистров - не брать громоздкие библиотеки - а написать более лаконичный скетч !

    Спасибо еще раз и всех благ вам !

    ОтветитьУдалить
    Ответы
    1. Благодарю за положительный отзыв! Рад, что публикации понравились, потому что действительно пришлось поработать над ними, перелопатить и сопоставить массу информации.
      Позже сам планирую сделать радио с часами. Только на DS3231, чтобы была еще функция будильника.

      Удалить
  2. поправьте код в шаблоне сайте. Когда открываешь картинку слева сбоку тусуются теги <_div><_/div> :)

    ОтветитьУдалить
    Ответы
    1. Спасибо за наводку, но сходу исправить я это не смогу, а разбираться сейчас не хотелось бы. Я планирую переезд на другую платформу, так что пусть остаётся как есть.

      Удалить
  3. А где же обещанное испровление ошибок.

    ОтветитьУдалить
  4. Ответы
    1. Обнаружение ошибок в скетче есть, его принцип в статье расписан. Примеры выявленных некорректных блоков приведены - способ работает. Или вы ожидали 100% исправления ошибок вне зависимости от того, что было принято?

      Удалить
  5. Этот комментарий был удален автором.

    ОтветитьУдалить
    Ответы
    1. А вы его включили? В статье сразу после ссылки на скетч: "Функция включается через меню Tuner options - RDS."

      Удалить
  6. В общем нашел один косечек усебя RDS включен, видимо скапировался код прихватив непечатные символы😁

    ОтветитьУдалить
  7. И поитогу 10H регистр никаго отношения к ошибкам в блоках CD не отвечает, тестил сигнал с трансмиттера по факту с читаемым названием станций и радиотекста в старшем блоке 55 что никак не укладывается в вашу теорию.

    ОтветитьУдалить
    Ответы
    1. Моя теория основана на том, что регистр 10h упоминается в даташитах на другие микросхемы семейства RDA5807 именно как источник BLERC и BLERD. А также на том, что от микросхемы к микросхеме их управляющие регистры и биты не меняются: например, в RDA5807M нет интерфейса I2S, для которого в других микросхемах отведён регистр 06h, и всё же он не занят в этой микросхеме другим функционалом. Для меня это основание считать, что и 10h имеет то же назначение, что и в других микросхемах с поддержкой RDS, не смотря на то, что он не описан в даташите. Плюсом к этому тот факт, что содержимое 10h изменяется только при установленном RDS_EN. Достаточно убедительно?

      Касательно значения 55 (если оно действительно было) - вы можете утверждать, что оно никак не совместимо с корректными данными в блоке D? Учитывая, что реализация RDS декодера в подобных микросхемах - это изначально допускающее ошибки решение. Некорректные данные вполне возможны при валидных значениях BLERA-BLERD. Возможен ли обратный вариант? - Я бы не исключал.

      Удалить
  8. Просматривался и младшая часть данного регистра, он просто обнуляется, причем значение 0х37 0х00 формируется и на радиостанциях с отсутствием RDS, складывается впечатление что регистр 10H как то связан с уровнем сигнала или точной настройкой на станция. Пока не встречал упоминаний данного регистра для тюнеров серии RDA5807, хотя описания английского и китайского варианта сильно отличаются в описании регистров. В общем пока сделал ориентации на младший байт 10Н регистра как то с ним ошибок стало чуть меньше, хотя это субъективное мнение на мощных станциях все стабильно.

    ОтветитьУдалить
  9. Вопрос №1:
    После 20-30 минут работы происходит "зависание". (Радиостанцию принимает, но перестает меняться информация RDS и невозможно энкодером перестроить на другую радиостанцию). При повторном включении питания - приём и настройка восстанавливается. Как устранить такое?

    ОтветитьУдалить
    Ответы
    1. Сходу не скажу. Попробую разобраться.

      Удалить
    2. Вы тоже проверьте, будет ли зависать при выключенном RDS

      Удалить
  10. При выключенном не зависает.
    Если будете переписывать скетч, "руссифицируйте" меню в частности для дисплеев не поддерживающих кирилицу.

    ОтветитьУдалить
  11. Очень познавательно в плане освещения принципов работы RDS.
    К сожалению соглашусь, что соблюдение стандартов в вещании у радиостанций явно не в приоритете. Для своего региона (Кировская область) целесообразным посчитал разбор только группы 0x0A/0x0B, так как в остальных творится полный "АдЪ и Израиль".
    Спасибо за статью!

    ОтветитьУдалить
  12. Доброго времени суток можно как то реализовать поддержку управлением радио через приложение Blynk ваш скетч адаптировать под esp8266 и еsp32 с добавлением виртуальных спинов для управления через блинк! Очень нужно помогите! Мой вайбер 0678448875 Николай

    ОтветитьУдалить
  13. Пока управляю rda5807m через Blynk вот таким скетчем! Помогите адаптировать этот скетч под Blynk ссылка https://blynk.hackster.io/B45i/dhwani-fm-radio-with-wifi-connectivity-87a1e1

    ОтветитьУдалить
  14. Ispolzoval chast vashego koda po "Scrolling Program Service Name" na NPX chip TEF6686.
    Exelent - samij ludshij kod iz 5 oprobaovannih variantov raznih avtorov.

    ОтветитьУдалить
    Ответы
    1. Здорово!
      Сейчас бываю здесь редко, поэтому отвечаю долго

      Удалить
  15. Не могу найти где RDA5807M_FLG_DE передаётся микруху... По умолчанию стоит 75, значит надо менять, но где и как вы это делаете не получается понять... Говорила мне мама учи микроконтроллеры, а я в строители пошёл.

    ОтветитьУдалить
  16. Владимир можно ваш код использовать для создания паста на форуме сайта паяльник естественно с ссылкой на этот сайт как источник?
    Немного сделал устройство устройством на 1 плате мк328 рдс и усилитель на лм386 и дисплей 1602.
    Вы не пробовали переписать код под 8 мегу ?

    ОтветитьУдалить
    Ответы
    1. Добрый день!
      Последнее время сильно загружен, нет времени ни на статьи, ни даже на комментарии...
      Да, конечно, можете использовать код

      Удалить
  17. Здравствуйте, как можно отключить звук на пустой (шумовой) частоте на фм радио, что для этого использовать?

    Я использую FM-модуль RDA5807M.

    пример :

    vzssssssssssssssssssssssssssssssssssssss (белый шум)

    ОтветитьУдалить
  18. Здравствуйте, я тоже делаю фм радио, у меня вопрос. Как работает шумоподавление RDA5807? Я не хочу слышать шум на пустых частотах. Есть ли способ предотвратить это?

    Кроме того, нет ли функции сохранения изменений, внесенных нами в компьютерную программу RDA5807M, например, она сохранит изменения, внесенные в экспорт, в виде файла arduino и выведет его.

    ОтветитьУдалить
  19. Здравствуйте Владимир. С сайта пропали картинки. Восстановите пожалуйста.

    ОтветитьУдалить
  20. а можно это чудо на 1602 подправить , LCD2004 не имею , а на 1602 не вся информация отображается , заранее спасибо

    ОтветитьУдалить
    Ответы
    1. можно еще и инфракрасный датчик прикрутить для ПДУ и соотвецтвенно с пульта перевод с сохранением настроек в ждущий режим и будет вообще супер !!!!!
      Только начал осваивать arduino , учимся вместе с сыном , он паять , а я читать и писать программы

      Удалить
    2. пду прикрутить не могу ....... надо же еще знать кодировку кнопок пду чтоб все соотвецтвовало .... чтот лыжи пока не едут....

      Удалить