+7-960-0655211 (Билайн)
+7-987-4207734 (МТС)
интернет-магазин
доставка по России и СНГ
нам уже 10 лет!

Радиомодуль nRF24L01. Обзор

Радиомодуль nRF24L01. Обзор

Для организации обмена данными между двумя или более платами Arduino иногда самым удобным вариантом является беспроводная связь с использованием радиомодулей. Беспроводная связь открывает множество возможностей, таких как удаленный мониторинг, сбор данных с датчиков, домашняя автоматизация, управление роботами и так далее.

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

Так выглядит один из самых популярных вариантов модуля на nRF24L01:



Он хорошо подходит для первоначального ознакомления и использования в проектах, в некоторых модулях есть разъём для подключения с такой распиновкой и шагом контактов 2.54мм. Этим ассортимент модулей не ограничивается, есть множество других. Они бывают разных габаритов. С печатной антенной, керамической или внешней. С усилителем или без. На плате может быть стабилизатор питания на 3.3В, может и не быть. Где и как сделаны выводы для подключения/пайки и т.д.


Обзор аппаратной части

Распиновка



  • GND - земля
  • VCC - плюс питания, от 1.9-3,9 Вольт. При превышении напряжения, например, при подключении к 5В, модуль может выйти из строя. Если на входных пинах (MOSI, SCK, CE, CSN) более 3.6 Вольт, напряжение питания должно находиться в пределах 2.7-3.3 Вольт
  • MOSI (Master Out Slave In) - выход ведущего, вход ведомого. Служит для передачи данных от ведущего устройства ведомому
  • MISO (Master In Slave Out) - вход ведущего, выход ведомого. Служит для передачи данных от ведомого устройства ведущему
  • SCK (Serial Clock) - входной, по нему происходит тактирование от ведущего устройства при передаче данных
  • CE (Chip Enable) - входной, служит для активации режима RX или TX
  • CSN (Chip Select Not) - входной, с помощью него происходит управление при передаче команд по SPI шине
  • IRQ - это вывод прерывания, через который мастеру сообщается о том, что что-то произошло (получен пакет, превышено количество попыток при отправке и т.д.)

Радио:

  • Частотный диапазон 2,4ГГц (2,4000-2,4835ГГц)
  • GFSK модуляция 
  • 126 частотных канала
  • Поддерживаемые битрейты: 250кбит, 1Мбит и 2Мбит
  • Программируемая мощность передатчика и усиления приёмника

Существует ошибочное мнение, что 126 (с 0 по 125) частотных канала это максимальное количество модулей, между которыми можно передавать данные. Количество частотных каналов при некоторых условиях может влиять на количество модулей, но в общем на прямую это никак не связано. Количество модулей зависит от ряда вещей - какая пропускная способность нужна, какая адресация реализована, топология сети и т.д. Даже если использовать аппаратную адресацию (поле адреса до пяти байт, т.е. более триллиона), столько nRF24L01 просто не существует. 

Что такое частотные каналы и для чего они полезны это не сложно для понимания. Модули, настроенные на одинаковый канал, могут обмениваться данными. Если модули настроены на разные каналы, приёмник не может «услышать» данные, передаваемые другим модулем. Если совсем упростить, представьте, что для передачи данных используются приёмники и передатчики с разными диапазонами длин волн, допустим в видимом диапазоне, в инфракрасном и в ультрафиолетовом. Если фотодатчик может «видеть» свет только в видимом диапазоне, значит с помощью него можно получать информацию от источника света в видимом диапазоне и нельзя в инфракрасном или ультрафиолетовом. 

Частотные каналы хоть и можно использовать для псевдослучайной перестройки частоты, но в общем для этого скорей всего лучше окажется использование других приёмопередатчиков. А с nRF24l01 настройку частотного канала обычно используют, если на определённой частоте есть помехи от других устройств. Это могут быть WiFi, Bluetooth или ещё какие устройства. Для nRF24l01 так же могут быть использованы разные частоты, допустим, чтобы упростить код/алгоритм, протокол, настройку, максимальный битрейт тоже не бесконечный (разделение на подсети) и т.д. Два и более модуля на одну частоту, два и более модуля на другую частоту и т.д. - модули, работающие на разных частотах, не будут друг-другу мешать.

Расстояние, на котором может работать модуль зависит от ряда факторов. Имеет значение какая используется антенна, есть ли прямая видимость, как в пространстве сориентированы антенны модулей и т.д. Влияют и настройки модуля - битрейт (для 250кбит максимально возможная дальность), мощность передатчика и чувствительность приёмника.

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

Питание:

  • Встроенный стабилизатор напряжения
  • Рабочее напряжение 1,9-3,6В
  • Максимальный потребляемый ток 13.5мА
  • В режиме «power down» потребление 26мкА, время пробуждения 1,5мс 
  • В режиме «standby-I» потребление 900нА, время пробуждения 130мкс 

Будьте внимательны, не на всех платах Arduino, шилдах или модулях есть 3.3В. На модуле, приведенном ранее, стабилизатора нет и при запитке от 5В он может выйти из строя. Что бы этого не случилось, используйте дополнительный стабилизатор питания. Можно подключить на макетной плате к имеющемуся стабилизатору или использовать специальный модуль на подобии такого:



В некоторых случаях модуль может нестабильно работать из-за просадки напряжения, одним из возможных вариантов решения проблемы, это добавить конденсатор - установить в макетную плату, напаять до модуля или на сам модуль конденсатор (электролит, тантал или керамику) небольшой ёмкости:







Внешний интерфейс:

  • Четырёхвыводной SPI
  • Максимальный битрейт 8Мбит
  • Трёхуровневые FIFO буферы по 32 байта для приёма и передачи
  • Выводы толерантны к 5В

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

Это может понадобиться, если при выбранной топологии сети и количеством устройств в ней, особенностям реализуемого в коде протокола и алгоритма работы, пропускная способность или количество устройств в сети, с одним модулем может оказаться недостаточной.

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

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

Аппаратный уровень обработки пакетов ShockBurst:

  • Сборка пакета при отправке
  • Обнаружение входящих пакетов и их проверка
  • Настраиваемые источники прерывания для активирования вывода IRQ
  • Автоматическая отправка обратного уведомления при получении пакета
  • Повторная отправка утерянных пакетов (если включено, можно настроить количество попыток)
  • Настраиваемое количество байт для поля данных от 0 до 32 байт в статическом режиме и автоматическое задание в динамическом режиме
  • Настраиваемая длина адреса от 3 до 5 байт
  • «MultiCeiver» для реализации топологии «1:6 звезда»

ShockBurst прост и гибок в настройке. Беря на себя выполнение части функций, позволяет упростить код и работу с модулем, а также немного разгружает микроконтроллер/микропроцессор управляющей платы и даёт ему возможность переходить в энергосберегающий режим в то время, когда модуль отправляет данные, ожидает пакет или обрабатывает его.

Формат пакета:

  • Преамбула, 1 байт
  • Адрес, 3-5 байт
  • Поле контроля пакета, 9 бит
  • Данные, 0-32 байт
  • Контрольная сумма, 1-2 байта

Данные в поле преамбулы устанавливаются модулем автоматически, в зависимости от значения первого бита адреса.

Структура поля контроля пакета:

  • Количество байт в поле данных, 6 бит. Это поле используется только если включен динамический режим и ему присваивается число от 0 до 33 (33 означает, что длина поля данных не имеет значения)
  • Идентификатор пакета, 2 бита. На стороне передатчика поле идентификатора пакета автоматически увеличивается при получении по SPI нового пакета. На стороне приёмника это поле используется для определения, этот пакет новый или был отправлен повторно
  • Флаг NO_ACK (сокращение от «No Acknowledgment», т.е. «нет подтверждения»), 1 бит. Этот флаг используется только если включен функционал автоматического подтверждения

Поле данных может содержать от 1 до 32 байт. Длина поля равная 0 может использоваться для проверки, доступен ли радиомодуль с определённым адресом.

Поле контрольной суммы используется для определения, получен повреждённый пакет или нет.

В режиме приёма, модуль сначала ожидает преамбулу, затем адрес. Приём следующих полей пакета продолжается только после успешной проверки, что преамбула соответствует первому биту адреса и что такой адрес удалось найти в регистрах RX_ADDR. После получения остальных полей пакета, происходит проверка контрольной суммы и в случае успеха, данные записываются в FIFO буфер приёмника, из которого их уже может считать управляющий контроллер.

При включенном функционале автоматического подтверждения, модуль в режиме приёма после получения пакета отправит обратно пакет подтверждения.

При включенном функционале повторной отправки, модуль будет пытаться отправлять пакет до тех пор, пока или не получит обратный пакет подтверждения или будет превышено количество попыток. В регистре «SETUP_RETR» можно настроить количество попыток отправки (до 15 или 0, если нужно отключить) и время ожидания пакета подтверждения (от 250мкс до 4000 мкс, с шагом 250 мкс).

Режимы работы

NRF24L01 может работать в четырёх режимах:

  • Power Down
  • Standby
  • RX
  • TX

Время перехода между режимами:



 

В Power Down режиме nRF24L01 находится в состоянии минимального энергопотребления, при котором отключены все блоки кроме SPI и регистров.

Режимы Standby-I и Standby-II это режимы с низким энергопотреблением, в котором в отличии от Power Down дополнительно работает ещё и тактовый генератор. Это увеличивает электропотребление, но даёт возможность более быстрого перехода в режим RX или TX. Standby-II отличается от Standby-I только задействованием дополнительных буферов тактирования, что немного увеличивает энергопотребление.

Режима, в котором данные могут одновременно и передаваться, и приниматься, нет. Тип связи, при котором можно одновременно и передавать, и получать данные, называется дуплексным. В nRF24L01 для двусторонней связи используется полудуплексный режим с разделением по времени, т.е. каждый модуль для обмена данными в один момент либо принимает данные, либо передаёт.

Для nRF24L01 можно настроить скорость передачи данных равную 250кбит, 1Мбит и 2Мбит. Это общая максимально возможная скорость, т.е. она делиться между всеми приёмопередатчиками.

Явление, когда несколько передающих узлов пытаются в один и тот же момент времени осуществлять передачу, называется коллизией. При возникновении коллизии приёмник не сможет принять данные и что бы он получил эти данные, их нужно будет отправлять повторно.

В режиме приёмника («основной приёмник», PRX, primary receiver) можно только принимать данные. При обнаружении пакета происходит его проверка и, если она успешна, данные записываются в приёмный буфер. При выключенном ShockBurst, режим PRX остаётся активным до тех пор, пока управляющий контроллер не переведёт в другой режим.

В режиме передатчика («основной передатчик», PTX, primary transmitter) можно только отправлять данные. Если на выводе CE низкий уровень, nRF24L01 переходит в режим standby-I. Если на выводе CE высокий уровень, следующее действие зависит от состояния буфера. Когда в буфере есть данные для отправки, происходит отправка следующего пакета. Когда буфер пустой, nRF24L01 переходит в режим standby-II.

Если ShockBurst задействован, он может автоматически переключать nRF24L01 в другие режимы. В PTX при необходимости будет автоматически переключаться в PRX и ожидать получения пакета подтверждения. В PRX при необходимости отправки подтверждения или повторной отправки пакета, переключится в PTX.





В режиме PRX можно задействовать MultiCeiver. MultiCeiver - это аббревиатура от «Multiple Transmitters Single Receiver», что переводится как «Много Передатчиков Один Приёмник».



Для приёма можно задействовать до 6 каналов, в один момент времени прнимать данные можно только от одного передатчика. Какие каналы включены или выключены, настраивается в регистре EN_RXADDR (по умолчанию каналы 0 и 1 включены). У каждого канала свой уникальный адрес, эти адреса настраиваются через регистры RX_ADDR_P0- RX_ADDR_P5.



Для RX_ADDR_P0 и RX_ADDR_P1 выделено по 5 байт, а для RX_ADDR_P2- RX_ADDR_P5 по 1 байту. У каналов 2-5 старшие байты адреса общие с каналом 1.



Как упоминалось ранее, в nRF24L01 есть 126 частотных канала, не путайте их с каналами передачи данных (Data Pipe). Частотный канал настраивается для приёмопередатчика в общем и все каналы передачи данных работают на одной частоте. Аналогично и с длиной адреса, её нельзя настроить индивидуально ни для PRX и PTX, ни для каждого канала данных PRX.

В nRF24L01 для PRX и PTX есть по трёхуровневому 32-х байтному FIFO буферу:



TX буфер в режиме PRX может хранить данные для ACK пакетов, максимум для трёх разных PTX. Т.к. для настройки адреса для RX есть 5 регистров, а для TX только один, адрес для отправки будет браться из соответствующего регистра RX_ADDR.

Если для одного канала TX буфер содержит более одной посылки, они будут отправляться по принципу FIFO («first in - first out», т.е. «первым пришел - первым вышел»).

TX буфер в режиме PTX может хранить до трёх посылок. Для TX регистр адреса всего один и, если на выводе CE высокий уровень, будет происходит автоматическая отправка следующего пакета. Т.е. если нужно отправить несколько пакетов одному получателю, их можно сразу записать в буфер. Если данные нужно отправить разным получателям, придётся делать это последовательно.

RX буфер в PRX режиме может хранить до трёх посылок. В регистре STATUS есть трёхбитное поле RX_P_NO из которого можно узнать, буфер пустой или для какого канала есть данные. Поле поле RX_P_NO принимает такие значения:

  • 000-101: номер канала, для которого есть данные
  • 110: это значение не используется
  • 111: RX буфер пуст

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


© RobotoTehnika.ru