Привет, Хабр! Гроза - захватывающее явление… Раскаты грома, сверкание молний вызывает загадочную палитру чувств и желание понять, как рождается молния, в какой точке неба начинается ее путь и где заканчивается. А что если принять радиосигнал молнии и попытаться его запеленговать? Вот об этом и пойдет сегодняшний рассказ.

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


Приемная часть

Молния - это искра, импульс. Как известно из теории радиосигналов, любой импульс имеет бесконечный спектр. Это означает, что принимать сигнал импульса можно в широком диапазоне частот, вплоть до гигагерц, на которых молнию слышно, но гораздо слабее, а длительность импульса короче, чем на участке от 0 до 30 кГц. Т.е. прием нужно вести именно в этом участке частот - от 0 до 30 кГц. Для этого радиосигнал нужно доставить от антенны по коаксиальному фидеру к блоку оцифровки, обработать в нем и визуализировать.

 Классическая схема простого цифрового приемника
Классическая схема простого цифрового приемника
  1. Антенна + малошумящий усилитель + полосовой фильтр (0..90 кГц)

    В качестве антенны использовали MiniWhip с фильтром низких частот (ФНЧ) установленным внутри самой антенны. ФНЧ имеет частоту среза около 90 кГц, ниже опускать частоту среза не следует, - зарежем частотный спектр принимаемой молнии, а выше нет необходимост��, - будем иметь ненужные данные, которые в ЦОС будут откинуты. Антенна MiniWhip - активная, ей требуется питание для работы. Напряжение питания 12В поступает на антенну по коаксиальному кабелю. По этому же кабелю идет высокочастотный сигнал от антенны, который отделяется от питания при помощи эжектора, и поступает на модуль АЦП. Такие антенны с ФНЧ 0..90 кГц для нас сделал Антон (RA0SMS), спасибо ему огромное!

     Антенна MiniWhip. Размещена на своей собственной мачте. Дерево - калина
    Антенна MiniWhip. Размещена на своей собственной мачте. Дерево - калина
  2. Модуль АЦП

    На хабре попалась статья, как из недорогого высокоскоростного АЦП AD9200 сделать SDR приемник (https://habr.com/ru/articles/204310/), схема их этой статьи была взята за основу модуля АЦП.

     Схема модуля АЦП
    Схема модуля АЦП

    Несколько модернизировали входную часть АЦП, приведя вход к 50 Ом при помощи трансформатора. 50 Ом - это стандарт, коаксиальные кабели и разъемы имеют такое волновое сопротивление, не внося потери в сигнал. Все должно быть согласовано! Вначале согласующий трансформатор сделали на ферритовом кольце марки 6000НН. Его частотный диапазон, где КСВ был меньше 2.0, составлял от 15 кГц до 1000 кГц - это нас не устроило! Нужный нам частотный диапазон 0..30 кГц с максимумом энергии молнии частично выпал. Заменили этот трансформатор на низкочастотный звуковой ТОТ-4 и согласование с входом АЦП достигнуто!

     График КСВ входа детектора с трансформатором ТОТ-4 на плате АЦП. КСВ увеличивается с ростом частоты, и на 37 кГц оно составляет 2.0
    График КСВ входа детектора с трансформатором ТОТ-4 на плате АЦП. КСВ увеличивается с ростом частоты, и на 37 кГц оно составляет 2.0

    Модуль АЦП теперь может принять аналоговый сигнал, оцифровать его и передать на обработку. Когда грозовой фронт близко, в момент мощного разряда, сигнал молнии приводит к переполнению АЦП. При этом АЦП устанавливает бит - “переполнение”. Этот бит нужно передать вместе с данными АЦП.

    Получается, с модуля АЦП выходят сигналы:

    • 10 бит данных - 1 сэмпл АЦП

    • 1 бит - переполнение АЦП

    • 1 бит - тактовый генератор

       Внешний вид модуля АЦП на базе AD9200
      Внешний вид модуля АЦП на базе AD9200

Прием данных от модуля АЦП и их дальнейшая обработка

В сигнале с модуля АЦП требуется найти импульс и сохранить его. Этим будет заниматься приемная часть, за основу которой был взят одноплатный компьютер OrangePi One с шиной GPIO

 Сердце и мозг обрабатывающей части - OrangePi One (Х - значит хороший)
Сердце и мозг обрабатывающей части - OrangePi One (Х - значит хороший)

Как будем использовать этот одноплатник:

  • обработка поступающего от АЦП цифрового сигнала по шине GPIO

  • детекция молнии и сохранение этого сигнала

  • веб сервер с админкой и визуализацией сохраненных снимков молний, с возможностью экспорта сигнала на свой ПК или телефон

АЦП AD9200 может тактировать частотой до 20 МГц. Требуется понять, с какой частотой сможем работать по шине GPIO. Пробовали:

  • написать модуль ядра на прерываниях - очень медленно

  • работа с sysfs - медленно

  • библиотека wiringOP - быстро

Из готовых решений можно взять только wiringOP. По нашим замерам, она справляется примерно с 200 кГц, но нам нужно быстрее. Да и библиотека заточена под управление пинами по отдельности. А нам нужно использовать 10 пинов как набор бит одного числа. Поэтому спускаемся в недра документации на процессор и ищем разметку памяти GPIO и пишем свою реализацию работы с пинами.

С GPIO работаем напрямую, читая и записывая память ОЗУ, через /dev/mem. Это позволило нам считывать за раз 4 байта, биты которых показывают, в каком состоянии находится пин. За одно такое считывание мы получаем 10 бит АЦП, 1 бит переполнения АЦП и 1 бит PPS с GPS модуля. Чтобы получить все данные с модуля АЦП за одно считывание, требуется использовать один чип GPIO. Мы выбрали GPIO A, - на плате большая часть ножек с него, на изображении ниже выделены красным.

 Разметка памяти чипов GPIO. Адреса вычислены вручную, отталкиваясь от базового адреса из даташита процессора Allwinner H3  на подсистему PIO (Pin I/O) 0x1c20800
Разметка памяти чипов GPIO. Адреса вычислены вручную, отталкиваясь от базового адреса из даташита процессора Allwinner H3 на подсистему PIO (Pin I/O) 0x1c20800

Проверка скорости шины GPIO

А как же проверить скорость шины GPIO? Потребуется две программы:

  • ПЛИС. На языке Verilog HDL была написана простая программа для ПЛИС. Программа с заданной нами частотой увеличивает число (от 0 до 1023) и выводит его на свои пины

  • OrangePi One. Программа на C++, в цикле без пауз считывает состояние шины GPIO. Формирует из бит шины число и сохраняет в массив. После нескольких секунд работы цикл прерывается. В консоль выводится записанный массив чисел.

Соединяем пины ПЛИС с шиной GPIO платы OrangePi One. Запускаем программы.

 Процесс замера скорости шины GPIO. Слева - ПЛИС, справа плата Orange Pi One. Светодиоды на ПЛИС показывают текущее состояние бит
Процесс замера скорости шины GPIO. Слева - ПЛИС, справа плата Orange Pi One. Светодиоды на ПЛИС показывают текущее состояние бит

Таким образом, если мы обнаруживали, что числа пропускаются (например в выводе консоли 1, 2, 5, 6, 8, 9), то мы понимаем, что частота смены числа в ПЛИС высокая. Если значения идут четко друг за другом (1, 2, 3, 4, 5) без пропусков, значит мы идем на пределе. И вот только когда мы видим повторения чисел (1, 1, 2, 2, 2), мы понимаем, насколько быстрее генератора ПЛИС мы считываем шину GPIO. При частоте смены числа в 1 МГц, мы видели повторения каждого числа по 4-6 раз. Это означает, что наш цикл в пять раз быстрее генератора ПЛИС и точно не пропустит смену состояния тактора АЦП.

Поэтому мы выбрали частоту генератора АЦП 500 кГц. Это дает нам понимание, что мы считываем 10 бит данных правильно без ошибок, при этом успеваем рассчитывать динамический порог срабатывания детектора, и сохранять сигнал. В нашем подходе есть нюанс: загрузка одного из четырех ядер процессора OrangePi One всегда составляет 100%

Прием и обработка данных модуля АЦП

Модуль АЦП подключен к шине GPIO. Он передает на одноплатник следующие данные:

  • Сигнал тактового генератора 500 кГц. В ПО ждем спад фронта этого сигнала на пине GPIO. По спаду фронта данные АЦП готовы для считывания

  • 10 бит данных АЦП - каждый бит подключен к своей ножке GPIO

  • 1 бит переполнения АЦП

Детектирование импульса программное. В непрерывном потоке данных на лету рассчитываем уровень шума на основе доработанного под наши задачи алгоритма EMA (экспоненциальное скользящее среднее)

Записанный сигнал с АЦП с рассчитанным динамическим порогом
Записанный сигнал с АЦП с рассчитанным динамическим порогом

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

Пример срабатывания детектора
Пример срабатывания детектора

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

Система синхронизации по времени

Для определения места удара молнии используется метод TDoA (Time Difference of Arrival). Этот метод требует точных координат места и времени приема сигнала каждым детектором в сети. Чтобы получить точное время приема и координаты детектора применяем навигационный модуль с сигналом PPS (Pulse Per Second).

Пример навигационного модуля с выводом PPS
Пример навигационного модуля с выводом PPS

После того как навигационный модуль захватил сигнал со спутников и рассчитал внутреннее время, на его выходе появляется сигнал PPS. Этот сигнал поступает на GPIO OrangePi One. Считывая этот сигнал мы получаем достаточную точность синхронизации между детекторами (погрешность всё равно велика, но это лучше, чем просто брать системное время)

Сигнал PPS в начале каждой секунды с модуля GPS, длина 100 мс
Сигнал PPS в начале каждой секунды с модуля GPS, длина 100 мс
Наши тесты синхронизации времени между детекторами. Получили максимальное расхождение времени ~25 мкс. Поясним: за 1 мкс радиосигнал успевает пройти примерно 300 метров
Наши тесты синхронизации времени между детекторами. Получили максимальное расхождение времени ~25 мкс. Поясним: за 1 мкс радиосигнал успевает пройти примерно 300 метров
Процесс проверки синхронизации трех плат по PPS
Процесс проверки синхронизации трех плат по PPS

WEB-консоль

WEB-консоль (она же админ-панель) предназначена для просмотра сигналов, которые принял детектор.

Общий вид админ-панели
Общий вид админ-панели

Что в ней можно делать:

  • просматривать принятые сигналы

  • применять к сигналу ФНЧ 35 кГц

  • видеть состояние OrangePi One (загрузка CPU, место на диске, состояние RAM)

  • обновлять ПО детектора

  • перезагружать детектор

  • сохранять понравившийся сигнал в формате JSON на свое устройство (например, чтобы поделиться с другими ловцами молний)

  • загружать сигнал в формате JSON от другого ловца молний в админ-панель (чтобы полюбоваться)

 Пример загруженного сигнала в админ-панели
Пример загруженного сигнала в админ-панели
Меню
Меню

Детектор

Осталось собрать все воедино, для этого нужен корпус. Проще всего сделать корпус - напечатать его на 3D принтере. Первый блин корпус, как всегда, комом.

Первая попытка сделать печатный корпус
Первая попытка сделать печатный корпус

При разработке корпуса нами были допущены ошибки:

  • тонкие стенки

  • не все отверстия были предусмотрены

  • неудобная сборка

  • не предусмотрено место для БП

 Пробовали сделать алюминиевый корпус
Пробовали сделать алюминиевый корпус
Пробовали использовать готовый пластиковый корпус
Пробовали использовать готовый пластиковый корпус

Однако все время что-то нам не нравилось. Решили обратиться к Владимиру (инженеру по моделированию и 3D печати). Он нам здорово помог. В итоге получился вот такой красавец:

Детектор. Вид спереди
Детектор. Вид спереди
Детектор. Вид сзади
Детектор. Вид сзади

Теперь корпус нам нравится. Что мы получили:

  • сборка превратилась в конструктор

  • БП внутри, нет лишних блоков снаружи

  • хорошее охлаждение стабилизатора

  • приятный внешний вид

Детектор. Процесс сборки
Детектор. Процесс сборки

Заключение

Таким получился наш путь от идеи "поймать радиосигнал молнии" в реальный, работающий девайс. Планы на будущее:

  • применить нейросети для классификации сигналов молния/не молния

  • добавить в WEB-консоль возможность прослушивания свистящих атмосфериков

  • попробовать применить магнитную ферритовую антенну

  • добавить в детектор управление внешними устройствами через реле (например, чтобы обесточить важный объект при близкой грозе)

  • написать сервер для:

    • отображения сети детекторов на карте

    • расчета координат молний (пеленгация методом TDoA)

    • рассылки уведомлений о грозе рядом

    • сбора статистики и данных для исследований

Но это уже в следующих тактах жизненного генератора.

Для желающих собрать такой детектор и присоединиться к приему молни�� прикладываем репозиторий: https://gitverse.ru/atribolt/raskat-detector В репозитории есть:

  • гербер-файлы для самостоятельного заказа платы модуля АЦП

  • проект “PCAD 2006” (схема, плата и библиотеки)

  • инструкция как установить ПО детекции и WEB-консоли на OrangePi One

@RN3KK @atribolt