Два радиомодуля nRF24L01 на Arduino

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

Я думаю об использовании собственного протокола (вместо протокола 6-1 Multiceiver), но это потребует получения некоторого рода «синхронизированного» времени приема и отправки для устройств, что, вероятно, не сделает задачу простой. Время перехода от чтения к записи меньше ожидаемого (startListening занимает максимум 350 мкс, а stopListening — 450 мкс). Однако, если мне нужно делать это каждые 5 мс и убедиться, что ни одно устройство не читает/не отправляет данные другим, это довольно большой простой.

Итак, я подумал, будет ли хорошей (или глупой) идеей использовать ДВА nRF24L01 на Arduino, один по умолчанию в режиме чтения, другой в режиме записи (таким образом, имея двунаправленную связь) и использовать два разных канала. Это означает, что мне никогда не придется переключаться между чтением и записью и я могу читать/писать одновременно без конфликта сообщений.

(примечание: позже я хочу использовать несколько Arduino и одно устройство STM32).

Кто-нибудь видит проблемы в этой идее?

Требования к целям:

  • Задержка: менее 10 мс для отправки с устройства A на устройство B, обработки (исключено, занимает несколько мс) и отправки обратно с B на A (или в некоторых случаях с B на C). Лучше менее 10 мс.
  • Количество сообщений: теоретически может составлять сотни в секунду, на практике максимум 100 (с разных устройств, но все проходят через процессор-устройство).
  • Полезная нагрузка на сообщение: около 16 байт, большинство короче, некоторые длиннее, но я могу разделить или объединить их при необходимости.
  • Радиус действия: около 10 метров максимум, но в условиях музыкальной сцены/выступления группы
  • Каналы: я не буду использовать каналы WIFI, но буду использовать ряд других, также (профессиональные) беспроводные микрофоны не работают на частоте 2,4 ГГц, поэтому я не ожидаю особых проблем.

О каналах: я не ожидаю никаких проблем. У меня должно быть достаточно каналов между 2,484 и 2,525 ГГц. Это дает мне около 40 каналов для 1 Мбит/с или 20 каналов для 2 Мбит/с на выбор.

  • Источники:
    • 2,484 ГГц: Каналы WIFI, первая таблица с красными/зелеными элементами
    • 2,525 ГГц: Техническое описание, пункт 6.3.

, 👍1

Обсуждение

Какова ваша общая цель беспроводной связи? Пропускная способность, задержка и т. д.? NRF24L01 может быть 2 Мбит/с (битрейт), но я предполагаю, что 1-2 Кбит/с — это своего рода предел. Они хороши/разработаны для коротких и нечастых сообщений, таких как от беспроводной мыши, например, частота обновления 20 мс, полезная нагрузка 16-32 байта. Также вы можете попробовать сменить канал, чтобы избежать шума (потерь сообщений) из-за WiFi., @Mikael Patel

@MikaelPatel Я улучшил свой ответ, думаю, 1-2 Кбит/с будет достаточно, 20 мс — это слишком много для моих нужд, полезная нагрузка может варьироваться. Я думал, что у меня не возникнет проблем с Wi-Fi, хотя я мог бы время от времени проверять каналы., @Michel Keijzers

@MikaelPatel от 2,484 до 2,525 ГГц. У меня должно быть достаточно каналов (источники: https://en.wikipedia.org/wiki/List_of_WLAN_channels#Most_countries, первая таблица с красными/зелеными элементами, 2,525: https://www.nordicsemi.com/chi/content/download/2730/34105/file/nRF24L01_Product_Specification_v2_0.pdf пункт 6.3. Это дает мне около 40 каналов для 1 Мбит/с или 20 каналов для 2 Мбит/с на выбор., @Michel Keijzers

Я не вижу причин не использовать два nRF одновременно. Вы можете отключить авто-ACK и использовать режим Enhanced ShockBurst, чтобы получить лучшую пропускную способность., @Majenko

@Majenko ... это звучит хорошо ... Я уже планировал отключить автоподтверждение (на самом деле все ACK) и реализовать 'ACK' самостоятельно. Мне нужно проверить Enhanced ShockBurst (если это идея 6-1 Multiceiver, я воспользуюсь ею)., @Michel Keijzers

@Majenko ... Я проверил это и думал, что это единственный способ (использование Enhanced Shockburst). На самом деле я использую http://tmrh20.github.io/RF24/index.html, который, скорее всего, это использует. Я отключу ACK/повторы и разберусь с ними сам., @Michel Keijzers

@Downvoter, можешь вместо того, чтобы ставить минусы всем моим постам, объяснить, ПОЧЕМУ ты поставил минусы, чтобы я мог улучшить пост?, @Michel Keijzers


1 ответ


Лучший ответ:

1

При скорости 2 Мбит/с 32-байтовый пакет (40 байт с преамбулой, адресами, CRC) будет иметь длину около 160 микросекунд. Время приема-передачи, скорее всего, будет намного больше, поскольку микроконтроллеру или радиоприемнику понадобятся дополнительные задержки для автоматического повтора, отправки и получения ответного пакета, блокировки PLL, чтения регистров данных и т. д. По моему опыту, возможно время приема-передачи 2 мс, и лучший способ сделать это — использовать встроенные функции nRF:

-- IRQ прерывание: прерывания = быстрые

-- Enhanced Shockburst: автоматически обрабатывает потерянные пакеты и неудачные передачи. Вы не можете получить эту возможность быстрее через кодирование микроконтроллера.

Кроме того, есть возможность использовать быстрые библиотеки SPI (или использовать регистры SPDR/SPCR напрямую) для передачи данных в радиомодуль и из него. Если ваша цель — скорость, не полагайтесь на библиотеки plug-and-play, написанные другими. Внимательно читайте технические описания и минимизируйте ненужные задержки в коде Arduino.

,

Я немного отклонился от своего проекта, поэтому пока не буду использовать nRF, а если и буду, то, скорее всего, на STM32, а не на Arduino, но приятно знать, что лучше использовать встроенный способ., @Michel Keijzers