Введение
Одним из самым популярных и доступных радиомодулей для проектов Интернета вещей является модуль nRF24L01 от компании Nordic Semiconductor [1]. С помощью такого модуля можно организовать достаточно надёжную многоканальную скоростную связь с подтверждением доставки пакетов между двумя или несколькими микроконтроллерными устройствами. Модуль nRF24L01 легко найти в интернет-магазинах, он имеет миниатюрные размеры и стоит всего $1.
При помощи такого модуля можно объединить до семи приборов в одну общую радиосеть, один из модулей будет выступать в качестве ведущего, а остальные в качестве ведомых модулей связи. Благодаря высокой скорости передачи информации через эти радиомодули можно транслировать даже оцифрованный звук и изображение.
Модуль nRF24L01 с успехом можно применять в следующих областях: мобильная электроника; компьютерные сети; автоматизированные системы; системы умного дома; сигнализация; игровые устройства; беспроводные клавиатуры и манипуляторы; бытовая электроника; беспроводный опрос датчиков; системы радиоуправления различными роботами; портативные приёмопередатчики для голосового общения по радиоканалу.
Описание модуля
Название модуля nRF24L01 образовано от сокращения слов Nordic Radio Frequency 2,4 ГГц. Он предназначен для передачи и приёма данных по радиоканалу в разрешённом диапазоне радиочастот ISM (Industrial Scientific Medical). Внешний вид модуля приведён на рисунке 1.

Частотный диапазон модуля nRF24L01 разбит на 128 каналов с шагом 1 МГц: от 2,4 ГГц до 2,527 ГГц. Например, на канале 0 передача и приём и будут вестись на частоте 2,4 ГГц, а на канале 37 будет использована частота 2,437 ГГц. Модуль способен работать на любом из 128 каналов. На каждом канале можно сформировать сеть из шести передатчиков и одного приёмника.
Модуль nRF24L01 создан на базе 20-выводной высоко интегрированной одноимённой микросхемы nRF24L01 в корпусе QFN20, включающей синтезатор частот, демодулятор, усилители и другие составляющие. Принципиальная электрическая схема радиомодуля nRF24L01 приведена на рисунке 2.

Модуль имеет интерфейс SPI для связи с внешним управляющим устройством. По интерфейсу SPI производится настройка протокола, устанавливается выходная мощность сигнала, задаются каналы обмена данными и другие параметры.
Модуль имеет четыре рабочих режима: приём данных – RX Mode, передача данных –TX Mode, спящий режим – Standby, отключённое состояние – Power Down.
Стабильную и надёжную связь радиомодулей обеспечивает протокол Enhanced ShockBurst, согласно которому принимающее устройство формирует ответ о приёме данных, подтверждая тем самым исправность канала связи. Данный протокол является усовершенствованным протоколом ShockBurst. Основным отличием усовершенствованного протокола является возможность простой и эффективной передачи данных с обратной связью. Таким образом в трансивере аппаратно реализована отправка подтверждения приёма пакета. В противном случае передача пакета повторяется. Использование вышеупомянутой функции позволяет снизить нагрузку управляющего микроконтроллера, сняв с него задачу анализа потерянных пакетов. Также данный протокол удобен для передачи данных в режиме «точка-точка» или создания беспроводной сети топологии «звезда».
Благодаря многоканальности модуль позволяет создавать сеть из множества устройств, которые могут связываться между собой, не мешая друг другу. Для передачи данных используется собственный запатентованный протокол. Достоверность принимаемых данных обеспечивается передачей контрольной суммы данных в виде циклически избыточного кода CRC.
Все данные, передаваемые по беспроводной сети, представляют собой пакеты, состоящие из множества байт, как показано на рисунке 3.

В таком пакете 32 байта зарезервированы для информационных данных, остальные байты являются служебными.
Для обеспечения групповой связи из семи модулей на одном канале, шесть модулей должны иметь уникальные идентификаторы для передатчиков – Pipe ID, а седьмой модуль – все идентификаторы этих передатчиков, от которых требуется принимать данные. Таким образом, для передающих модулей требуется только один идентификатор, а принимающему модулю нужно от одного до шести идентификаторов: Pipe 0 – Pipe 5. По этим идентификаторам приёмник распознаёт источник данных. Номера идентификаторов должны состоять из пяти байт. При этом требуется соблюдать некоторые условия их задания. Идентификатор каждого передатчика на одном канале должен быть уникальным. Идентификаторы передатчиков задаются так, что у приёмника Pipe 0 и Pipe 1 могут отличаться всеми байтами, а Pipe 2 – Pipe 5 должны отличаться от Pipe 1 только младшим байтом. Пример идентификаторов для описанного режима приведён в таблице 1.

Кроме канала и идентификатора для модулей задаются программным образом мощность передатчика, скорость передачи данных и другие параметры. Модуль nRF24L01 имеет следующие технические характеристики:
- частотный диапазон: ISM от 2,400 до 2,527 ГГц;
- количество поддерживаемых каналов: 128 с шагом 1 МГц;
- тип модуляции: GFSK;
- расстояние между передатчиком и приёмником: до 100 м в условиях прямой видимости;
- скорость передачи данных: 0,25; 1,2 Мбод, на скорости 2 Мбод используются два канала;
- мощности передатчика: –18; –12; –6 и 0 дБм;
- чувствительность приёмника: –82 дБм;
- коэффициент усиления антенны: 2 дБм;
- интерфейс связи: SPI;
- входы толерантны к 5 В;
- тип ускорителя аппаратного протокола: ShockBurst;
- операционная система: ISM;
- напряжение питания: от 1,9 до 3,3 В;
- потребляемый ток в режиме передачи данных: 11,3 мА, при максимальной мощности передачи 0 дБм;
- потребляемый ток в режиме приёма данных: 12,3 мА, при максимальной скорости передачи 2 Мбод;
- потребляемый ток в режиме энергосбережения: 85 мкА;
- диапазон рабочей температуры: от –40 до +85°C;
- габариты: 29×16×14 мм;
- вес: 2 г.
Модуль не требует подключения внешней антенны, поскольку она входит в состав модуля в виде топологии печатной платы.
Подключение модуля
Модуль подключается к управляющему устройству по протоколу SPI, с дополнительным сигналом управления приёмом-передачей и выходом прерывания.

Назначение выводов модуля приведено на рисунке 4, а описание выводов модуля nRF24L01 приведено в таблице 2.

Рассмотрим пример подключения модуля к широкораспространённому контроллеру Arduino. Модуль подключается к контроллеру по интерфейсу SPI с помощью выводов: SCK, MOSI, MISO и CSN. Вход модуля CE для выбора режима подключается к любому цифровому выходу контроллера Arduino, а выход прерывания IRQ радиомодуля можно не использовать. Модуль позволяет подавать на свои входы сигналы с уровнем от 0 до 5 В. Выходные сигналы модуля могут принимать значения от 0 до напряжения источника питания Vcc.
Подключение модуля к источнику питания с напряжением 5 В приводит к выходу его из строя, поэтому для подключения модуля nRF24L01 к контроллеру Arduino можно воспользоваться адаптером, в составе которого имеется стабилизатор напряжения на 3,3 В. Сам адаптер при этом подключается к источнику питания постоянного тока с напряжением 5 В. В таблице 3 приведено соответствие цепей при подключении модуля к контроллеру Arduino.

При питании радиомодуля от платы контроллера Arduino могут возникнуть проблемы, связанные с недостаточной мощностью источника питания, которые приводят к потере связи и нестабильной работе. Подобные трудности появляются, когда используются платы Arduino, в которых не хватает мощности источника питания. Для решения этой проблемы лучше всего использовать отдельный источник питания 3,3 В для радиомодуля.
Программирование модуля
Для создания программного кода в среде разработки ARDUINO IDE достаточно будет дополнить её основной библиотекой RF24 [2], которая содержит все необходимые функции для работы с модулем на языке высокого уровня.

В листинге 1 приведён пример программ для модуля, ежесекундно передающего данные с аналогового датчика, а в листинге 2 – для модуля, принимающего эти данные с трансляцией их в последовательный порт UART. Обе программы снабжены подробными комментариями, поясняющими назначение всех операторов и функций.

Во время записи программы в контроллер Arduino необходимо отключить от него радиомодуль, чтобы он не мешал загрузке программы. Перед первой инициализацией модуля нужно делать в программе паузу на 2 с после подачи напряжения питания.
При необходимости в программе можно изменять порты для подключения модуля nRF24L01, номер канала связи, скорость, мощность передачи и другие параметры. Вместо передачи данных с аналогового порта можно передавать любые другие данные, в зависимости от решаемой задачи.
В данной программе каждому модулю программно задаётся роль передатчика или приёмника, но в ходе выполнения программы эту роль можно менять.
Для добавления в созданную сеть из двух модулей дополнительного модуля nRF24L01 можно использовать для него программу из листинга 1, изменив в ней лишь адрес Pipe=0x123456789aLL, например на Pipe=0x123456789bLL. В программе приёмника потребуется при этом добавить дополнительный идентификатор канала связи, например с именем Pipe2=0x123456789bLL, и открыть второй канал связи для приёма с помощью команды radio.openReadingPipe(2, Pipe 2). В главном цикле программы приёмника можно разделять данные, полученные от разных передатчиков с помощью операторов if(npipe==1) и if(npipe==2) соответственно.
Дополнительно в программах для модулей nRF24L01 можно использовать библиотеку SerialFlow [3]. Эта библиотека нужна для пакетной передачи данных, чтобы можно было задавать формат передаваемого пакета, устанавливать функции для упаковки информации в пакет и их распаковки.
Помимо библиотек RF24 и SerialFlow существует и библиотека Mirf [4] для поддержки радиомодулей nRF24L01. Выбор той или иной библиотеки определяется самим программистом, исходя из удобства работы с ней или личных предпочтений.
Заключение
Беспроводной модуль nRF24L01 не является простым в освоении устройством. Его подключение и программирование требуют определённых навыков. Но стоимость и доступность модуля позволяют рекомендовать его тем, кто занимается проектами Интернета вещей или нуждается в простых устройствах для коммуникаций. Использование рекомендуемых здесь библиотек позволяет максимально упростить код программы и создавать многофункциональные проекты.
Литература
- Nordic Semiconductor: https://www.nordicsemi.com.
- Основная библиотека «Arduino driver for nRF24L01». GitHub development platform: https://github.com/maniacbug/RF24.
- Библиотека «SerialFlow library for Arduino». GitHub development platform: https://github.com/oevsegneev/arduino-dev/tree/master/libs/SerialFlow.
- Библиотека Mirf для поддержки радиомодулей nRF24L01. GitHub development platform: https://github.com/aaronds/arduino-nrf24l01/tree/master/Mirf.
Если вам понравился материал, кликните значок — вы поможете нам узнать, каким статьям и новостям следует отдавать предпочтение. Если вы хотите обсудить материал —не стесняйтесь оставлять свои комментарии : возможно, они будут полезны другим нашим читателям!

