Последние рыбалки показали, что стабильность базы оставляет желать лучшего. Не понятно почему, но база перестает принимать сигнал от жерлиц через какое то время после начала работы. Причем частота отказа больше, если в настройках стоит меньшее время опроса жерлиц, меню “Пинг”. После беглого тестирования, выяснилось, что сама база продолжает работать нормально, а вот LoRa модуль перестает получать пакеты данных. Данная проблема существовала и в начальных версиях базы, я тогда подумал, что она происходит из-за удаленности LoRa модуля от источника питания, однако нет.
Проблема, в полях, может быть решена двумя путями:
- В меню “Пинг” выставить максимально большое время опроса жерлиц, чтобы LoRa модуль работал как можно реже
- Перезагружать базу, выполняя загрузку последней удачной конфигурации, чтобы загрузить настройки установленных жерлиц.
Но проблему надо решать, а идей, почему она возникает, и как ее устранить, очень мало. В итоге, после нескольких дней поиска, в документации к LoRa нашелся вот такой абзац:
Тут производитель предупреждает, что при (каких-то?) внешних воздействиях, LoRa может перейти в StandBy режим, который как раз и характеризуется проблемами, что мы имеем.
Долгими тестами удалось определить, что когда LoRa переходит в StandBy режим, меняется всего один бит одного из регистров (REG_IRQ_FLAGS), спасибо статистике – Конфигурация LoRa Модуля, который был добавлен после этой рыбалки За щукой на р. Сережа
Как вариант решения, в код ПО я добавил функцию контроля LoRa модуля (каждые 5 секунд), если проблема возникает, LoRa программно перезагружается. Для статистики записывается и количество появлений такой проблемы, чтобы можно было оценить, сколько раз зависает LoRa в единицу времени. Результаты, кстати, оказались очень нестабильными, при пинге раз к 3 секунды, проблема могла возникнуть и 10 раз в час, и ни разу за несколько часов…
Данный вариант работает, но хочется же разобраться, что это за “external perturbation” о которых предупреждает производитель, и как от них избавиться?
Другой возможной причиной сбоя LoRa модуля могут быть высокочастотные колебания питания, которые образуются после LDO преобразователя. Я попробовал добавить дроссель, в цепь питания LoRa для сглаживания колебаний, вот как то так
База работала три часа, но все равно за этот период один раз был сбой модуля, программа перезагрузила его и он продолжил работать в штатном режиме. Делаю вывод, что дроссель особо не повлиял на стабильность работы LoRa модуля. Но так как есть решение с его перезагрузкой, пока не буду больше заниматься этой проблемой.
По итогам рыбалок и тестирования, выявляется еще одна неприятная проблема. База зависает через некоторое время после начала работы. Причем, зависание воспроизводится чаще, чем чаще выставлен пинг жерлиц. В этот раз зависает именно сама база, а не какой то модуль. Удалось примерно, определить очаг проблемы. Arduino (в нашем случае STM32) микроконтроллер имеет так называемую SPI шину (Serial Peripheral Interface), в STM32 таких шин две, но контакты одной из них используются для дисплея, остается одна дополнительная шина на которой мне пришлось расположить LoRa модуль и модуль работы с sd картой. Теоретически, при запросе данных от LoRa и SD, система имеет переключатель, так что SPI шина работает одновременно только с одним устройством. Практически же, когда данные приходят в LoRa модуль вызывается прерывание на определенном контакте контроллера, и вызывается функция обработки прерывания. В функции обработки прерывания так же идет обмен данными с LoRa модулем, точнее получение информации о пакете данных. Получается, что основная функция контроллера (основной loop цикл), и функция обработки прерывания, в один и тот же момент могут запросить использование LoRa и sd модулей, одновременно, по одной SPI шине. Я предполагаю, что такое использование SPI шины выходит за рамки нормальной ее работы и вызывает зависание.
Как решать эту проблему…? Вопрос…
Тестирование занимает много времени, так как проблема плавающая. Пока, для стабильной работы в меню Пинг надо выбрать время опроса жерлиц – чуть побольше, например 30 секунд