Сегодня день Радио, поздравляю всех причастных 😀
Жутко хочу освободить время и вкатиться в эту тему, это интереснейшее занятие (как мне видится со стороны)
Недавно решил поковырять RDS
Немного справки (для тех кто знает - пропускайте)
Если вы когда-нибудь видели на автомагнитоле название станции вроде ROCK FM, бегущую строку с текстом песни или автоматическую установку времени, значит вы уже пользовались RDS, просто не задумывались об этом
Через RDS станция может передавать:
PS- короткое имя станцииRT- радиотекстPI- код станцииCT- время станции
Для исследовательского или радиолюбительского проекта это уже набор наблюдаемых цифровых признаков:
- на какой частоте что реально вещает
- как называется станция
- какой у неё PI-код
- передаёт ли она радиотекст
- насколько корректно у неё выставлено RDS-время
- как это всё меняется в разных местах
Что значит я сделал
Идея простая:
QTH/MaidenheadPostgreSQLИтог - получается живая карта наблюдений по локаторам, а не просто поток сырых логов
Почему здесь именно 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-пакеты с координатами и временем45454GET_GPS,<device_id>GPSCaster отвечает текущим fix- время
- latitude
- longitude
- accuracy
qthtsЕсли GPS-время не удалось получить:
- прошивка пробует
NTP - если
NTPтоже не дал времени, идёт локальный счётчик от последней успешной синхронизации
Это не полноценный GPS-ресивер, но для задачи сбора подобной информации, более чем подходит
Будет желание - заходите
Если будет интересно - заходите, будем вместе собирать данные - выложу исходники прошивки и протокол передачи данных

Qiita - 人気の記事