Подключение nRF24L01 к Ардуино

Подключение модуля nRF24L01 к Arduino позволит сделать беспроводную связь между микроконтроллерами на расстоянии до 30 метров. Рассмотрим, как наладить связь между двумя Ардуино по радиоканалу, чтобы передать данные с аналогового датчика утечки воды и цифрового датчика температуры и влажности DHT11. В первом случае будет передаваться один тип данных, во втором случае два сразу показателя.

Характеристики nRF24L01, nRF24L01+PA+LNA Arduino

nRF24L01 один из самых популярных беспроводных модулей для интернета вещей (IoT). Модули стоят недорого, но на их основе можно организовать многоканальную защищенную связь между контроллерами Ардуино и устройствами. Один модуль способен поддерживать связь сразу с шестью приемниками или передатчиками, т.е. можно объединить сразу семь устройств в общую радиосеть на частоте 2,4 ГГц.

Дальность действия модуля сравнима с блютуз модулем HC-05/06, но с помощью nRF24L01 можно создать многоканальную связь. Т.е. можно объединить в общую сеть до 7 устройств, которые могут одновременно принимать и отправлять сигнал. Для начала мы будем передавать данные с датчика воды, но можно использовать и любой другой аналоговый датчик, например датчик температуры на основе LM35.

Распиновка радио модуля nRF24L01+

Подключение nrf24l01 к Arduino MEGA 2560 (Arduino UNO)
Подключение nrf24l01 к Arduino MEGA 2560 (Arduino UNO)

На плате nRF24L01 встроен демодулятор, синтезатор частот и усилитель сигнала. Дальность действия модуля Arduino nRF24L01+ до 30 метров, а в версии с усилителем и антенной до 1000 метров в прямой видимости. Модуль может использовать 127 каналов связи, отличающихся частотой сигнала — от 2,4 ГГц до 2,483 ГГц. Скорость беспроводного соединения можно настраивать: 250kbps, 1Mbps или 2Mbps.

Кроме сложной схемы подключения nrf24l01 к Arduino NANO и MEGA2560, плата требовательна к питанию (так утверждается на многих форумах и сайтах). Поэтому необходимо припаять к портам питания модуля (GND и VCC) конденсатор до 10мкФ — это снизит помехи. Если вы несколько раз проверили подключение и загрузили скетч с этой страницы, но модуль отказывается работать — то все дело в питании.

Чтобы снизить помехи можно использовать керамический конденсатор
Чтобы снизить помехи можно использовать керамический конденсатор

Как подключить nRF24L01 к Ардуино Uno

Для этого занятия потребуется:

  • Arduino Uno / Arduino Nano / Arduino Mega;
  • 2 модуля nrf24l01, nrf24l01+pa+lna;
  • датчик уровня воды;
  • цифровой датчик DHT11;
  • провода «папа-мама», «папа-папа».
Радиомодуль nRF24L01 datasheet на русском
Радиомодуль nRF24L01 datasheet на русском

Выполнить передачу данных между Arduino по радиоканалу будет намного проще, если у вас плата подключена к отдельному компьютеру или ноутбуку. Тогда сделать отладку скетча будет намного проще и быстрее. До передачи данных по радиоканалу через nRF24L01+, лучше всего проверить каждый модуль скетчем для сканирования — тогда вы будете уверены в правильности подключения и работоспособности модулей.

Скетч для сканирования частот nRF24L01

#include "SPI.h"      // библиотека для обмена данными по протоколу SPI 
#include "nRF24L01.h" // библиотека для nRF24L01+
#include "RF24.h"     // библиотека для радио модуля

RF24 radio(9,10);  // Для MEGA2560 замените на RF24 radio(9,53);
const uint8_t num_channels = 128;
uint8_t values[num_channels];

int serial_putc( char c, FILE * ) {
  Serial.write( c );
  return c;
}

void printf_begin(void) {
  fdevopen( &serial_putc, 0 );
}

void setup(void) {
  Serial.begin(9600);
  printf_begin();
  radio.begin();
  radio.setAutoAck(false);
  radio.startListening(); // включаем прием сигнала

  radio.printDetails(); // если правильно соединили, то увидите настройки модуля
  delay(10000); // задержка на 10 секунд

  radio.stopListening(); // выключаем прием сигнала
  int i = 0; // вывод заголовков всех 127 каналов
  while ( i < num_channels )  {
    printf("%x",i>>4);
    ++i;
  }
  printf("\n\r");
  i = 0;
  while ( i < num_channels ) {
    printf("%x",i&0xf);
    ++i;
  }
  printf("\n\r");
}

const int num_reps = 100;

void loop(void) {
  memset(values, 0, sizeof(values));
  int rep_counter = num_reps;
  while (rep_counter--) {
    int i = num_channels;
    while (i--) {
      radio.setChannel(i);
      radio.startListening(); // включаем прием сигнала
      delayMicroseconds(128);
      radio.stopListening(); // выключаем прием сигнала
      if ( radio.testCarrier() )
        ++values[i];
    }
  }
  int i = 0;
  while ( i < num_channels ) {
    printf("%x", min(0xf, values[i] & 0xf));
    ++i;
  }
  printf("\n\r");
}

Пояснения к коду:

  1. программа выводит на последовательный порт информацию о модуле nRF24L01+ или радиомодуле nRF24L01+pa+lna Arduino;
  2. далее выводится информация о всех частотах на которых работает модуль и информацию об их загруженности, выбирайте частоту для работы без помех;



Если скетч успешно загрузился, но вы не видите похожую информацию на мониторе порта, то еще раз проверьте соединение платы с микроконтроллером. Через 10 секунд после получения информации о характеристиках nRF24L01+ (тка24д01) вы получите информацию о помехах на всех 127 каналах связи. Первые две строчки — это имена каналов, состоящие из двух символов на первой и второй строке.

Вывод информации о характеристиках модуля nRF24L01+ на мониторе
Вывод характеристик nRF24L01+. Сканер и проверка модуля

Скетч. nRF24L01 передача данных с датчика воды

Как подключить к Ардуино nrf24l01
Как подключить к Ардуино nrf24l01 и датчик воды

Модуль работает по интерфейсу SPI, соответственно подключать модуль nRF24L01 следует к определенным портам микроконтроллера (не забывайте, что у Arduino Mega интерфейс SPI находится на других портах). Одну плату нужно настроить, как приемник сигнала (receiver), а второй микроконтроллер, как передатчик (transmitter). После подключения беспроводных модулей к микроконтроллеру, загрузите скетч.

Скетч для передатчика.

#include "SPI.h"      // библиотека для протокола SPI
#include "nRF24L01.h" // библиотека для nRF24L01+
#include "RF24.h"     // библиотека для радио модуля

const uint64_t pipe = 0xF0F1F2F3F4LL; // идентификатор передачи
RF24 radio(9,10); // Для MEGA2560 замените на RF24 radio(9,53);

void setup() {
  pinMode(A0,INPUT);   // порт для датчика воды
  Serial.begin(9600);  // запускаем последовательный порт
  radio.begin();       // включаем радио модуль
  radio.setChannel(0); // выбираем канал (от 0 до 127)

    // скорость: RF24_250KBPS, RF24_1MBPS или RF24_2MBPS
  radio.setDataRate(RF24_1MBPS);
    // мощность: RF24_PA_MIN=-18dBm, RF24_PA_LOW=-12dBm, RF24_PA_MED=-6dBM
  radio.setPALevel(RF24_PA_HIGH);

  radio.openWritingPipe(pipe);      // открываем трубу на передачу
  radio.stopListening();
}

void loop() {
  int data = analogRead(A0);        // читаем значение с датчика
  
  radio.write(&data, sizeof(data)); // отправляем данные и указываем байты
  
  Serial.print("data: ");
  Serial.println(data);             // выводим данные на монитор порта
  delay(1000);
}

Скетч для приемника.

#include "SPI.h"      // библиотека для протокола SPI
#include "nRF24L01.h" // библиотека для nRF24L01+
#include "RF24.h"     // библиотека для радио модуля

const uint64_t pipe = 0xF0F1F2F3F4LL; // идентификатор передачи
RF24 radio(9,10); // Для MEGA2560 замените на RF24 radio(9,53);

void setup() {
  Serial.begin(9600);  // запускаем последовательный порт
  radio.begin();       // включаем радио модуль
  radio.setChannel(0); // выбираем канал (от 0 до 127)

    // скорость: RF24_250KBPS, RF24_1MBPS или RF24_2MBPS
  radio.setDataRate(RF24_1MBPS);
    // мощность: RF24_PA_MIN=-18dBm, RF24_PA_LOW=-12dBm, RF24_PA_MED=-6dBM
  radio.setPALevel(RF24_PA_HIGH);

  radio.openReadingPipe(1, pipe);    // открываем первую трубу
  radio.startListening();            // начинаем слушать трубу
}

void loop() {
  int data;
  
  if (radio.available())             // проверяем буфер обмена
  {
    radio.read(&data, sizeof(data)); // читаем данные
    Serial.print("data: ");
    Serial.println(data);            // выводим данные на монитор порта
  }
}

Пояснения к коду:

  1. порты 9 и 10 для подключения nRF24L01 можно поменять, как и канал связи;
  2. данные с аналогового порта A0 отправляются на аппаратный последовательный порт и от передатчика по радио каналу 1 раз в секунду;
  3. если данные с приемника не выводятся на мониторе порта, то первым делом проверьте правильность подключения передатчика.

Скетч. nRF24L01 передача данных с цифрового датчика

Подключение nrf24l01+ к Arduino
Подключение nrf24l01+ к Arduino и датчика DHT11

Скетч для передатчика.

#include "SPI.h"      // библиотека для протокола SPI
#include "nRF24L01.h" // библиотека для nRF24L01+
#include "RF24.h"     // библиотека для радио модуля
#include "DHT.h"      // библиотека для датчика DHT11

const uint64_t pipe = 0xF0F1F2F3F4LL; // идентификатор передачи
RF24 radio(9,10);  // Для MEGA2560 замените на RF24 radio(9,53);
DHT dht(2, DHT11); // сообщаем на каком порту будет датчик

void setup() {
  dht.begin();         // включаем датчик DHT11
  Serial.begin(9600);  // включаем последовательный порт
  radio.begin();       // включаем радио модуль
  radio.setChannel(0); // выбираем канал (от 0 до 127)
  delay(2);

  radio.setChannel(0);            // устанавливаем канал (0-127)
  radio.setDataRate(RF24_1MBPS);  // скорость передачи данных
  radio.setPALevel(RF24_PA_HIGH); // мощность передатчика

  radio.openWritingPipe(pipe);    // открываем трубу на передачу
  radio.stopListening();          // останавливаем прослушку
}

void loop() {
  float data[2];
  
  data[0] = dht.readHumidity();     // заполняем массив
  data[1] = dht.readTemperature();  // заполняем массив
  radio.write(&data, sizeof(data)); // отправляем данные по радиосигналу

  Serial.print("Humidity: ");
  Serial.println(data[0]);          // выводим данные влажности
  Serial.print("Temperat: ");
  Serial.println(data[1]);          // выводим данные температуры
  Serial.println("-");
  delay(1000);
}

Скетч для приемника.

#include "SPI.h"      // библиотека для протокола SPI
#include "nRF24L01.h" // библиотека для nRF24L01+
#include "RF24.h"     // библиотека для радио модуля

const uint64_t pipe = 0xF0F1F2F3F4LL; // идентификатор передачи
RF24 radio(9,10);  // Для MEGA2560 замените на RF24 radio(9,53);

void setup() {
  Serial.begin(9600);  // включаем последовательный порт
  radio.begin();       // включаем радио модуль
  radio.setChannel(0); // выбираем канал (от 0 до 127)
  delay(2);

  radio.setChannel(0);            // устанавливаем канал (0-127)
  radio.setDataRate(RF24_1MBPS);  // скорость передачи данных
  radio.setPALevel(RF24_PA_HIGH); // мощность передатчика

  radio.openReadingPipe(1, pipe); // открываем первую трубу
  radio.startListening();         // начинаем слушать трубу
}

void loop() {
  float data[2];
  
  if (radio.available())             // проверяем буфер обмена
  {
    radio.read(&data, sizeof(data)); // читаем данные

  Serial.print("Humidity: ");
  Serial.println(data[0]);           // выводим данные влажности
  Serial.print("Temperat: ");
  Serial.println(data[1]);           // выводим данные температуры
  Serial.println("-");
  delay(500);
  }
}

Пояснения к коду:

  1. порты 9 и 10 для подключения nRF24L01 можно поменять, как и канал связи;
  2. данные с датчика температуры и влажности DHT11 отправляются на аппаратный последовательный порт и по радио каналу 1 раз в секунду;
  3. если данные с приемника не выводятся на мониторе порта, то первым делом проверьте правильность подключения передатчика тка24д01.


14 Replies to “Радио модуль nRF24L01 Ардуино подключение”

  1. Код не рабочий, автор функции openWritingPipe указал и в приемнике и в передатчике. Верно указать в приемнике openReadingPipe и не stopListening, а startListening. Передатчик вроде работает верно. Брал пример для аналогового датчика

      1. В скетче почему-то num_channels указано 128 — это 129 получается, если первый канал 0. У вас индусы код пишут что-ли? Если каналов 127, надо писать 127, а в цикле ставить не i<num_channels, а i<=num_channels. Такой код понятнее и более очевидны нюансы

  2. Добрый день, собрал, как указано на схеме, передатчик тка24д01 работает, данные в Монитор порта загружаются, однако в приемник данные не поступают, Подскажите, пожалуйста, в чем может быть дело

    1. Причин может быть очень много. Конденсаторы к радио модулям припаяны? Питание Ардуино идет от ПК или от аккумулятора?

      1. Конденсаторы не припаяны, питание от ПК, на приемнике вообще никакая информация не выводится, даже текстовая.

    2. Совместимость микроконтроллеров приемника и передатчика должны быть одинаковыми например AT mega 328p и ниже строчка PU или TH тип микроконтроллера. Проверь этот вариант .

    1. В одном комментарии это не объяснить, надо отдельную страницу делать с проектом. Попробую в ближайшее время заняться этим проектом.

  3. Подскажите пожалуйста. Как я понял Ардуино считывает все данные, которые пришли по радиосигналу командой radio.read(&data, sizeof(data)); Не будет ли путаницы при обработке данных? Спасибо.

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

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

Этот сайт использует Akismet для борьбы со спамом. Узнайте, как обрабатываются ваши данные комментариев.