В этой статье мы поговорим о nrf24l01 – одном из самым популярных и недорогих радиомодулей для проектов Arduino и интернета вещей IoT. Модули nrf24l01 для Arduino легко найти в любом интернет-магазине, они относительно недороги. При этом с их помощью можно организовать достаточно надежную многоканальную связь с подтверждением доставки пакетов между контроллерами ардуино и другими устройствами. В этой статье мы рассмотрим описание, распиновку nrf24l01, а также узнаем, какие библиотеки можно использовать с этим радиомодулем.
Описание модуля NRF24L01
Нельзя создать по-настоящему интересный проект, не дав возможность создания коммуникаций между различными элементами системы. Поэтому так важно выбрать правильную платформу для организации связи между модулями. NRF24l01 отлично подходит для создания распределенных систем с датчиками и контроллерами, разнесенными на расстояния до 100 метров.
NRF24l01 – это высокоинтегрированная микросхема с пониженным потреблением энергии (ULP) 2Мбит/с для диапазона 2,4 ГГц. При помощи модуля можно связать несколько устройств для передачи данных по радиоканалу. Можно объединить до семи приборов в одну общую радиосеть на частоте 2,4 ГГц, один из модулей будет выступать в роли ведущего, остальные – ведомые. Радиомодуль NRF24l01 стоит дешево, поэтому его можно встретить в самых разных проектах – от умного дома до различных самодельных роботов.
Характеристики nrf24l01
- Низкие затраты энергии;
- Наличие усовершенствованного ускорителя аппаратного протокола ShockBurst;
- Операционная система ISM;
- Скорость передачи данных 250 Кбит/с, 1 Мбит/с и 2 Мбит/с;
- Полная совместимость со всеми стандартными сериями nRF24L Nordic, а также сериями nRF24E и nRF240;
- Напряжение питания 3,3В;
- Рабочие температуры от -40С до 85С, температуры хранения от -40С до 125С;
- Дальность связи до 100 м.
Основой модуля служит nRF24L01+ производства компании Nordic Semiconductor. На микросхеме расположены все необходимые элементы и вилка разъема. По интерфейсу SPI можно произвести настройку протокола, установить выходную мощность и наладить каналы обмена данных.
Сфера применения модуля nrf24l01
Одним из самых главных компонентов проектов IoT являются средства коммуникации. nrf24l01 можно с успехом применять в следующих областях:
- Мобильная электроника;
- Компьютеры;
- Автоматизированные системы;
- Различные элементы «умного дома» – сигнализация, регулирование температуры и другие функции;
- Игры;
- Бытовая электроника.
В плату nRF24L01+ входят синтезатор частот, демодулятор, усилители и другие составляющие. Рабочая частота модуля определяется номером канала, диапазон частот, в котором происходит связь, 2,4 – 2,483 ГГц. Каналы располагаются через 1 МГц, то есть нулевому соответствует частота 2,4ГГц, каналу 83 – 2,483 ГГц.
Модуль имеет 4 рабочих режима – выключение (Power Down), спящий режим (Standby), прием данных(RX mode), передача данных (TX Mode). В режиме приема данных RX потребление тока выше, чем в режиме передачи данных TX.
За стабильную и надежную передачу и прием данных отвечает протокол Enhanced ShockBurst. Принимающее устройство должно давать ответ о приеме данных, подтверждая таким образом обратную связь.
Где купить модули
Купить nrf24L01 можно в любом интернет-магазине, торгующем электронными компонентами. Рекомендуется приобретать плату вместе со специальными модулями питания – это позволит избежать множество непредсказуемых проблем, связанных с нестабильным питанием. Также рекомендуем обратить внимание на уже готовые шилды и платы со встроенными чипами nrf. Вот несколько примеров на Алиэкспресс:
Набор модулей NRF24L01+PA+LNA с антеной – 2.4G и до 1100 метров | Модули NRF с адаптером питания | Модуль NRF24L01 с антенной |
Недорогой адаптер питания для NRF24L01 | Шилд для быстрого подключения NRF24L01 к Arduino Nano | Модуль NRF24L01 с адаптером питания и конвертером SPI- I2C |
Распиновка NRF24L01
Помимо выходов питания линии сигналов могут подключаться к контактам с питающим напряжением 5 В. Вход устройства, которое подключается к плате, должен потреблять ток не выше 10 мА.
Микросхема содержит следующие выходы:
- GND – земля;
- VCC – напряжение питания 3,3В
- CE – высокий уровень микросхемы;
- CSN – включение низкого уровня микросхемы. В этом случае устройство реагирует на SPI команды;
- SCK – такт SPI, максимальное значение 10 МГц;
- MOSI – передача информации от контроллера;
- MISO – прием данных в контроллер;
- IRQ – сигнал для аппаратного прерывания.
Организация питания nrf24l01
Во время запуска микроконтроллера могут возникнуть проблемы, которые связаны с тем, что не предусмотрена нужная сила тока в модуле питания 3,3 В. Из-за этого могут возникнуть помехи, мешающие стабильной работе. Обычно подобные трудности появляются, когда используются платы Arduino Uno, Nano, Mega, то есть в тех, в которых не хватает мощности. Для приведенных видов плат на пины подается небольшой ток 50 мА.
Существует несколько методов решения этой проблемы:
- Подключение конденсатора к микросхеме на 3, 3 В(+) и землю GND (-). Емкость лучше выбирать 10 мкФ и более.
- Дополнительный источник напряжения на 3,3 В.
- Разработка отдельной платы, установка на нее модуля nRF24L01 и добавление конденсаторов на 1 и 10 мкФ.
- Применение YourDuinoRobo1, который обладает дополнительным регулятором на 3,3 В.
Различные версии модуля NRF24L01
Данная версия обладает дальностью до 100 м для открытого пространства, в помещении дальность ниже – до 30 м. Размеры 29х15 мм.
Мини NRF24L01. Характеристики и параметры те же, размеры 18х12 мм.
Модуль, оснащенный внешней антенной и усилителем. Дальность увеличена до 1000 м на открытых территориях.
Более сложный модуль nRF24LE1, работающий без платы Ардуино, то есть автономно.
Подключение nRF24L01 к Ардуино
Вывод MOSI с платы nRF24L01 подключается к пину 11 для Ардуино Uno, Nano и на 51 для Arduino Mega. Контакт SCK нужно подключить к 13 для Ардуино Uno, Nano и 52 для Arduino Mega. MISO – к 12 для Ардуино Uno, Nano и 50 для Arduino Mega. Контакты CE и CSN подключаются к любому цифровому пину Ардуино. Питание – на 3,3 В. Если используется плата Arduino Mini, придется использовать внешний стабилизатор напряжения, так как на плате отсутствует выход 3,3В. Также к пинам питания можно добавить конденсатор на 10 мкФ и более для обеспечения стабильной и качественной работы. Модуль с припаянным конденсатором изображен на рисунке.
Внешний вид макета представлен на рисунке ниже.
При подключении важно не перепутать напряжение – 5 Вольт могут вывести модуль из строя.
Подключение к Ардуино через адаптер NRF24L01
Адаптер специально разрабатывался для модуля NRF24L01+. На нем имеется специальный стабилизатор напряжения и удобно расположены выходы к контроллерам и платам Ардуино.
Как видно, на адаптере имеется 2 вида разъемов. Двухрядный разъем используется для подключения радиомодуля, однорядный – для соединения с Ардуино. Отдельно расположены выходы на питание (5В) и землю.
Для подключения радиомодуль NRF24L01+ нужно вставить в соответствующий двухуровневый разъем. При помощи проводов адаптер подключается к плате Ардуино к тем же выводам, которые нужны для подключения напрямую к модулю. Для подключения к Arduino Uno, Nano: MISO-12, MOSI-11, SCK-13,выводы CE –к D10 и CSN – D9, вывод VCC к Arduino (+5V), а вывод GND к Arduino (GND).
Программирование nRF24L01
Для написания скетчей в среде ARDUINO IDE нужно установить 2 библиотеки – RF24 и SerialFlow. Первая нужна для работы с модулем, вторая – для пакетной передачи данных. Ссылки на скачивание библиотек вы найдете в конце статьи.
Пример программы для передатчика. В первую очередь создается объект класса SerialFlow:
SerialFlow rd(9,10);
В этой строке 9 и 10 – это свободные пины с Ардуино, к которым подключаются контакты CN и CSN.
Настройка формата передаваемых пакетов производится в функции setup:
rd.setPacketFormat(2, 1);
Первый аргумент (в данном случае число 2) определяет размер передаваемого числа. Для конкретного случая число находится в диапазоне от 0 до 655535 и занимает 2 байта. Для 0 до 255 будет занят 1 байт. Второй аргумент – количество чисел.
Далее нужно настроить адреса передатчика и приемника:
rd.begin(0xF0F0F0F0E1LL,0xF0F0F0F0D2LL);
Первым аргументом записывается адрес передатчика, вторым – адрес приемника.
Цикл loop выполняет отправку пакетов.
Пример программы для приемника. При получении данных приемник должен сигнализировать об этом. Данные будут отправляться в монитор порта Arduino IDE.
В коде так же записывается объект SerialFlow и настраиваются необходимые параметры пакета данных. Изменения происходят в строчке
rd.begin(0xF0F0F0F0D2LL,0xF0F0F0F0E1LL);
Теперь первым аргументом должен быть указан адрес приемника, а вторым – передатчика.
После загрузки программы на оба модуля при правильном выполнении всех действий в окне будет появляться значение таймера в миллисекундах на передатчике.
Помимо библиотек RF24 и SerialFlow существует и другая – библиотека Mirf. Выбор той или иной библиотеки определяется удобством работы.
Операторы для передачи данных между двумя модулями с помощью библиотеки Mirf:
- payload = PAYLOAD; – задает размеры буфера для приема. На payload установлено ограничение – максимальный размер равен 32 байтам.
- setRADDR((byte*)’serv1′); – выбор адреса приемника (размер не менее 3 байт и не более 5 байт).
- setTADDR((byte *)’clie1′); – выбор адреса передатчика (размер не менее 3 байт и не более 5 байт).. Во время передачи пакета данных на первом модуле происходит установка адресата Mirf.setTADDR((byte *)’clie1′), затем пакет отправляется ко второму модулю. После этого на втором модуле устанавливается Mirf.setTADDR((byte *)’serv1′) и возвращается ответ на первый модуль.
- isSending() – проверка окончания передачи данных.
- dataReady() – проверка получения входящего пакета.
- getData((byte *) &data); – чтение полученных пакетов в переменную data.
- send((byte *) &data); – подача команды на отправку пакета. В библиотеке указывается адрес, в котором находятся переменные. После этого происходит копирование их в память и в итоге пользователь получает доступ к переданным данным через переменные. Способ удобен тем, что можно передавать любой тип данных, в том числе структуры.
Передача структур nrf24l01
Использование структур удобно тем, что в них можно записать много переменных и отправить их другому устройству за один раз. Код нужно записывать так, чтобы ардуино передавала команду по цепочке остальным модулям. Каждый из модулей знает только свой адрес и адрес следующего за ним модуля.
Во время работы со структурами нужно внимательно рассчитать ее размер и указать PAYLOAD. Общий размер структуры будет равен сумме всех размеров составляющих ее переменных.
Основные элементы кода:
#define ADDR “mod0” //указывается адрес модуля
#define NEXT “mod1” //указывается адрес следующего модуля
boolean iamfirst=true;//начинает ли этот модуль цепочку?
#define PAYLOAD 5 //размер полезной нагрузки
Все модули в итоге будут получать одинаковый скетч, в котором различаться будут только переменные ADDR, NEXT и iamfirst.
Скачать библиотеки nrf24l01
Основная библиотека для работы с модулем – RF24. В библиотеке содержится огромное количество примеров программ. Важно отметить, что во время записи программы в ардуино нужно отключить модуль передатчика. Также перед первой инициализацией нужно сделать паузу в 2 секунды после подачи напряжения. Перед началом работы функцию RF24::flush_tx нужно сделать публичной и очистить буфер передачи перед отправкой новых сообщений.
Другая библиотека nrf24l01 – SerialFlow. Эта библиотека нужна для того, чтобы задавать формат передаваемого пакета, устанавливать функции для упаковки информации в пакет и их распаковки.
Библиотека Mirf. Эта библиотека является альтернативой вышеописанной RF24. Последняя ближе к стандартам, используемым для программирования ардуино, поэтому многим, особенно новичкам, может быть неудобна работа с mirf. Выбор той или иной библиотеки определяется только удобством и простотой ее для пользователя.
Выводы по nrf24l01
Беспроводной модуль nrf24l01 нельзя назвать простым в освоении устройством. И подключение, и программирование требует определенных навыков. Но стоимость и доступность модуля позволяет рекомендовать его для тех, кто занимается проектами интернета вещей или нуждается в простых инструментов для коммуникаций. Купив специальный адаптер для nrf24l01 вы можете существенно упростить подключение к ардуино. А использование библиотек позволяет максимально упростить код. Старайтесь не покупать модули nrf24l01 дешево у совсем уж неизвестных продавцов, и тогда никаких проблем с работой ваших проектов не будет.
При создании некоторых проектов, требуется разделить выполняемые задачи между несколькими arduino.
В этом уроке мы научимся соединять две arduino по радиоканалу ISM диапазона, используя радио модуль nRF24L01+, на расстоянии до 100 м. Если использовать радио модули NRF24L01+PA+LNA, то расстояние между arduino можно увеличить до 1 км, не меняя код скетча.
Преимущества:
- Отсутствие проводов между arduino.
- Высокая скорость передачи данных, до 2 Мб/с. Выше чем у шин I2C и UART.
- Полудуплексная связь. Режим работы модулей (приёмник / передатчик) можно менять в процессе их работы.
- Высокая помехозащищенность. Данные в пакетах принимаются с проверкой CRC.
- Контроль доставки данных. Приемник отправляет передатчику сигнал подтверждения приёма данных (без смены режима работы).
- Возможность выбора одного из 128 каналов связи. Шаг каждого канала равен 1 МГц (от 2,400 ГГц до 2,527 ГГц).
- Возможность одновременной работы до 6 передатчиков на одном канале.
Недостатки:
- Модули nRF24L01+ работают в радиочастотном диапазоне ISM (Industrial, Scientific, Medical) 2,4 ГГц, на котором работают WiFi, Bluetooth и другие устройства, например радио телефоны и даже СВЧ печи. Эти устройства могут «глушить» некоторые каналы данного диапазона. Поэтому вблизи таких устройств дальность связи между модулями, на некоторых каналах, резко уменьшается. Увеличить дальность можно сменив канал связи на любой из 128 доступных модулям nRF24L01+.
- При выборе скорости 2 Мб/с, задействуются сразу два канала (выбранный и следующий за ним).
- Модули питаются от напряжения 3,3 В постоянного тока. Но их можно запитать от 5 В через адаптер nRF24L01+.
Нам понадобится:
- Радио модуль nRF24L01+ х 2шт.
- Адаптер к модулю nRF24L01+ х 2шт.
- Arduino х 2шт.
- Trema Shield х 2шт.
- Trema Slider х 1шт.
- Trema потенциометр х 1шт.
- Trema четырехразрядный LED индикатор х 1шт.
- Сервопривод x 1шт.
- Набор проводов «мама-мама» для подключения радио модулей х 1 комплект.
Для реализации проекта нам необходимо установить библиотеки:
- Библиотека RF24 (для работы с радио модулями nRF24L01+).
- Библиотека iarduino_4LED, (для работы с Trema четырехразрядным LED индикатором).
- Библиотеки SPI и Servo входят в стандартный набор Arduino IDE.
О том как устанавливать библиотеки, Вы можете ознакомиться на странице Wiki — Установка библиотек в Arduino IDE.
Видео:
Схема подключения:
Оба радио модуля nFR24L01+ подключены, через адаптер, к аппаратной шине SPI. Trema четырехразрядный LED индикатор подключён к цифровым выводам D2 и D3 (можно подключить к любым выводам Arduino). Сервопривод подключён к цифровому выводу D4 (можно подключить к любым выводам). Trema потенциометр и слайдер подключены к аналоговым входам A1 и A0 (можно подключить к любым аналоговым входам). Питание адаптера nFR24L01+ взято с контактов GND и Vcc (5 В).
Если Вы будете подключать модуль nFR24L01+ без адаптера, то модуль требуется запитать от напряжения 3,3 В постоянного тока.
Таблица подключения радио модуля nFR24L01+
Адаптер nRF24L01+ | Arduino Uno | Назначение |
---|---|---|
CE | 9 (меняется в скетче) | Выбор режима: приёмник / передатчик |
CSN (CS/SS) | 10 (меняется в скетче) | Шина SPI — выбор устройства |
SСK | 13 (SCK) | Шина SPI — линия тактирования |
MO | 11 (MOSI) | Шина SPI — линия данных (от мастера к ведомому) |
MI | 12 (MISO) | Шина SPI — линия данных (от ведомого к мастеру) |
IRQ | Не используется | Прерывание |
Алгоритм работы:
Передатчик:
При старте (в коде setup) скетч настраивает работу радио модуля в режим передачи данных, указывая номер канала, скорость передачи, мощность передачи и идентификатор трубы. После чего, постоянно (в коде loop), считывает показания с Trema потенциометра и Trema слайдера, сохраняя их в массив data, и отправляет его радио модулю для передачи.
Приёмник:
При старте (в коде setup) скетч настраивает работу радио модуля, указывая те же параметры что и у передатчика, но в режим приёма данных, а также инициирует работу с LED индикатором и сервоприводом. После чего, постоянно (в коде loop), проверяет нет ли в буфере данных, принятых радио модулем. Если данные есть, то они читаются в массив data, после чего значение 0 элемента (показания Trema слайдера) выводится на LED индикатор, а значение 1 элемента (показания Trema потенциометра) преобразуются в градусы и используется для поворота сервопривода.
Код программы:
Передатчик:
Скачать
Приемник:
Скачать
Ссылки:
- Код программы передатчика.
- Код программы приёмника.
- Библиотека RF24.
- Библиотека iarduino_4LED.
- Wiki — Установка библиотек в Arduino IDE.
- Wiki — Четырёхразрядный индикатор (Trema-модуль).
- Wiki — Trema Shield.
Данная статья на 90% основывается на заметке «Bit-Banging» Bluetooth Low Energy. Все началось с того, что потребовалось запустить распространенные сейчас трансиверы на чипе Nordic nRF24l01. В процессе поиска примеров работы с ними я и наткнулся на вышеупомянутую статью. Являясь обладателем телефона с поддержкой Bluetooth 4.0 (который и включает в себя Bluetooth Low Energy), подумал: а почему бы не попытаться повторить эксперимент?
Описание
Как выглядит устройство и какая у него схема описывать не буду. В интернете, включая русскоязычный, полно информации по описываемым радиомодулям. Скажу только, что в моем случае для управления был использован микроконтроллер NXP LPC1343 (для него и представлена прошивка внизу). Как обычно, чудес не бывает: пример не захотел работать в виде «как есть». Во-первых на странице присутствует явное повреждение форматирования, во-вторых сразу видно что есть проблема с байтом длины. Какие еще опечатки и неточности присутствуют в описании, мне оставалось только гадать. Однако, после непродолжительных правок все заработало. BLE-устройство сильно отличается от всех прочих «синих зубчиков», достаточно упомянуть, что стандартный поиск устройства в Android не ищет BLE: для их обзора требуются отдельные приложения. BLE устройства — отдельное ответвление в Bluetooth-технологии, фактически это еще один стандарт. Видимо, он разрабатывался с оглядкой на возможности малопотребляющих трансиверов на 2.4ГГц. Отсюда и итоговое сходство. А сходства следующие:
- Одинаковые рабочие частоты 2.4GHz с поддержкой скорости 1Mbps и пересекающаяся сетка каналов.
- Одинаковые байты стартовые байты 10101010 или 01010101 (преамбула).
- Одинаковая модуляция сигнала: GFSK.
- Возможность задать в nRF24l01 адресацию 4 байтами.
Но вот и отличия:
- Разные алгоритмы CRC. Благо в nRF24l01 его можно отключить и заниматься расчетом программно в микроконтроллере.
- nRF24l01 после каждой передачи отключает PLL. Это подкладывает свинью в реализации протокола, т.к. повторный запуск PLL требует приличное время.
- BLE поддерживает пакеты данных с длиной до 39 байт. У nRF24l01 это значение ограничено 32 байтами.
Именно из-за последнего пункта полноценного протокола BLE поднять не получится. Однако, мы можем составить корректный Broadcast-пакет, который участвует в процессе поиска устройства. Код составления пакета:
buf[L++] = 0x42;//PDU type, given address is random buf[L++] = 0x11;//17 bytes of payload buf[L++] = MY_MAC_0;//0xEF buf[L++] = MY_MAC_1;//0xFF buf[L++] = MY_MAC_2;//0xC0 buf[L++] = MY_MAC_3;//0xAA buf[L++] = MY_MAC_4;//0x18 buf[L++] = MY_MAC_5;//0x00 buf[L++] = 2; //flags (LE-only, limited discovery mode) buf[L++] = 0x01; buf[L++] = 0x05; buf[L++] = 7; //name buf[L++] = 0x08; buf[L++] = 'n'; buf[L++] = 'R'; buf[L++] = 'F'; buf[L++] = ' '; buf[L++] = 'L'; buf[L++] = 'E'; buf[L++] = 0x55; //CRC start value: 0x555555 buf[L++] = 0x55; buf[L++] = 0x55; //... btLePacketEncode(buf, L, chLe[ch]); // crc calculate
Программа делает только одно: инициализирует радиомодуль специальным образом, составляет пакет и отправляет его. Этого достаточно, чтобы телефон показал устройство в поиске.
Как использовать
После того, как мой телефон увидел приложение, сразу встал вопрос: а можно ли каким-то образом использовать эту «подделку»? Ограничения в чипе nRF24l01 не дают возможности поднять полноценный BLE-протокол и заканчиваются на том, что телефон «видит» нечто, но никаким образом с ним работать не может. Соответственно, передача данных в устройство отметается сразу, а вот что с передачей данных в телефон? Имя и мак-адрес телефон определяет, а это уже какая-никакая информация, а что еще? А еще можно передавать и наши данные. Для этого необходимо в буфер добавить дополнительные поля. Лучше всего для этого подходит тег MANUFACTURER_DATA=0xFF. Данных за раз можно передавать не более 32 байт (ограничение модуля nRF24l01), при этом часть их тратится на передачу служебных структур BLE. В чистом остатке остается около 32-6-3-3 = 20 байт. Из них 2 байта уйдут на заголовок, таким образом «наших» данных может быть 18 байт. Но стоит учесть, что данный расчет я привел для безымянного устройства.
Применения
Теоретически данный хак можно использовать и в реальных устройствах. Стоимость nRF24l01 кардинально ниже true-BLE-модулей. В смартфон можно передавать данные с каких-либо датчиков, причем как и в случае с BLE, датчики могут иметь батарейное питание. Если взять связку из примитивнейшего ATtiny13 и nRF24l01, получится устройство копеечной стоимости. Разместив десяток или сотню таких в большом помещении (к примеру, ТЦ) можно развернуть локальную систему позиционирования, которая в приложении точно покажет где же находится владелец телефона.К сожалению, для меня открыт вопрос: каким будет потребление самого смартфона. Все-таки связь с устройством не устанавливается, приходится постоянно проводить сканирование. Может кто знаком с темой и сможет прокомментировать.
ANT+
В довесок, исследовал возможность реализации взаимодействия nRF24l01 с ANT+ устройствами. Здесь, к сожалению, все потеряно. Если байт синхронизации в BLE и nRF24l01 совпадает, то в случае с ANT-протоколом работать ничего не будет: последний имеет отличный от них вектор.
Ссылки
- Оринальная статья: «Bit-Banging» Bluetooth Low Energy
- Модифицированная версия утилиты BluetoothLeGatt. Добавлен вывод тела пакета при поиске. В данном теле видны передаваемые приложением данные. Экран работы утилиты представлен выше.
- Исходный код работы с модулем.
- Бинарник с прошивкой микроконтроллера LPC1343 (мост USB-SPI).
Используемые источники:
- https://arduinomaster.ru/datchiki-arduino/arduino-nrf24l01-podkluchenie/
- https://lesson.iarduino.ru/page/urok-26-4-soedinyaem-dve-arduino-po-radiokanalu-cherez-nrf24l01/
- https://habr.com/post/245671/