Сегодня день Радио, поздравляю всех причастных :)
Жутко хочу освободить время и вкатиться в эту тему, это интереснейшее занятие (как мне видится со стороны)
Недавно решил поковырять RDS
Немного справки (для тех кто знает - пропускайте)
Если вы когда-нибудь видели на автомагнитоле название станции вроде ROCK FM, бегущую строку с текстом песни или автоматическую установку времени, значит вы уже пользовались RDS, просто не задумывались об этом
Через RDS станция может передавать:
PS - короткое имя станции
RT - радиотекст
PI - код станции
CT - время станции
Для исследовательского или радиолюбительского проекта это уже набор наблюдаемых цифровых признаков:
на какой частоте что реально вещает
как называется станция
какой у неё PI-код
передаёт ли она радиотекст
насколько корректно у неё выставлено RDS-время
как это всё меняется в разных местах
Что значит я сделал
rds.2big.cc - это веб-приложение для отображения таких наблюдений
Идея простая:
Устройство сканирует FM-диапазон
Ловит станции и читает RDS
Прикладывает к observation своё местоположение в виде QTH/Maidenhead
Отправляет observation в backend
Backend складывает всё в PostgreSQL
Frontend показывает локаторы на карте и даёт посмотреть последние приёмы и историю
Итог - получается живая карта наблюдений по локаторам, а не просто поток сырых логов
Почему здесь именно QTH/Maidenhead
Проект не использует точечные координаты как основной индекс отображения. Вместо этого observations группируются по Maidenhead-локаторам
Это даёт несколько практических преимуществ:
визуализация на карте остаётся простой
можно легко сравнивать районы, а не отдельные GPS-точки
locator хорошо знаком радиолюбителям
анонимность++
Как устроен сканер
Железная часть проекта - это устройство на ESP8266 + SI4703, которое последовательно сканирует FM-частоты и читает RDS
Что делает устройство:
проходит по диапазону FM
измеряет RSSI
ждёт стабилизации RDS-данных
собирает лучшие кандидаты для PI, PS, RT, CT
формирует observation
отправляет его в backend (mqtt/rest)
Вообще изначально была идея увидеть какие станции передают время и насколько оно точно отдаётся
Так же, была попытка запуститься на ESP32 + RDA5807M, но нет - похоже библиотека, которая работает с радио не очень хорошо обрабатывает RDS и часто получал пургу
Почему ESP8266 не использует отдельный GPS-модуль
Можно было бы поставить на сканер внешний GPS-модуль, но для такой задачи это часто избыточно:
лишняя плата
лишнее питание
лишняя антенна
лишняя сложность
Вместо этого проект использует компаньон на Android
Android-компаньон GPSCaster
ndroid-приложение на Kotlin. Оно работает как локальный GPS-ретранслятор для устройств в той же Wi-Fi сети
Что делает GPSCaster:
получает положение телефона через FusedLocationProviderClient
запускает foreground service
держит в памяти последний валидный fix
шлёт UDP broadcast в LAN
слушает UDP-запросы GET_GPS
шлёт GPS в BLE (тут кстати, отдельная идея - в принципе рассылать GPS через BLE advertisement)
отвечает пакетом:
GPS,<unix_timestamp_seconds>,<lat>,<lon>,<accuracy_meters>
Порт протокола: 45454
То есть телефон фактически выступает как "сетевой GPS и источник времени" для ESP8266
Это удобная идея:
телефон и так уже знает точные координаты
не нужно ставить отдельный GNSS-модуль на каждое устройство
можно быстро развернуть систему в машине или в полевых условиях
Как связаны ESP8266 и GPSCaster
Связка работает так:
GPSCaster периодически рассылает в локальную сеть UDP-пакеты с координатами и временем
ESP8266 слушает порт 45454
Если свежих GPS-данных нет, ESP8266 может сам отправить GET_GPS,<device_id>
GPSCaster отвечает текущим fix
ESP8266 получает:
время
latitude
longitude
accuracy
По координатам прошивка вычисляет qth
По времени ставит ts
Если GPS-время не удалось получить:
прошивка пробует NTP
если NTP тоже не дал времени, идёт локальный счётчик от последней успешной синхронизации
Это не полноценный GPS-ресивер, но для задачи сбора подобной информации, более чем подходит
Будет желание - заходите
Если будет интересно - заходите, будем вместе собирать данные - выложу исходники прошивки и протокол передачи данных
#проекты #деньрадио #esp8266 #rds
