nRF24L01+ и непредсказуемое нарушение стабильности связи
- Войдите на сайт для отправки комментариев
Железо:
Сервер:
мега2560 с модулем Ethernet, питается от 5 вольт, поданных на разъем USB от мощного импульсного БП. Усиленное (с внешней антенной) радио висит на проводах длиной около 20 см, питается от разъема на меге.
Устройство №1 (У1):
мега2560, питается от БП 12 вольт. Подключение NRF разведено на плате, подключенной шлейфом к меге.
Устройство №2 (У2):
Мини про 5V (меряет температуру и управляет небольшим приводом), питается от лития напрямую. Подключение NRF разведено на плате, запитано от отключаемого стабилизатора, на плате по питанию танталы.
Принцип работы:
Сервер постоянно слушает эфир. Устройства просыпаются и отправляют данные. Сервер отправляет данные в ответ.
Проблема:
Передается три пакета, после этого пропуск пакетов 100, потом работает какое-то время, а может и нет. После перезапуска все повторяется.
А до этого почти год отработало без особых нареканий (часть пакетов могла теряться, но не на долгое время)…
Больше всего проявилась проблема с парой Сервер+У1. Пытаюсь отладить код - становится хуже, пакеты могут вообще не доходить. Возвращаю работавший ранее код, а исходного состояния не получить, связи нет. Если бы не это, грешил бы на код. Его проверка пока что результатов не принесла, да и хочется однозначно выяснить - проблема в коде или железе. Самое непонятное - в итоге с первоначальным кодом, хоть и не идеально, но работает.
Часть устройств кладу в сон, радио инициализируется перед каждой отправкой пакета.
Читал:
- http://forum.amperka.ru/threads/nrf24l01-побеждаем-модуль.3205/
- http://arduino.ru/forum/apparatnye-voprosy/otvalivaetsya-nrf24
и еще всего понемногу в интернете
Что делать?
Видел видео в ютубе - https://www.youtube.com/watch?v=IV9eiSZp3rY - там интересный проверочный код на самописной библиотеке, но он для IAR, на Arduino IDE портировать я не смог.
Если у кого-нибудь будут мысли, как лучше всего систематизировать проверку, буду очень признателен.
Причин может быть бесконечное множество. Например, чей-то (может даже и ваш) беспроводной роутер сменил канал и теперь сидит на частотах ваших устройств. Вайфай работает большей мощностью и он в состоянии создать грандиозные проблемы для устройств типа NRF24L01. Блютузы всякие, опять же. Диапазон 2.4ггц сейчас довольно плотно заселен, кроме того, в нем же работают всякие свермощные постановщики помех, навроде микроволновок. Соседка снизу взялась размораживать рыбу, а по всему подъезду от этого вайфай просел. Куда там до передачи данных посредством 24L01.
Не зная всех обстоятельств, рекомендации могут быть только общего плана: меняйте рабочий канал, шлите данные минимально-короткими пакетами, снижайте скорость, используйте избыточность.
Мы этот проект вместе делаем. Система находится загородом, "эфир" чистый, мы проверяли. Какой-то скетч, который показывает заполнение диапазона. Видно, где роутер работает, где сервер. Больше ничего. Очевидные решения вроде электролитов по питанию пробовали.
А какой софт используется? Библиотеки или самописанное что-то?
Библиотека RF24 от maniacbug. Я еще маленький форк написал, но только на прием, а перестает работать передача.
Посмотреть, что там принимается можно так: отключите "Auto Acknowledgment" (регистр ENABLE_AA = 0) на приемнике. Если ничего нет, то отключите CRC (бит 3 регистра CONFIG). Уменьшите длину адреса (регистр SETUP_AW). При отключенном CRC приемник может начать принимать мусор. Если он это делает очень активно, есть смысл поменять канал. Если наоборот, ничего не принимается, то это возможно указывает на железные (хотя могут быть и программные) проблемы либо с приемником, либо с передатчиком.
a5021, спасибо, будем пробовать.
P.S. А такого рода скетч на ардуино кто-нибудь видел? Или сможет прикрутить его к IDE (там ссылка на исходники в описании) https://www.youtube.com/watch?v=IV9eiSZp3rY
Отчитываюсь:
Отключение "Auto Acknowledgment" на передающем устройстве координально улучшило ситуацию.
При этом сервером принимается почти 100% пакетов, однако отправлнные обратно пакеты доходят со скважностью оклоло 50%.
Вспомнил про контрафактные модули. И точно, дата выпуска NRF на передающем устройстве 1242AF (см. сюда). Будем пробовать другой.
Отключение CRC решило проблему почти полностью (визуально только пара пакетов из 50 потерялась).
Однако отключение CRC это не самое хорошее решение для данной задачи. Будем тестировать разные частоты.
Вопрос, на основании этих результаты можно считать, что код не влияет на стабильность связи и все дело в железе?
Или отключение ACK и CRC могли компенсировать ошибки в коде?
По вами описанному, сваливать вину на код действительно не очень логично. Скорее можно подозревать тот модуль, который вы назвали приемным или сильно отличающиеся условия прохождения радиосигнала в разных направлениях. Если пока не рассматривать версию с дефектным приемным модулем, то можно выдвинуть предположение, что "ответный" сигнал от приемника к передатчику испытывает сложности с распространением в нужном направлении. Это может происходить, например, по причине пространственной ориентации модуля таким образом, что излучение в сторону приемника у него минимально. Я уже где-то здесь описывал, что типовой модуль NRF24L01 "светит" в разные стороны неравномерно и излучение имеет выраженную диаграмму направленности. Теоретически два модуля можно ориентировать друг относительно друга таким образом, что передающий будет "светить" точно на приемный, а приемный "отвечать" совсем в другую сторону. Односторонняя связь при этом может быть замечательной, а вот двусторонняя по варианту "шиш с маслом".
Из практических рекомендаций могу посоветовать разместить модули таким образом, чтобы плоскостями антенн они "смотрели" друг на друга. При этом сами модули должны "лежать" на одной плоскости. Похожим образом, например, расположены костяшки домино в центре нижеследующего рисунка:
Модули не обязательно размещать вертикально. Главное, чтобы они друг относительно друга были ориентированы похожим образом.
Нет, конечно. Отключение помогло увидеть происходит ли хоть какая-нибудь передача/прием вообще.
sansei4 меня поправит, но проблемы со связью мы испытывали не только там, где взаимная ориентация может снизить эффективность радиотракта. Да, у нас есть периферия, расположенная далеко от сервера, но основная ее часть в том чисте и та, на которой мы сейчас отрабатываем код, стоит к нему близко.
То, что стоит далеко, общается с сервером усиленным радио. Кстати, там тоже есть проблемы. Наверное, sansei4 их опишет корректнее.
a5021, дело в том, что на сервере у нас стоит усиленное радио. А на одних устройствах обычное, на других тоже усиленные. Как их распологать в таком случае? Так?
На данный момент тестируем на расстоянии меньше метра. Неужели ориентация даже при таком маленьком расстоянии так сильно может влиять?... В следующий раз попробуем покрутить их.
На "усиленное радио" очень много жалоб в интернетах, что работает оно даже хуже обычного. Усилитель "прокачивает" сигнал вместе с шумом со входа, что приводит к выдаче мощного сигнала невысокого качества. С близкого расстояния мощный сигнал может вообще перегружать входной тракт приемника. Сразу оговорюсь, что мои соображения больше теоретические, т.к. сам с такими модулями дела не имел.
В качестве общих рекомендаций могу посоветовать попробовать поставить на сервер обычный модуль. Чисто на посмотреть, что изменится.
У штырьевой антенны диаграмма направленности круговая -- т.е. излучает она во все стороны одинаково. Ее крутить нет смысла. Модуль с обычной печатной антенной лучше повернуть "лицом" к приемнику. Еще существуют направленные антенны. Если не требуется держать связь во всех направлениях, то имеет смысл использовать их. Хорошая антенна может оказаться эффективнее набортного усилителя. Я где-то здесь на форуме цитировал импортного чувака, который хвастался, что на направленных антеннах он поднял линк на 2км с помощью обычных модулей.
По поводу радио обычного и усиленного. Делали мы сравнение, как работают они в паре. Одно, усиленное, передавало пакеты (у окна 4 этажа), со вторым отходил по улице от дома. Обычное отвалилась метрах на 50, а усиленное честно держалось до 850м, потом просто прямая видимость закончилась, и стабильность пропала. Пока нареканий на него нет, кроме общей конструктивной несуразицы, ее просто не за что крепить.
Что касается нашей проблемы, то стыдно сказать, но это контакты. Крепление платы выполнено за разъем антенны, а в какой-то момент хомут немного съехал, и антенна при завинчивании стала плохо контачить с разъемом. То есть контакт - есть связь, то он плохой - связь соответствующая.
За информацию по дальности "усиленного" радио -- мерси. В отсутствие собстенного опыта, приму к сведению. Из первых рук получать такие данные полезно.
Хорошо, что нашли корень проблемы. Иначе можно было бы еще долго строить всевозможные предположения с нулевой эффективностью.
По поводу радио обычного и усиленного. Делали мы сравнение, как работают они в паре. Одно, усиленное, передавало пакеты (у окна 4 этажа), со вторым отходил по улице от дома. Обычное отвалилась метрах на 50, а усиленное честно держалось до 850м, потом просто прямая видимость закончилась, и стабильность пропала. Пока нареканий на него нет, кроме общей конструктивной несуразицы, ее просто не за что крепить.
Что касается нашей проблемы, то стыдно сказать, но это контакты. Крепление платы выполнено за разъем антенны, а в какой-то момент хомут немного съехал, и антенна при завинчивании стала плохо контачить с разъемом. То есть контакт - есть связь, то он плохой - связь соответствующая.
помогите решить проблему http://arduino.ru/forum/apparatnye-voprosy/nrf-ne-peredaet-redkie-pakety
Проблема полностью решилась уменьшением мощности "усиленного" радио (хороший контакт помог ненадолго). Причем наблюдается однозначная зависимость стабильности от мощности, а именно на максимальной теряется почти всё, на средней - как придется, а на минимальной практически без потерь. То ли сильный сигнал дает помехи, то ли MADE IN CHINA подвело.
Есть еще вот такой вариант радио.