Два радиомодуля 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.
@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
- Питание Arduino Mini Pro с использованием батареи CR2032 в качестве пульта дистанционного управления
- nRF24L01 + потеря пакетов, вызванная считыванием Arduino и связью с датчиками
- Можете ли вы использовать радиочастотный пульт с nRF24L01 и Arduino?
- Что это за модуль NRF24L01?
- Как исправить перегрузку питания при подключении nRF24L01 для голосовой+гироскопической головной мыши?
- Attiny85 с 433 МГц вч, работал отлично нано к нано, не attiny85 к нано
- В чем разница между вариантами RF (wifi, xbee, NRF24L01)
- вопрос по трубке nRF24L01
Какова ваша общая цель беспроводной связи? Пропускная способность, задержка и т. д.? 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