Как стать автором
Обновить

Комментарии 18

Шаг 0
После того как купили — припаять отсутствующий конденсатор пассивной нагрузки 1-2 пик.
Без него nRF со встроенной антенной захлебывается и часто нормально работает только на пониженных мощностях.
Заголовок спойлера

А подскажите, поможет ли решить данную проблему подключения модуля nRF через кренку?

А подскажите, поможет ли решить данную проблему подключения модуля nRF через кренку?

Решить проблему в целом — сомневаюсь. Не забывайте о ВЧ-помехах по цепи питания nRF и качестве этого питания, которое определяется мощностью источника.
Питать ее только через отдельный стабилизатор. На алике nRF часто продают в комплекте со стабилизатором. Остается только напаять конденсаторы: электролит с керамикой по питанию и под антенну. Можно еще саму плату хорошо пропаять. И после этого они адекватно без сбоев начинают работать.

Заголовок спойлера
image
Помимо упомянутых конденсаторов на шину питания, стабильности работы также способствовало экранирование модулей. Простейший способ: заизолировать и обмотать фольгой, соединив ее с внешней частью разъема антенны (речь про NRF24L01+PA+LNA). Если в конкретном случае поможет, можно придумать что-то поприличнее.

Странно, у меня была только одна проблема — конденсатор не припаял сразу. После этого отлично всё работало, даже меш-сеть с помощью rf24Mesh.

Да, помню, долго мучался с NRF24L01+PA+LNA.
Так что конденсаторы по питанию, экранировка всего модуля и не забыть перепаять конденсатор со встроенной антенны на пигтейл.
Купил Ардуино Нано с модулем NRF24L01 на плате и на удивление модули NRF24L01 заработали без добавочных кондёров и других плясок с бубнами.

aliexpress.ru/item/4000467425667.html?spm=a2g0s.9042311.0.0.264d33edNJKWUt&_ga=2.5222643.155883689.1614133330-1652522173.1583990324&sku_id=10000001883637041
MySensor не пробовали?
Неплохая низкоуровневая библиотека, которая реализует меш сеть.
Работает на NRF24, NRF51 и NRF52 на 2400, а также RFM69 и другие субгигагирцовые модули.
MySensor + E73 (NRF52832) очень даже неплохая связка.
Спасибо!
NRF52832 уже в пути несколько дней, библиотеку скачал сегодня. Буду работать в этом направлении.
На самом деле этот модуль очень просто готовить. Всё что нужно сделать — это обязательно вызвать
radio.stopListening();

в передатчике.

Ну и да, после:
radio.setAutoAck(false);

уже бесполезно выставлять ретраи. Они работают только с включённым autoAck
radio.setRetries(0, 15)


Так что: НЕ отключаем autoack (по дефолту он и так включен), не меняем настройку ретраев (она нормальная сходу). Просто вызываем stopListening на передатчике, и всё работает как часы.

А секрет тут:
github.com/nRF24/RF24/blob/master/RF24.cpp#L847

Функция stopListening «заодно» включает нулевой пайп. И именно этот пайп используется для того, чтобы получить ответ ACK от приёмника. Вместе с этим начинает нормально работать механизм ретраев и пара модулей будут работать как часы.

PS. Необходимости включать нулевой пайп на приёмнике не описана даже в даташите. Да, там описано, что нужно записать в него правильный адрес, но о необходимости его включить — не слова. А без него передатчик с включёнными ретраями будет считать, что отправка провалена, хоть приёмник посылку и получит.
Ваши аргументы не вызывают у меня сомнений. Но перед тем как внести изменения в скетч хотелось проверить их на «железе». Сейчас у меня такой возможности нет. Как только проверю — отредактирую код. Заранее благодарю за понимание.

Я лишь излил результаты своих ковыряний с модулем (видимо у каждого в жизни должен быть этап ковыряния с ним ). Так что разумеется: проверяйте, как будет возможность и руки дойдут

Это все меняет. Я готов внести изменения. Если не трудно — представьте, пожалуйста, свой вариант setup'a для приемника.
github.com/makarenya/nrf24_examples/blob/master/nrf24_receiver.ino
Тут как раз пара передатчик-приёмник. Сделал специально под проверку

Я в растерянности — не знаю, что и думать, посмотрев коды вашей пары передатчик-приёмник на Гитхабе. Вернее, не могу понять причин ошибок в «примерах» — они от невнимательности, непонимания или чего то другого. Далее по порядку:

  • В скетче передатчика функция radio.stopListening(); — обязательна. Без этой функции (вкупе с другими) передатчик будет работать в полнофункциональном полудуплексном режиме. Я об этом дважды написал: набрал буковками «…затем один из пары работающих радиомодулей тестируется на работу в режиме передатчика без ожидания отклика с приемника (шаг 2) …» и в комментарии к функции в скетче: «radio.stopListening(); //радиоэфир не слушаем, только передача». Предполагаю, что ваша «неочевидная магия» тут цитирую: «radio.stopListening(); // Неочевидная магия» неочевидна и магия только для вас.
  • В скетче приемника тоже явная ошибка – не просчитан банальный сценарий, а именно: отсутствие питания приемника. Светодиод не моргает при инициализации и не горит в цикле. Это свидетельствует вроде о том, что радиомодуль инициализирован и по каким-то причинам не принят пакет с передатчика. На самом деле – нет питания. Поэтому, раз уж занялись переводом инфы скетча с монитора последовательного порта на светодиодную, советую добавить еще один светодиод – индикатор питания, аналог функции Serial.println(«ReceiverTester ON»); Кстати, почему в скетче передатчика не светодиодная индикация, а вывод инфы в монитор порта. Логики нет: в одном узле светодиоды, в другом – монитор порта Ардуино.
  • О оптимизации кода я молчу. Например, приемник работает 120 миллисекунд, а потом пауза на 100 мсек, что обозначить результат светодиодом. Получается, что приемник в работе 54 процента от всего времени. Время для приема 50 пакетов из 1000, а это реальная ситуация, будет заоблачным. Прикиньте сами. При этом не забудьте, что передатчик у вас работает с задержками в цикле 100 мсек, узлы не синхронизированы и учтите время на выполнение операций в цикле.


После просмотра ваших скетчей, понял, что надо более критично относиться к отдельным файлам из Гитхаба. Постарайтесь в ближайшее время что-то предпринять со своими «примерами» на Гитхабе, иначе мне придется зарегистрироваться и выложить нечто похожее там. Успехов!

Вы и вправду слишком серьёзно относитесь к примерам с гитхаба ;) Назначений у данного примера было — показать минимально достаточный набор настроек и продемонстрировать устойчивость (или неустойчивость) процесса отправки сообщений. При этом скетч должен позволить решить свою задачу: обеспечить контроль успешности приёма-отправки пакетов. Так, чтобы можно было залить пример на две ардуины и посмотреть, потаскав одну из них из комнаты в комнату.
Поэтому по порядку:


  • Вы считаете очевидным, что функцию stopListening вызывать необходимо? То есть у вас есть некоторое априорное знание, что после включения модуль находится в режиме приёма? Или зачем ещё её надо вызывать? Спешу огорчить, согласно даташиту бит PRIM_RX регистра CONFIG инициализируются нулём — то есть модуль после перезагрузки будет находится в режиме передатчика. Я в первом своём сообщении указал, что именно делает функция stopListening, и почему она так сильно нужна для режима с ожиданием ответа приёмника. При radio.setAutoAck(false); она полностью теряет смысл. Включать нулевой канал на приём нужно именно для того, чтобы получать ответы с приёмника. Можете её выкинуть — работоспособность вашего примера никак не измениться.
  • Я проверял скетч на моей arduino nano, и у неё безо всякого кода есть светодиод индикации питания, зачем мне нужен ещё один? По поводу различия: сериал/светодиод, тут всё просто: один модуль подключен к компу и весьма информативно пишет в сериал всё что с ним происходит. Второй таскается по комнатам. Конечно можно было бы взять второй ноут, но зачем? Тут и так всё понятно — если в течении 120мс не пришло очередного пакета (хотя должен был прийти в течении 100мс) — значит гасим светодиод, показывая что у нас был сбой. Светодиод будет в погашенном состоянии минимум 80мс — достаточно чтобы заметить и даже прикинуть — сколько именно пакетов было пропущено — процесс приёма качественно контролируется визуально. Частое моргание сразу после включения в данном случае — это не подключен NRF24. Вроде все варианты разобраны.
  • Интервал в 100мс был выбран для того, чтобы можно было без труда визуально детектировать пропавшие пакеты. В конце концов из комнаты в комнату носишься именно с приёмником, так что изначально видишь только этот светодиод. А 120мс — это выбранное наобум значение, большее 100 (по идее и 101мс должна была подойти, но я взял с запасом). Так как передатчик отправляет пакеты раз в 100мс, то неполучение пакета за чуть более время — это признак пропущенного пакета. В целом — советую чуть внимательнее посмотреть этот код и подумать — что он делает.

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


  • У вас много избыточного: как будто вы пытались подобрать параметры, чтобы оно наконец-то заработало, и как только заработало — оставили всё как есть.
    Я уже говорил, что stopListening(false), ровно как и setRetries(...) не имеют смысла, если вы вызвали setAutoAck(false).
  • С другой стороны — я настоятельно рекомендую всё таки не выключать подтверждение приёма, так как в большинстве случаев вам всё равно придётся городить подобную систему поверх. Зачем, если она уже есть на железном уровне?
  • И ещё про избыточное: ознакомьтесь вот с этим кодом и не делайте то, что и без того сделано за вас: setRetries(5, 15) — уже выставлено и оно является оптимальной настройкой ретраев. powerUp() уже вызван, незачем его вызывать ещё раз. setDataRate(RF24_1MBPS); тоже выставлено. И если вам не надо 2мб/с или 128кб/с — то смело пропускайте. write_register(EN_AA, 0x3F) работает как setAutoAck(true) — так что тоже можете не менять.

PS: пока писал вам это всё, нашёл такой коммит: начиная с версии 1.3.12 уже не обязательно вызывать stopListening на передатчике. Магия больше не нужна

«Слова, слова, слова. ...» Уильям Шекспир

Я меня только один совет: Вместо того, чтобы оттачивать свой многословный стиль изложения, зайти на Амперку, выбрать одну из многих нерешенных проблем с nRF24L01 и попытаться ее решить. Уверяю – пользы будет больше, притом, для всех.

Изначально все ваши претензии к моему коду можно было бы выразить несколькими словами: убери из кода строку setRetries(...) – она лишняя. Что, собственно, я уже давно сделал. Все!

А тут многословные монологи, достойные отдельного блога. О магических открытиях, светодиоде на плате Ардуино, таскании по квартире радиомодуля, на котором люди строят радиостанции и прочее, прочее…

Поэтому повторюсь -успехов!
Зарегистрируйтесь на Хабре , чтобы оставить комментарий

Публикации