Обзор радио модуля NRF24L01+

Обзор радио модуля NRF24L01+Начну серию обзоров по недорогим модулем радиосвязи работающих на частоте 2,4 ГГц (трансивер), которые основаны на чипе от Nordic Semiconductor nRF24L01+, поддерживающий передачу данных до 2 мбит/с и может работать на 126 каналов.  В данной статье расскажу о NRF24L01+ с малой мощностью и малым радиусом действия (до 100 метров или около 30 метров в помещении), в следующей статье расскажу о модуле NRF24L01+ с внешней антенной которые имеет большую мощность (до 1000 км). Так же, для подключения к Arduino буду использовать Адаптер для NRF24L01+.

Технические параметры 

На модуле расположена основная микросхема nRF24L01+, рядом установлен кварцевый резонатор, антенна и электрическая обвязка, программное обеспечение микросхемы nRF зашивают на производстве. Связь осуществляется в двунаправленном режиме по интерфейсе SPI (Serial Peripheral Interface), для этого предусмотрен 8 контактный разъем (шаг 2.54 мм).

Обзор радио модуля NRF24L01+

Модуль автоматически формирует и отправляет пакеты, пользователю доступны только дополнительные настройки, такие как скорость передачи, отправка и принятие данных, мощность передатчика и так далее. Каждому модулю присваивается уникальный адрес в пределах сети, что позволяет организовать большую сеть, для обмена данными между датчиками температуры, давления, а так же организовать обмен командами в системе умный дом. Принципиальную схему NRF24L01 с минимальной обвязкой можно посмотреть на фото ниже, так же кому интересно на официальном сайте, можно скачать полную документацию с Gerber файлами, прошивку, программы и т.д.

Схема радио модуля NRF24L01+

Подключение nRF24L01 к Arduino

Необходимые детали:
► Arduino UNO R3 x 2 шт.
► Провод DuPont, 2,54 мм, 20 см x 2 шт.
► Кабель USB 2.0 A-B x 2 шт.
► Радиомодуль nRF24L01+ x 2 шт.
► Тактовая кнопка x 1 шт.
► Светодиод 5 мм x 1 шт.
► Резистор 0.125 Вт, 10 кОм — x 1 шт. (для кнопки)
► Резистор 0.125 Вт, 270 Ом — x 1 шт.  (для светодиода)

Подключение:
Для подключения nRF24L01 к Arduino используется интерфейс SPI и так как вывода этого интерфейса на различных платах отличается, приведу краткую таблицу подключения для различных плат.

Таблица подключения радио модуля NRF24L01+

На модуле nRF24L01+ предусмотрен один разъем 4 х 2 с шагом контактов 2.54 мм, назначение каждого можно посмотреть на фотографии ниже.

Таблица подключения радио модуля NRF24L01+

Модуль работает от напряжения питания 3.3В и потребляет ток около 20мА. На некоторых плат Arduino нет встроенного стабилизатора напряжения, необходимо использовать внешний, например LM1117.

Внимание! Необходимо помнить, что модуль работает от 3.3 В и в нем защиты от переполюсовки, если не соблюдать два этих правила, можно сжечь модуль!

Теперь приступим к сборке, подключаем вывода напрямую (MISO-12, MOSI-11, SCK-13), выводы CE (ChipEnable) и CSN (ChipSelectNot) подключаем к D10 и D9, можно использовать и другие цифровые вывода, главное подправить программу. Далее необходимо подключить кнопку, одну ножку через резистор 10Ком, подключаем к GND (Arduino) и этот же контакт к выводу 7. Осталось подключить питание (главное помнить два правила, что описывал выше) вывода Vcc к +3.3V и GND к GND. Вывод IRQ не используется в большинстве программ включая этот пример. Аналогично собираем вторую схему, вместо кнопки у нас будет светодиод.

Схема подключения радио модуля NRF24L01+ к Arduino

Внимание! Для стабильной работы модуля NRF24L01+ необходимо припаять конденсатор на 10 мкФ (изначально тестировал без конденсаторов, модули лежали друг от друга на расстоянии 10 см и связи не было). Так-же, обязательно заземлите вывод 7, с помощью резистор на 10 кОм, а то будет ложное срабатывание кнопки. 

Обзор радио модуля NRF24L01+

Для этого эксперимента необходимо скачать и установить библиотеку «RF24». Затем скопируйте и вставьте этот пример кода в окно программы IDE Arduino и загрузите в контроллер.

Программа для передатчика:

  Скачать скетч master

Программа для приемника:

  Скачать скетч slave

Обзор радио модуля NRF24L01+

Обзор радио модуля NRF24L01+

Ссылки
  Библиотека RF24
  Документация к NRF24L01+

Купить на Aliexpress
 Контроллер Arduino UNO R3 на CH340G
  Контроллер Arduino UNO R3 на Atmega16U2
  Провода DuPont, 2,54 мм, 20 см
  Датчик радио модуля NRF24L01+
  Датчик радио модуля NRF24L01+PA+LNA 
  Адаптер для NRF24L01+

Купить в Самаре и области
  Контроллер Arduino UNO R3 на CH340G
  Контроллер Arduino UNO R3 на Atmega16U2
  Провода DuPont, 2,54 мм, 20 см
 Радио модуля NRF24L01+
 Радио модуля NRF24L01+PA+LNA
  Адаптер для NRF24L01+

21 комментарий для “Обзор радио модуля NRF24L01+”
  1. Спасибо за скетч! Я ,с вашей помощью, впервые осуществил связь между модулями. До этого думал что они бракованные. Но ваш скетч работает и даже в пределах квартиры!

  2. Отличная статья! Я мега начинающий , не могли бы вы мне подсказать как подключить несколько кнопок?

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

  3. Сергей, я только присматриваюсь к arduino. Хотя с arduino у меня опыта ноль. Ваша статья навела меня на мысль попробовать сделать что-то типа метеостанции с выносными беспроводными датчиками (температуры/влажности/давления). С центральным блоком в помещении с ЖКИ и кнопками и уличными (балконными, подвальными, тепличными и т.п.) датчиками.

    У меня к вам 2 вопроса:

    Вопрос 1:
    Если датчиков будет несколько, то центральное устройство должно поочередно их опрашивать. Я так понимаю, что для каждого датчика должен быть задан свой канал (исходя из терминологии в вашем коде) или они могут висеть на одном канале, но с разными идентификаторами ?

    Вопрос 2:
    Чтобы выносные датчики не разряжали зря батарейки/аккумы, крутясь в бесконечном цикле прослушивания эфира, напрашивается элементарный протокол обмена: датчик после сеанса обмена (с центральным устройством) уходит в сон на таймаут (скажем, 60 секунд), а затем просыпается (по таймеру) и слушает эфир какой-то промежуток времени (скажем, секунды 3). Если обмен в этот промежуток состоялся, то сразу после обмена снова в сон и таким образом может дольше продлить жизнь батарейки.

    А теперь и сам вопрос: насколько сложно реализовать подобное в среде разработки arduino? Ведь для этого надо программировать регистры микроконтроллера, включать прерывания, подготовить процедуру обработчика прерывания. А ваши примеры построены на бесконечном цикле…

    1. Добрый день, Юрий.
      Ответ на вопрос 1: На одном канале может работать до шести NRF21L01, но с разными идентификаторами. (в сетях эту технологию называют «Звезда»)
      Ответ на вопрос 2: Для уменьшения электропотребления на передающих устройствах, можно отпаять все светодиоды и перевести микроконтроллер в спящий режим, а так же отключать NRF от питания, например на 60 секунд. Затем включать NRF и микроконтроллер, на небольшое время для отправки данных и снова переводить в спящий режим и так далее.

      Несложно сделать, в следующий статье покажу один из примеров.

    2. Вопрос 1. В примерах к библиотеке RF24 есть скетч starping. Суть такова: пять датчиков шлют данные в эфир, а один читает их все и отправляет обратно отправителю. Классический пример, и все понятно.

      Вопрос 2. В примерах к библиотеке RF24 есть скетч pingpair_sleepy там приведен пример программной реализации ухода радио модуля в сон после сеанса передачи. Если вас интересуют прерывания по таймеру, то существует великолепная простая библиотека Timerone. Почитайте про неё.

      Все вышеописанное очень просто. Если будут еще вопросы, просмотрите остальные примеры. Если вы знаете C++, то проблемы решатся.

  4. как сделать на 2-е и более кнопок с произвольным и даже одновременным их включением

  5. Добрый день. Подскажите пожалуйста, а можно сделать чтоб диод светился не только при нажатой кнопке, а включался выключался? Хочу фары сделать на модель машинки. Заранее спасибо

    1. Введите еще одну переменную, например «а» (а=0), и после входа в цикл, сделайте еще одну проверку на выполнение обоих условий
      if (radio.available()){ // Если в буфере поступили данные
      radio.read(data, 1); // Считываем данные с массива data
      if(data[0] == 123){ // Если в массиве data значение 123 (кнопка нажата)
      ; if( a==0){ // фары выключены, включаем (начальное значение «0»)
      digitalWrite(LED, HIGH);} // Включаем фары
      ; а=1; // присваиваем «1» (фары горят)
      delay(10); // Ждем 10мс
      }
      else{ // Если «а» не 0 (фары горят) и нажата кнопка
      digitalWrite(LED, LOW); // Выключаем фары
      ; а=0; // записываем в «а» 0, чтобы при следующем нажатии выполнилось условие на включение
      delay(10); // Ждем 10мс
      }
      это не код программы а ответ на ваш вопрос.

      1. прошу прощения, переменная не нужна, можно просто проверять состояние переменной LED, hight или low, логика та же.

  6. Здравствуйте Сергей. Сразу прошу прощения за ламерские вопросы, когда то давно занимался программированием (писал БД на DBase,Foxpro), но практики к сожалению не было более 15 лет. В принципе логика работы понятна, но хотел уточнить пару моментов. Есть необходимость пересадить данное устройство на радиоканал, за некоторыми изменениями (http://fornk.ru/3186-distancionnoe-upravlenie-pri-pomoshhi-pdu-na-8-kanalov/#comment-3916), с автором к сожалению связаться не удалось, поэтому обращаюсь к Вам. Есть ли какие то функции/операторы перебора, вроде DO CASE, чтобы при получении определенного значения от приемника выполнялись те или иные действия, если есть подскажите пожалуйста или есть какие то ссылки на это с описанием синтаксиса. И второй вопрос, LOOP сбрасывает состояния пинов в начальные состояния при уходе в режим прослушивания

  7. Здравствуйте! На разных сайтах библиотека RF24 разного объема, с чем это связано?

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

  8. Добрый день! Читал в комментариях про метеостанцию с выносными беспроводными датчиками. Но я не совсем понимаю, точнее совсем не понимаю как подключить датчик к радиомодулю, чтобы он передавал на Ардуинку сигналы датчика? У вас в примере две Ардуинки. Правильно понимаю, что без второй Ардуинки с подклбченным к ней радиомодулем и датчиком ничего не получится?
    Хочу реализовать систему защиты от протечек с беспроводными датчиками.

    1. Здравствуйте, правильно понимаете, для работы модуля необходим контроллер для управления.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *