nRF24L01 + потеря пакетов, вызванная считыванием Arduino и связью с датчиками

У меня есть 2 ардуино, которые общаются друг с другом. Моя проблема в том, что один отправляет пакеты каждые 1,5-2 секунды, а другой Arduino выполняет считывание датчиков и загрузку данных с помощью модуля Wi-Fi, что может занять до 5 секунд до следующего раза, когда nRF24L01 + будет доступен для приема данных.

Это приводит примерно к 4 потерям пакетов, а если мне повезет, то и к 2. Есть ли способ, чтобы, когда nRF24L01 + отправляет данные, другой Arduino останавливает все, чтобы получить данные? Как связь между этими двумя ардуино, которая будет открыта 24/7, так что другой Arduino может выполнять многозадачность (считывать датчики и загружать данные через Wi-Fi).

Я использую код из этого урока. Вот моя проблема на изображении (надеюсь, это поможет вам ее понять). Заранее спасибо.

, 👍1

Обсуждение

Вы используете программное обеспечение serial для модуля WiFi?, @KIIV

Да, и я общаюсь с помощью AT-команд., @Oluderi

NRF24L01 имеет буфер RX FIFO из 3 пакетов. Так что я не понимаю, как вы могли пропустить 4 пакета. Я предполагаю, что что-то еще идет не так. Не могли бы вы опубликовать какой-нибудь минимальный код, который все еще выдает эту ошибку?, @Gerben

Прямо сейчас неясно, если причина, по которой вы пропускаете пакеты, заключается в том, что вы используете Wi-Fi блокирующим способом, или если это потому, что Wi-Fi радио мешает nRF24 в том же общем диапазоне частот. И то, и другое - потенциальные проблемы. Не могли бы вы пронумеровать свои узлы при каждом чтении и отправить их в несколько точек времени? Таким образом, данная передача может включать показания 1345, 1346 и 1347, в то время как следующая передача будет иметь значения 1346, 1347 и 1348 и т. Д., @Chris Stratton


2 ответа


1

Вам нужно несколько переформулировать вашу программу (я бы предположил). nRF нужно читать одновременно с другими делами. Это означает чередование его с другими вашими операциями.

Существует концепция, называемая конечным автоматом, которая является лучшим способом написания такой сложной программы. Идея состоит в том, что ничто никогда не блокируется, а просто меняет состояния. И все время могут происходить другие вещи, такие как чтение модуля nRF24L01 +.

У меня есть небольшой учебник по конечному автомату здесь:

  • https://hackingmajenkoblog.wordpress.com/2016/02/01/the-finite-state-machine /

Если вы используете концепцию конечного автомата для считывания ваших датчиков и записи данных в Wi-Fi, то nRF может быть постоянно опрошен за пределами FSM постоянно - возможно, с помощью собственного FSM, чтобы иметь дело с приемом и т. Д.

Что нужно запомнить:

  • Избегайте delay(), конечно, для чего-то более длительного, чем пара мс.
  • Избегайте while(), for()и т. Д., За исключением очень коротких циклов, которые быстро заканчиваются.
  • Любая операция, выполнение которой занимает более нескольких мс, должна быть разбита на несколько подопераций и закодирована как отдельные состояния FSM.
,

1

Я вижу, что это старая нить, но решил вмешаться.

Вы могли бы выполнить ту же функцию "конечного автомата" с операционной системой реального времени, построенной для микроконтроллеров. Я могу порекомендовать FreeRTOS в качестве удобного входа в это. Вы можете определить несколько постоянно работающих циклов while, которые обработчик потоков RTOS затем чередует для последовательного выполнения. У вас может быть 1 поток для вашего RF и 1 поток для вашего Wi-Fi с установленными скоростями выполнения, а RTOS обрабатывает все остальное, например, он будет пытаться поместить RF-считывания внутри цикла Wi-Fi всякий раз, когда он может найти время простоя. Это, скорее всего, сделает ваш цикл Wi-Fi несколько длиннее в качестве жертвы. Вы можете начать с этого: Краткое руководство по запуску ядра FreeRTOS Справочное руководство FreeRTOS

,