Несколько датчиков на одном радиоканале.

akas
Offline
Зарегистрирован: 16.03.2021
Нужно связать несколько несколько датчиков (4-5) с "базовой станцией" по радиоканалу 433 МГц на модулях HC-12. Датчики срабатывают редко, но в непредсказуемые моменты времени.  Между срабатываниями микроконтроллер датчика в глубоком сне. Срабатывает обычно один, реже два расположенных рядом датчика. Все вместе одновременно - почти никогда. На "базовой станции" нужно с минимальной задержкой определять номер сработавшего датчика. Упрощающее обстоятельство - девственно чистый радиоэфир (тайга), усложняющее - максимальная экономия батареек.

Поломал голову, как минимизировать коллизии, т.е. одновременную отправку сигнала разными датчиками.
Пока такая мысль: При срабатывании датчик в течение пары секунд передает свой номер в цикле с задержкой, причем у всех задержки разные, периоды повтора не кратны друг другу.
 
Например, пусть передача номера занимает 1 мс, периоды повтора двух датчиков 11 и 13 мс. Если они отправили сигнал одновременно, следующее совпадение будет через 11 * 13 = 143 мс. В промежутке первый датчик отправит сигнал 9 раз, второй 11 раз, и эти сигналы не пересекутся друг с другом по времени. Для 4х датчиков подбираем 4 некратных периода 11 13 17 19 и т.п. Конечно, сигналы могут скелиться (один за другим подряд) и точной синхронизации нет, коллизий будет чуть больше но все равно немного.
 
Кажется что это должно сработать. 
Но не покидает ощущение что изобретаю велосипед и вероятно кривой. 
Может, уже есть известное решение такой задачи, или идеи получше?
DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

akas пишет:
как минимизировать коллизии, т.е. одновременную отправку сигнала разными датчиками.

Если возьмёшь протокол с контролькой и квитированием, на коллизии станет похрену. 

b707
Offline
Зарегистрирован: 26.05.2017

akas пишет:

Может, уже есть известное решение такой задачи, или идеи получше?

передача с подтверждением приема. Пока "база" не ответит датчику - он шлет сообщение в цикле. Необходимость в перепосылке будет возникать крайне редко, только при коллизиях - поэтому этот вариант будет экономичнее, чем каждый раз слать свой ID в эфир по многу секунд

brokly
brokly аватар
Offline
Зарегистрирован: 08.02.2014

Ну разве что выделить датчикам свои тайм слоты, но тогда нужно как то синхронизировать время на датчиках. 

akas
Offline
Зарегистрирован: 16.03.2021

b707 пишет:
передача с подтверждением приема. Пока "база" не ответит датчику - он шлет сообщение в цикле.
Согласен, батарейки сэкономит. Но тут есть и другой момент. 
Пока база отвечает первому датчику, может оживиться  соседний второй датчик и "испортить" ответ базы первому. В итоге база первому не подтвердит, а сигнал второго вообще не услышит (HC-12 полудуплексный), и цикл повторится. Главное чтобы такой цикл все-таки завершался за разумное время.
Пока первый ждет подтверждения базы, он услышит второго, и мог бы учесть в планировании повторного запроса, но как-то совсем сложно будет...

Кстати, вариант  - пусть база отправляет подтверждение не сразу, пусть у нее тоже будет свой уникальный период для отправки подтверждений (не кратный периодам датчиков)...?

brokly пишет:
Ну разве что выделить датчикам свои тайм слоты, но тогда нужно как то синхронизировать время на датчиках.
Это усложняет протокол (регулярная синхронизация по сообщениям с базы) либо железки (rtc?) - скорее всего приведет к большому расходу батареек.

 

 

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

Мда.

brokly
brokly аватар
Offline
Зарегистрирован: 08.02.2014

akas пишет:

brokly пишет:
Ну разве что выделить датчикам свои тайм слоты, но тогда нужно как то синхронизировать время на датчиках.
Это усложняет протокол (регулярная синхронизация по сообщениям с базы) либо железки (rtc?) - скорее всего приведет к большому расходу батареек.

 
Вот RTC как раз ооочень хорошо поможет сэкономить батарейку.
akas
Offline
Зарегистрирован: 16.03.2021

DetSimen пишет:
Если возьмёшь протокол с контролькой и квитированием, на коллизии станет похрену.

Покопал поглубже про радиомодуль HC-12, похоже многое уже есть на уровне железа.
Он сделан на хитрой SI4463 с кучей режимов, которая не тупо транслирует UART в эфир, а сама добавляет контрольки, заголовки, перепаковывает все и передает на другой скорости. Например в дефолтном режиме FU3 на входе модуля 9600 в эфире 15000 bps. Вот тут с SI4463 поигрались https://www.radiokot.ru/circuit/digital/security/33/
А перед SI4463 стоит еще и контроллер STM8S, кроме преобразования UART-SPI наверняка еще что-то полезное делает. К сожалению, какие он настроаивает контрольки и чем занимается еще - тайна за семью печатями. Народ поснифал работу модуля  rtl-sdr приемником, там явно сложный протокол, а иногда наблюдались повторные отправки пакетов. Возможно  и квитирование какое-то есть, хотя в доке написано "However, considering ambient interference and other factors, if thousands ofdata size is sent continuously at a time, some number of bytes may be lost". Если будет время поснифаю сам, может разберусь.
Пока заметил только, что ни разу на выходе приемника не было битого пакета. Либо все без ошибок либо ничего. Контрольки там наверняка включены. 

brokly
brokly аватар
Offline
Зарегистрирован: 08.02.2014

Они не там включены, а в библиотеке которую используешь.

akas
Offline
Зарегистрирован: 16.03.2021

brokly пишет:
Они не там включены, а в библиотеке которую используешь.

Нет никакой библиотеки для этого модуля, у него только голый Serial.
Выводы  питание, RX/TX и "SET", если не нем "1", то через RX/TX обмен данными с эфиром, иначе обмен AT командами с модулем.  
UART у модуля честный, надо соблюдать скорость. Нельзя просто так послать в эфир импульс нужной длительности, подав 1 на TX.
AT команд с десяток, одна из них позволяет выбрать режим радиообмена, 1 из 4х.
AT обрабатывает контроллер STM на плате модуля, и сам настраивает SI4463 через ее SPI.
У SI4463 под сотню разных настроек, в т.ч. контрольных сумм которые она добавляет/проверяет.
Но они недоступны через AT команды, можно выбрать только 1 из 4 режимов, за которыми спрятаны эти настройки. Чтоб добраться до них, надо делать свою прошивку для STM, но мне слабО.

 

 

akas
Offline
Зарегистрирован: 16.03.2021

Вот тут описано, во xто превращаются при передаче байты, поступившие на UART модуля
https://www.silabs.com/documents/public/application-notes/AN626.pdf
Все это делает сама SI4463, но детальная настройка всего этого через AT команды недоступна.  


 

brokly
brokly аватар
Offline
Зарегистрирован: 08.02.2014

akas пишет:

brokly пишет:
Они не там включены, а в библиотеке которую используешь.

Нет никакой библиотеки для этого модуля, у него только голый Serial.
Выводы  питание, RX/TX и "SET", если не нем "1", то через RX/TX обмен данными с эфиром, иначе обмен AT командами с модулем.  
UART у модуля честный, надо соблюдать скорость. Нельзя просто так послать в эфир импульс нужной длительности, подав 1 на TX.
AT команд с десяток, одна из них позволяет выбрать режим радиообмена, 1 из 4х.
AT обрабатывает контроллер STM на плате модуля, и сам настраивает SI4463 через ее SPI.
У SI4463 под сотню разных настроек, в т.ч. контрольных сумм которые она добавляет/проверяет.
Но они недоступны через AT команды, можно выбрать только 1 из 4 режимов, за которыми спрятаны эти настройки. Чтоб добраться до них, надо делать свою прошивку для STM, но мне слабО.

Ну какой модуль сказано не было. Еще круче, все за тебя делает STM она и включает все плюшки. А голая SI4463 легко может работать и без всяких "прокладок". Но САМА SI4463 не делает нихрена.  Что бы она что то сделала ее нужно настроить, да и прием отправка не просто выплюнуть данные в эфир. Так что разницы никакой. Что дубиной по лбу, что лбом по дубине.