Подключение модуля nRF24L01+ к Arduino — соединяем две arduino по радиоканалу

nRF24L01 один из самых популярных беспроводных модулей для интернета вещей (IoT). Подключение модуля nRF24L01+ к Arduino позволит организовать многоканальную защищенную связь между Arduino и устройствами на расстоянии. Рассмотрим, как наладить связь между двумя или несколько плат Ардуино по радиоканалу.

Содержание

Установка библиотеки RF24

Работать с nRF24L01+ можно с помощью библиотеки RF24 — довольно популярная и удобная библиотека. Скачиваем, распаковываем и закидываем библиотеку RF24 в папку Arduino/libraries. В случае, если на момент добавления библиотеки, Arduino IDE была открытой, перезагружаем среду.

Библиотеку можно установить из самой среды следующим образом:

  1. В Arduino IDE открываем менеджер библиотек: Скетч->Подключить библиотеку->Управлять библиотеками…Подключение модуля nRF24L01+ к Arduino - Управлять библиотеками...
  2. В строке поиска вводим «RF24», находим библиотеку автора TMRh20, выбираем последнюю версию и кликаем Установить.Подключение модуля nRF24L01+ к Arduino - RF24 Установка
  3. Библиотека установлена (INSTALLED).Подключение модуля nRF24L01+ к Arduino - RF24 INSTALLED

Описание методов библиотеки RF24

begin()

Инициализация работы модуля.

bool RF24::begin(void);

Возвращает
bool — результат инициализации (true / false).

startListening()

Начать прослушивание труб, открытых для приёма данных.

void RF24::startListening(void);

stopListening()

Прекратить прослушивание труб и переключиться в режим передатчика.

void RF24::stopListening(void);

available()

Проверить наличие принятых данных доступных для чтения.

bool RF24::available(void);
bool RF24::available(uint8_t * pipe_num);

Параметры
pipe_num — адрес переменной типа uint8_t в которую требуется поместить номер трубы по которой были приняты данные.
Возвращает
bool — флаг наличия принятых данных (true / false).

isAckPayloadAvailable()

Проверить передатчиком наличие данных в ответе приёмника.

bool RF24::isAckPayloadAvailable(void);

Возвращает
bool — флаг наличия принятых данных от приёмника (true / false).

read()

Прочитать принятые данные.

void RF24::read(void * buf, uint8_t len);

Параметры
buf — адрес массива, строки или переменной в которую требуется поместить принятые данные.
len — количество байт занимаемое массивом, строкой или переменной в которую требуется поместить принятые данные.

write()

Отправить данные по радиоканалу.

bool RF24::write(const void * buf, uint8_t len, const bool multicast);

Параметры
buf — Данные, адрес массива, строки или переменной, данные которой требуется отправить.
len — Размер отправляемых данных в байтах.
multicast — Флаг групповой передачи, установите в true если требуется отправить данные нескольким приёмникам.
Возвращает
bool — результат доставки данных приёмнику (true / false).

writeAckPayload()

Подготовить данные для ответа передатчику.

void RF24::writeAckPayload(uint8_t pipe, const void * buf, uint8_t len);

Параметры
pipe — Номер трубы передатчика которому требуется ответить данными.
buf — Данные, адрес массива, строки или переменной, данные которой требуется отправить вместе с ответом передатчику.
len — Размер отправляемых данных в байтах.

openWritingPipe()

Открыть трубу для передачи данных.

void RF24::openWritingPipe(uint64_t address);

Параметры
address — Адрес трубы, состоит из 5 байт (по умолчанию) и может быть представлен числом типа uint64_t или массивом из 5 однобайтных элементов. Адрес трубы передатчика должен совпадать с одним из адресов труб приёмника.

openReadingPipe()

Открыть трубу для приёма данных.

void RF24::openReadingPipe(uint8_t number, const uint8_t * address);
void RF24::openReadingPipe(uint8_t number, uint64_t address);

Параметры
number — Номер трубы (число от 0 до 5).
address — Адрес трубы, состоит из 5 байт (по умолчанию) и может быть представлен числом типа uint64_t или массивом из 5 однобайтных элементов. Адрес трубы приёмника должен совпадать с адресом трубы передатчика.

closeReadingPipe()

Закрыть трубу открытую ранее для прослушивания (приёма данных).

void RF24::closeReadingPipe(uint8_t pipe):

Параметры
number — Номер трубы (число от 0 до 5), которую более не требуется прослушивать.

setChannel()

Установить радиочастотный канал связи. Номер канала определяет частоту на которой работает модуль. Каждый канал имеет шаг в 1 МГц, а каналу 0 соответствует частота 2,4 ГГц = 2400 МГц, следовательно, каналу 1 соответствует частота 2401 МГц, каналу 2 — частота 2402 МГц и т.д. до канала 125 с частотой 2525 МГц.

void RF24::setChannel(uint8_t channel);

Параметры
channel — Номер канала, указывается числом от 0 до 125.

getChannel()

Получить номер текущего радиочастотного канала связи.

uint8_t RF24::getChannel(void);

Возвращает
Номер канала, число от 0 до 125.

setDataRate()

Установить скорость передачи данных по радиоканалу.

bool RF24::setDataRate(rf24_datarate_e speed);

Параметры
speed — Скорость, задаётся одной из констант: RF24_1MBPS — 1 Мбит/сек, RF24_2MBPS — 2 Мбит/сек и RF24_250KBPS — 250 Кбит/сек (только для модуля NRF24L01+PA+LNA).
Возвращает
Флаг успешной установки новой скорости (true / false).

getDataRate()

Получить текущую скорость передачи данных по радиоканалу.

rf24_datarate_e RF24::getDataRate(void);

Возвращает
значение одной из констант сопоставленной скорости:RF24_1MBPS — 1 Мбит/сек, RF24_2MBPS — 2 Мбит/сек и RF24_250KBPS — 250 Кбит/сек (только для модуля NRF24L01+PA+LNA).

setPALevel()

Установить уровень усиления мощности передатчика.

void RF24::setPALevel(uint8_t level);

Параметры
level — Уровень, задаётся одной из констант:

  • RF24_PA_MIN — минимальный уровень усиления = -18 дБм.
  • RF24_PA_LOW — низкий уровень усиления = -12 дБм.
  • RF24_PA_HIGH — высокий уровень усиления = -6 дБм.
  • RF24_PA_MAX — максимальный уровень усиления = 0 дБм.

getPALevel()

Получить текущий уровень усиления мощности передатчика.

uint8_t RF24::getPALevel(void);

Возвращает
значение одной из констант сопоставленной мощности:RF24_PA_MIN — минимальный уровень усиления = -18 дБм.

  • RF24_PA_LOW — низкий уровень усиления = -12 дБм.
  • RF24_PA_HIGH — высокий уровень усиления = -6 дБм.
  • RF24_PA_MAX — максимальный уровень усиления = 0 дБм.
  • RF24_PA_ERROR — уровень усиления не определён.

setCRCLength()

Установить размер CRC (циклически избыточный код).

void RF24::setCRCLength(rf24_crclength_e length);

Параметры
length — Размер, задаётся одной из констант: RF24_CRC_8 — под CRC отводится 8 бит (CRC-8) или RF24_CRC_16 — под CRC отводится 16 бит (CRC-16).

getCRCLength()

Получить текущий размер CRC (циклически избыточный код).

rf24_crclength_e RF24::getCRCLength(void);

Возвращает
значение одной из констант сопоставленной размеру CRC: RF24_CRC_8 — под CRC отводится 8 бит (CRC-8), RF24_CRC_16 — под CRC отводится 16 бит (CRC-16) или RF24_CRC_DISABLED — передача и проверка CRC отключены.

disableCRC()

Отключить передачу CRC передатчиком и проверку данных приёмником.

void RF24::disableCRC(void);

setPayloadSize()

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

void RF24::setPayloadSize(uint8_t size);

Параметры
size — Размер блока данных пользователя в байтах.

getPayloadSize()

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

uint8_t RF24::getPayloadSize(void);

Возвращает
текущий статичный размер блока данных от 0 до 32 байт.

getDynamicPayloadSize()

Получить размер блока данных в последнем принятом пакете.

uint8_t RF24::getDynamicPayloadSize(void);

Возвращает
размер данных последнего принятого пакета в байтах.

enableDynamicPayloads()

Разрешить динамически изменяемый размер блока данных для всех труб.

void RF24::enableDynamicPayloads(void);

enableDynamicAck()

Разрешить отказываться от запроса пакетов подтверждения приёма.

void RF24::enableDynamicAck(void);

enableAckPayload()

Разрешить размещать данные пользователя в пакете подтверждения приёма.

void RF24::enableAckPayload(void);

setAutoAck()

Управление автоматической отправкой пакетов подтверждения приёма данных.

void RF24::setAutoAck(bool enable);
void RF24::setAutoAck(uint8_t pipe, bool enable);

Параметры
pipe — номер трубы, для которой разрешается / запрещается автоматическая отправка пакетов подтверждения приема. Указывается только на стороне приёмника. Если номер трубы на стороне приёмника не указан, то действие функции распространяется на все трубы.
enable — Флаг разрешающий автоматическую отправку пакетов подтверждения приёма данных. true — разрешить / false — запретить.

setAddressWidth()

Указать длину адресов труб в байтах.

void RF24::setAddressWidth(uint8_t a_width);

Параметры
a_width — Размер адреса трубы в байтах, представлен числом 3, 4 или 5.

setRetries()

Указать максимальное количество попыток отправки данных и время ожидания.

void RF24::setRetries(uint8_t delay, uint8_t count);

Параметры
delay — целое число от 0 до 15 определяющее время ожидания подтверждения приема.
count — целое число от 1 до 15 определяющее максимальное количество попыток доставить данные передатчику.

powerDown()

Перейти в режим пониженного энергопотребления.

void RF24::powerDown(void);

powerUp()

Выйти из режима пониженного энергопотребления.

void RF24::powerUp(void);

isPVariant()

Проверить аппаратную совместимость модуля с функциями nRF24L01.

bool RF24::isPVariant(void);

Возвращает
(true / false) флаг указывающий на совместимость аппаратного обеспечения модуля с функциями чипа nRF24L01+.

writeFast()

Быстро отправить данные по радиоканалу.

bool RF24::writeFast(const void * buf, uint8_t len);
bool RF24::writeFast(const void * buf, uint8_t len, const bool multicast);

Параметры
buf — Данные, адрес массива, строки или переменной, данные которой требуется отправить.
len — Размер отправляемых данных в байтах.
multicast — Флаг групповой передачи, установите в true если требуется отправить данные нескольким приёмникам.
Возвращает
результат записи данных в буфер для передачи (true / false).

writeBlocking()

Быстро отправить данные по радиоканалу с указанием таймаута.

bool RF24::writeBlocking(const void * buf, uint8_t len, uint32_t timeout);

Параметры
buf — Данные, адрес массива, строки или переменной, данные которой требуется отправить.
len — Размер отправляемых данных в байтах.
timeout — Максимальное время ожидания освобождения буфера FIFO в миллисекундах.
Возвращает
результат записи данных в буфер для передачи (true / false).

startFastWrite()

Начать быструю отправку данных.

void RF24::startFastWrite(const void * buf, uint8_t len, const bool multicast, bool startTx = 1);

Параметры
buf — Данные, адрес массива, строки или переменной, данные которой требуется отправить.
len — Размер отправляемых данных в байтах.
multicast — Флаг групповой передачи, установите в true если требуется отправить данные нескольким приёмникам.
startTx — флаг перехода в режим TX или STANDBY-II. Если не указан, значит установлен.

startWrite()

Начать отправку данных.

void RF24::startWrite(const void * buf, uint8_t len, const bool multicast);

Параметры
buf — Данные, адрес массива, строки или переменной, данные которой требуется отправить.
len — Размер отправляемых данных в байтах.
multicast — Флаг групповой передачи, установите в true если требуется отправить данные нескольким приёмникам.

txStandBy()

Подождать пока передаются данные и вернуть результат.

bool RF24::txStandBy(void);
bool RF24::txStandBy(uint32_t timeout, bool startTx = 0);

Параметры
timeout — максимальное время ожидания указывается в миллисекундах.
Возвращает
результат передачи данных из буферов FIFO в радиоканал (true / false).

rxFifoFull()

Проверить не заполнены ли все три буфера FIFO.

bool RF24::rxFifoFull(void);

Возвращает
флаг указывающий на то что все буферы FIFO заполнены.

flush_tx()

Очистка буферов FIFO.

uint8_t RF24::flush_tx(void);

reUseTX()

Повторная отправка данных из буфера FIFO, если они там есть.

void RF24::reUseTX(void);

testCarrier()

Проверка наличия несущей частоты на выбранном канале (частоте).

bool RF24::testCarrier(void);

Возвращает
наличие несущей на выбранном канале за все время его прослушивания.

testRPD()

Проверка наличия любого сигнала выше -64 дБм на выбранном канале (частоте).

bool RF24::testRPD(void);

Возвращает
наличие сигнала мощностью выше -64 дБм на выбранном канале за все время его прослушивания.

isValid()

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

bool RF24::isValid(void);

Возвращает
назначение редактируется (true / false).

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

Подключается nRF24L01+ к Arduino по шине SPI (можно использовать как аппаратную так и программную шину). Выводы модуля Vcc и GND подключаются к шине питания 3.3 В постоянного тока. Выводы модуля MISO, MOSI и SCK подключаются к одноименным выводам шины SPI на плате Arduino. Выводы SS (Slave Select) и CE (Chip Enable) назначаются при объявлении объекта библиотеки RF24 и подключаются к любым назначенным выводам Arduino.

Подключить nRF24L01+ к Arduino можно как напрямую, так и через специальный адаптер.

Подключение nRF24L01+ к Arduino напрямую

Подключение nRF24L01+ к Arduino UNO напрямую

Внимание!

  • Необходимо помнить, что модуль работает от 3.3 В и в нем нет защиты от переполюсовки, если не соблюдать два этих правила, можно сжечь модуль!
  • Для стабильной работы модуля NRF24L01+ необходимо припаять конденсатор на 10 мкФ между VCC и GND.

nRF24L01+ - электролитический конденсатор емкостью 100 мкФ

nRF24L01+ Arduino UNO/Pro Mini Arduino MEGA2560
GND GND GND
VCC 3.3V 3.3V
CE 9 9
CSN 10 53
SCK 13 52
MOSI 11 51
MISO 12 50
IRQ

Подключение nRF24L01+ к Arduino через адаптер

Адаптер nRF24L01+ Arduino UNO/Pro Mini Arduino MEGA2560
GND GND GND
VCC 5.0V 5.0V
CE 9 9
CSN 10 53
SCK 13 52
MO/MOSI 11 51
MI/MISO 12 50
IRQ

Примеры

Обмен данными между двумя платами Arduino UNO и Pro Mini через nRF24L01+

Пример 1: Проверочный скетч

/*
  Подключаем файл настроек из библиотеки RF24.
*/
#include <nRF24L01.h>
/*
  Подключаем библиотеку для работы с nRF24L01+.
*/
#include <RF24.h>
#include <printf.h>

/*
  Создаём объект radio для работы с библиотекой RF24,
  указывая номера выводов модуля (CE, SS).
*/
RF24 radio(7, 10);

void setup() {
  /*
    Инициируем передачу данных по шине UART в монитор
    последовательного порта на скорости 115200 бит/сек.
  */
  Serial.begin(115200);
  printf_begin();
  /*
    Инициируем работу модуля nRF24L01+.
  */
  radio.begin();
  if (radio.isPVariant()) {
    /*
      Если модуль поддерживается библиотекой RF24,
      то выводим текст «Модуль nRF24L01 подключен».
    */
    Serial.println("Модуль nRF24L01 подключен");
    /*
      Дамп конфигурации RF для отладки
    */
    radio.printDetails();
  } else {
    /*
      Иначе, если модуль не поддерживается,
      то выводи текст «Неизвестный модуль».
    */
    Serial.println("Неизвестный модуль");
  }
}

void loop() {
}

Результат

Подключение модуля nRF24L01+ к Arduino - Проверочный скетч, Результат

Если после загрузки проверочного скетча увидели, в окне монитора последовательного порта, надпись «Модуль nRF24L01 подключен», значит Ваш модуль поддерживается библиотекой RF24. Если Вы увидели надпись «Неизвестный модуль», проверьте подключение модуля к Arduino. В скетче указано что вывод «CE» (Chip Enable) модуля подключается к выводу 7 Arduino, а вывод SS (Slave Select) модуля подключается к выводу 10 Arduino. При необходимости измените выводы на другие. Если модуль подключён правильно, значит он собран на чипе отличном от nRF24L01.

Пример 2: Передача данных

В функции setup() данного примера модулю задаются основные настройки:

  • по умолчанию модуль работает в качестве передатчика;
  • 0x30 канал;
  • скорость 1 Мбит/сек (RF24_1MBPS);
  • максимальная мощности (RF24_PA_MAX);
  • адрес трубы 0x0123456789LL.

На стороне приёмника нужно указать тот же номер канала, скорость передачи, мощность и адрес трубы.

/*
  Подключаем файл настроек из библиотеки RF24
*/
#include <nRF24L01.h>
/*
  Подключаем библиотеку  для работы с nRF24L01+
*/
#include <RF24.h>

/*
  Создаём объект radio для работы с библиотекой RF24,
  указывая номера выводов модуля (CE, SS).
*/
RF24 radio(7, 10);

/*
   Объявляем массив для хранения и передачи данных
   (до 32 байт включительно).
*/
int dataToBeTransmitted[5] = {'0', '1', '2', '3', '4'};

void setup() {
  /*
    Инициируем работу nRF24L01+
  */
  radio.begin();
  /*
    Указываем канал передачи данных (от 0 до 127)
    (на одном канале может быть только 1 приёмник и до 6 передатчиков).
    Выбираем канал в котором нет шумов!
  */
  radio.setChannel(0x30);
  /*
    Указываем скорость передачи данных
    RF24_250KBPS = 250Кбит/сек
    RF24_1MBPS = 1Мбит/сек
    RF24_2MBPS = 2Мбит/сек
    Скорость должна быть одинакова на приёмнике и передатчике.
    При самой низкой скорости имеем самую высокую чувствительность и дальность.
  */
  radio.setDataRate(RF24_1MBPS);
  /*
    Указываем мощность передатчика
    RF24_PA_MIN=-18dBm
    RF24_PA_LOW=-12dBm
    RF24_PA_HIGH=-6dBm
    RF24_PA_MAX=0dBm
  */
  radio.setPALevel(RF24_PA_MAX);

  /*
     Открываем трубу с адресом 0x0123456789LL для передачи данных
     (передатчик может одновременно вещать только по одной трубе).
  */
  radio.openWritingPipe(0x0123456789LL);
}

void loop() {
  /*
     Отправляем данные из массива dataToBeTransmitted
     указывая весь размер массива в байтах.
  */
  radio.write(&dataToBeTransmitted, sizeof(dataToBeTransmitted));
  /*
     Устанавливаем задержку на 1000 мс.
  */
  delay(1000);
}

Пример 3: Получение данных от одного передатчика

В коде setup() приёмника задаются такие же настройки как и передатчику (канал, скорость, мощность передатчика).

  • 0x30 канал;
  • скорость 1 Мбит/сек (RF24_1MBPS);
  • максимальная мощности (RF24_PA_MAX);
  • адрес трубы 0x0123456789LL, для приёма данных.

Чтобы включить прослушивание труб, нужно вызвать startListening(), метод переводит модуль в режим работы приёмника. Если далее вызвать stopListening(), то модуль перейдёт в режим работы передатчика.

/*
  Подключаем файл настроек из библиотеки RF24
*/
#include <nRF24L01.h>
/*
  Подключаем библиотеку  для работы с nRF24L01+
*/
#include <RF24.h>

/*
  Создаём объект radio для работы с библиотекой RF24,
  указывая номера выводов модуля (CE, SS).
*/
RF24 radio(7, 10);

/*
  Объявляем массив для хранения и передачи данных
  (до 32 байт включительно).
*/
int receivedData[5];

/*
  Объявляем переменную в которую будет сохраняться
  номер трубы по которой приняты данные.
*/
uint8_t pipe;

uint8_t i;

void setup() {
  /*
    Инициируем передачу данных по шине UART в монитор
    последовательного порта на скорости 115200 бит/сек.
  */
  Serial.begin(115200);
  /*
    Инициируем работу nRF24L01+
  */
  radio.begin();
  /*
    Указываем канал передачи данных (от 0 до 127)
    (на одном канале может быть только 1 приёмник и до 6 передатчиков).
    Выбираем канал в котором нет шумов!
  */
  radio.setChannel(0x30);
  /*
    Указываем скорость передачи данных
    RF24_250KBPS = 250Кбит/сек
    RF24_1MBPS = 1Мбит/сек
    RF24_2MBPS = 2Мбит/сек
    Скорость должна быть одинакова на приёмнике и передатчике.
    При самой низкой скорости имеем самую высокую чувствительность и дальность.
  */
  radio.setDataRate(RF24_1MBPS);
  /*
    Указываем мощность передатчика
    RF24_PA_MIN=-18dBm
    RF24_PA_LOW=-12dBm
    RF24_PA_HIGH=-6dBm
    RF24_PA_MAX=0dBm
  */
  radio.setPALevel(RF24_PA_MAX);
  /*
    Открываем 1 трубу с адресом 1 передатчика 0x0123456789LL, для приема данных.
  */
  radio.openReadingPipe(1, 0x0123456789LL);
  /*
    Включаем приемник, начинаем прослушивать открытые трубы.
  */
  radio.startListening();
}

void loop() {
  /*
    Если в буфере имеются принятые данные, то получаем номер трубы
    по которой эти данные пришли в переменную pipe.
  */
  if (radio.available(&pipe)) {
    /*
      Читаем данные из буфера в массив receivedData указывая
      сколько всего байт может поместиться в массив.
    */
    radio.read(&receivedData, sizeof(receivedData));
    /*
      Если данные пришли от 1 передатчика (по 1 трубе),
      то можно выполнить соответствующее действие ...
    */
    Serial.print("Данные [ ");
    for (i = 0; i < 5; i++) {
      Serial.print((char) receivedData[i]);
      Serial.print(' ');
    }
    Serial.print("] пришли по трубе ");
    Serial.println(pipe);
  }
}

Результат

Подключение модуля nRF24L01+ к Arduino - Приём данных, Результат

Пример 4: Передача данных с проверкой их доставки

/*
  Подключаем файл настроек из библиотеки RF24
*/
#include <nRF24L01.h>
/*
  Подключаем библиотеку  для работы с nRF24L01+
*/
#include <RF24.h>

/*
  Создаём объект radio для работы с библиотекой RF24,
  указывая номера выводов модуля (CE, SS).
*/
RF24 radio(7, 10);

/*
   Объявляем массив для хранения и передачи данных
   (до 32 байт включительно).
*/
uint8_t dataToBeTransmitted[5] = {'0', '1', '2', '3', '4'};

void setup() {
  /*
    Инициируем передачу данных по шине UART в монитор
    последовательного порта на скорости 115200 бит/сек.
  */
  Serial.begin(115200);
  /*
    Инициируем работу nRF24L01+
  */
  radio.begin();
  /*
    Указываем канал передачи данных (от 0 до 127)
    (на одном канале может быть только 1 приёмник и до 6 передатчиков).
    Выбираем канал в котором нет шумов!
  */
  radio.setChannel(0x30);
  /*
    Указываем скорость передачи данных
    RF24_250KBPS = 250Кбит/сек
    RF24_1MBPS = 1Мбит/сек
    RF24_2MBPS = 2Мбит/сек
    Скорость должна быть одинакова на приёмнике и передатчике.
    При самой низкой скорости имеем самую высокую чувствительность и дальность.
  */
  radio.setDataRate(RF24_1MBPS);
  /*
    Указываем мощность передатчика
    RF24_PA_MIN=-18dBm
    RF24_PA_LOW=-12dBm
    RF24_PA_HIGH=-6dBm
    RF24_PA_MAX=0dBm
  */
  radio.setPALevel(RF24_PA_MAX);

  /*
     Открываем трубу с адресом 0x0123456789LL для передачи данных
     (передатчик может одновременно вещать только по одной трубе).
  */
  radio.openWritingPipe(0x0123456789LL);
}

void loop() {
  /*
     Отправляем данные из массива dataToBeTransmitted
     указывая весь размер массива в байтах.
  */
  if (radio.write(&dataToBeTransmitted, sizeof(dataToBeTransmitted))) {
    /*
       Данные передатчика были корректно приняты приёмником
    */
    Serial.println("Данные были корректно приняты приёмником");
  } else {
    /*
       Данные передатчика не приняты или дошли с ошибкой CRC
    */
    Serial.println("Данные не приняты или дошли с ошибкой CRC");
  }
  /*
     Устанавливаем задержку на 1000 мс.
  */
  delay(1000);
}

Результат

Подключение модуля nRF24L01+ к Arduino - Передача данных с проверкой, РезультатСкетч данного примера отличается от предыдущего только кодом loop() где функция write() вызывается в условии оператора if(). Дело в том, что функция write() не только отправляет данные, но и возвращает true (если данные были доставлены) или false (если данные не доставлены). По умолчанию передача данных реализована так, что передатчик не только отправляет данные, но и запрашивает у приёмника подтверждение их получения, а приёмник получив данные и проверив CRC, возвращает передатчику пакет подтверждения приема данных. Таким образом на стороне передатчика можно контролировать факт доставки данных приёмнику.

Если не нужно определить факт доставки данных приёмнику, можете заменить write() на writeFast().

/*
   Отправляем данные из массива dataToBeTransmitted 
   указывая сколько байт массива мы хотим отправить.
 */
radio.writeFast(&dataToBeTransmitted, sizeof(dataToBeTransmitted));

writeFast() принимает те же параметры что и write(), но возвращает не флаг доставки данных приёмнику, а флаг записи данных в буфер FIFO. Значит в большинстве случаев функция вернёт true даже до того как приёмник получит данные. Если же все три буфера FIFO заполнены, то функция writeFast() ждёт пока один из них не освободится или пока не истечёт время таймаута но и это ожидание на порядок меньше чем у функции write().

Запретить отправку пакетов подтверждения приёма можно и на стороне приёмников, вызвав у них функцию setAutoAck(false) или setAutoAck(номер_трубы, false). Но в таком случае и на стороне передатчика нужно вызвать функцию setAutoAck(false) иначе приёмник не будет понимать что ему прислал передатчик.

Пример 5: Получение данных от одного или нескольких передатчиков

Приёмнику можно задать до 6 труб функцией openReadingPipe(номер, адрес) с номерами труб от 0 до 5 и адресами труб совпадающими с адресами труб передатчиков.

/*...*/
radio.openReadingPipe(0, 0x0123456789LL);
radio.openReadingPipe(1, 0x0123456799LL);
radio.openReadingPipe(2, 0x012345679ALL);
radio.openReadingPipe(3, 0x01234567AALL);
radio.openReadingPipe(4, 0x01234567ABLL);
radio.openReadingPipe(5, 0x01234567BBLL);
/*...*/

Сколько труб Вы укажете, столько передатчиков будет слушать приёмник.

Методом available() осуществляется проверка получения данных. Метод возвращает true если в буфере есть принятые данные доступные для чтения. В качестве необязательного аргумента можно указать адрес переменной в которую будет помещён номер трубы по которой были приняты данные (в примере используется адрес переменной &pipe), зная номер трубы мы знаем от какого передатчика пришли данные.

if(radio.available(&pipe)) {
  /*...*/
}

Если приемник будет принимать данные только от одного передатчика, то переменную pipe можно не использовать, а метод available() можно вызвать без параметра, так как в этом случае не требуется узнавать от какого передатчика приняты данные.

/*
  Подключаем файл настроек из библиотеки RF24
*/
#include <nRF24L01.h>
/*
  Подключаем библиотеку  для работы с nRF24L01+
*/
#include <RF24.h>

/*
  Создаём объект radio для работы с библиотекой RF24,
  указывая номера выводов модуля (CE, SS).
*/
RF24 radio(7, 10);

/*
  Объявляем массив для хранения и передачи данных
  (до 32 байт включительно).
*/
uint8_t receivedData[5];

/*
  Объявляем переменную в которую будет сохраняться
  номер трубы по которой приняты данные.
*/
uint8_t pipe;

uint8_t i;

void setup() {
  /*
    Инициируем передачу данных по шине UART в монитор
    последовательного порта на скорости 115200 бит/сек.
  */
  Serial.begin(115200);
  /*
    Инициируем работу nRF24L01+
  */
  radio.begin();
  /*
    Указываем канал передачи данных (от 0 до 127)
    (на одном канале может быть только 1 приёмник и до 6 передатчиков).
    Выбираем канал в котором нет шумов!
  */
  radio.setChannel(0x30);
  /*
    Указываем скорость передачи данных
    RF24_250KBPS = 250Кбит/сек
    RF24_1MBPS = 1Мбит/сек
    RF24_2MBPS = 2Мбит/сек
    Скорость должна быть одинакова на приёмнике и передатчике.
    При самой низкой скорости имеем самую высокую чувствительность и дальность.
  */
  radio.setDataRate(RF24_1MBPS);
  /*
    Указываем мощность передатчика
    RF24_PA_MIN=-18dBm
    RF24_PA_LOW=-12dBm
    RF24_PA_HIGH=-6dBm
    RF24_PA_MAX=0dBm
  */
  radio.setPALevel(RF24_PA_MAX);
  /*
    Открываем 1 трубу с адресом 1 передатчика 0x0123456789LL, для приема данных.
  */
  radio.openReadingPipe(1, 0x0123456789LL);
  /*
    Открываем 2 трубу с адресом 2 передатчика 0x0123456799LL, для приема данных.
  */
  radio.openReadingPipe(2, 0x0123456799LL);
  /*
    Включаем приемник, начинаем прослушивать открытые трубы.
  */
  radio.startListening();
}

void loop() {
  /*
    Если в буфере имеются принятые данные, то получаем номер трубы
    по которой эти данные пришли в переменную pipe.
  */
  if (radio.available(&pipe)) {
    /*
      Читаем данные из буфера в массив receivedData указывая
      сколько всего байт может поместиться в массив.
    */
    radio.read(&receivedData, sizeof(receivedData));
    /*
      Если данные пришли от 1 передатчика (по 1 трубе),
      то можно выполнить соответствующее действие ...
    */
    Serial.print("Данные [ ");
    for (i = 0; i < 5; i++) {
      Serial.print((char) receivedData[i]);
      Serial.print(' ');
    }
    Serial.print("] пришли по трубе ");
    Serial.println(pipe);
  }
}

Результат

Подключение модуля nRF24L01+ к Arduino - Получение данных от одного или нескольких передатчиков, Результат

Материалы

Радио модуль NRF24L01+ / PA+LNA 2.4G (Trema-модуль V2.0)
Урок 26.4 Соединяем две arduino по радиоканалу через nRF24L01+
Optimized High Speed NRF24L01+ Driver Class Documenation

Похожие записи

Комментарии 64

  • Спасибо за описание методов. Только здесь нашел.

  • В примере 4 тип данных для отправки uint8_t, а в примере 3 тип данных для приема int. Несколько неожиданно, когда принимается не совсем то что отправляется. ))

    • Да, нужно отправить/получать используя один тип данных, лучше всего использовать uint8_t, но можно использовать любой тип данных, к примеру вам нужно отправить int или double и не хотите вручную преобразовать из 4-х uint8_t в int.

  • вместо RF24 radio(7, 10); должно быть RF24 radio(9, 10);

  • Вовсе не обязательно. Это зависит от того, к каким выводам Ардуино подведены сигналы ce и csn радиомодуля.

  • Спасибо большое! Реально только здесь нашел информацию. Хотелось бы еще увидеть пример с переключением с приема на передачу и обратно.

  • Всегда интересно было, какая каша в голове у тех, кто схему проводками рисует, цветными. Даже на принципиальной схеме разбирать всё это невозможно. При этом распиновку самого модуля не показали..

  • Appreciation to my father who informed me regarding this website, this blog
    is in fact amazing.
    https://boost.en-nitricboost.us

  • Incredible Blog Entry
    Gosh , what an perceptive and contemplative work !
    I stumbled upon myself nodding along as I perused through your dissection
    of this vital topic .
    Your contentions were thoroughly investigated and presented in a lucid, persuasive manner.
    I specifically valued how you were empowered to extract
    the essential intricacies and intricacies at play , excluding oversimplifying
    or overlooking the hurdles.
    This write-up has offered me a great deal to reflect on .
    You’ve definitively enlarged my comprehension and transformed my mindset
    in particular profound ways .
    Thank you for devoting the resources to share your mastery on this matter .
    Entries like this are extremely a priceless contribution to the
    discussion . I await with excitement witnessing what other thought-provoking data you have
    in reserve .

    Here is my webpage :: login to ebet

  • Have you ever thought about writing an ebook or guest authoring
    on other websites? I have a blog centered on the same information you discuss and would really like to have you share some stories/information. I know my readers would enjoy
    your work. If you are even remotely interested, feel free to send me an e-mail.

    My site — the growth matrix xxx

  • It’s enormous that you are getting ideas from this piece of writing as well as from
    our discussion made here.

    My blog … does tonic greens cure herpes

  • Your mode of describing the whole thing in this paragraph is genuinely nice,
    all can without difficulty be aware of it, Thanks a lot.

    Also visit my homepage … the growth matrix cock

  • Usually I don’t learn article on blogs, but I would like to say that this write-up very compelled me to try
    and do so! Your writing taste has been surprised me.
    Thank you, quite great article.

    My web site … lung clear pro review

  • hello there and thank you for your information – I’ve definitely picked up anything new
    from right here. I did however expertise some technical points using this
    site, as I experienced to reload the website a lot of times previous to I could
    get it to load properly. I had been wondering if your web
    hosting is OK? Not that I’m complaining, but sluggish loading
    instances times will often affect your placement in google and could damage your high
    quality score if advertising and marketing with Adwords.
    Well I am adding this RSS to my email and could look out for much more of your respective interesting content.
    Ensure that you update this again very soon.

    my web blog :: dentavim does it work

  • What an thought-provoking and contemplative write-up!
    I ought to assert , your examination of this vital issue was truly
    outstanding .
    The scope and intricacy you introduced to the dialogue was exceptional, throwing
    new illumination on the nuances at hand .
    I came across myself agreeing as I skimmed through your skillfully assembled points .
    The manner you were empowered to refine the essential points
    minus oversimplifying was especially impressive .

    It’s obvious you’ve devoted a substantial amount of
    energy into researching this subject .
    This entry has presented me a great deal to mull over and has challenged
    me to reconsider particular elements of my
    own perspective .
    I value you investing the resources to impart
    your proficiency — posts like this are exceptionally valuable in progressing the greater
    conversation.
    I look forward to perusing more of your content in the
    future to come . Please keep up the excellent endeavors !

    Also visit my page kirsty hanks microgaming

  • Way cool! Some very valid points! I appreciate you writing this post and also the
    rest of the site is also really good.

    My web blog :: go boostaro ingredients list

  • Greetings, associate enthusiast. I must laud you on your perceptive analysis of the
    subject matter presented in this blog post. Your incisive
    observations and articulate commentary have resonated with me, and I
    conclude myself in harmony with the views you have
    conveyed .

    Given your apparent engagement in the realm of electronic finance, I would be delinquent if I did not extend an invitation for
    you to investigate the enthralling world of
    Crypto Casino. This pioneering platform offers a exclusive and
    immersive experience , integrating the anticipation of
    long-standing casino gaming with the advanced systems of cryptocurrency .
    I believe you would stumble upon it a most spellbinding venture .
    I encourage you to become a part of us and
    find the limitless possibilities that are ready you.

    Here is my page; no deposit crypto casino

  • Greetings, peer enthusiast. I must applaud you on your keen analysis of the subject matter presented in this blog post.
    Your keen observations and fluent commentary have struck a chord with me, and I conclude myself in consensus with the views
    you have articulated .

    Given your apparent engagement in the realm of digital finance,
    I would be remiss if I did not present an invitation for you
    to discover the electrifying world of Crypto Casino. This revolutionary platform offers a uncommon and immersive
    venture , uniting the adrenaline of
    established casino gaming with the advanced infrastructure
    of decentralized networks . I surmise you would encounter
    it a most captivating undertaking . I beseech you to become a part of us and
    find the endless avenues that are poised you.

    my website :: Blockchain-based casino

  • Salutations , fellow audience . I found your deep observations on the blog
    article incredibly keen .

    Your perspective on the theme is fairly exemplary.

    As you give the impression to carry a avid fascination in the theme , I intend
    to offer an request for you to delve into
    the domain of ‘918KISS’.

    This unique hub grants a wide-ranging array of engaging resources that in turn address people having varied hobbies .

    I think you would uncover the fellowship at ‘918KISS’ as
    being equally beneficial and cerebrally enthralling .

    I recommend you to ponder linking up with us and
    delivering your precious observations to the unceasing
    exchanges . Excited for potentially accepting
    you into our network.

    Also visit my page … online casino problem gambling

  • Greetings, comrade enthusiast. I must compliment you on your keen analysis of the subject matter presented in this blog post.
    Your sharp observations and fluent commentary have struck a
    chord with me, and I conclude myself in concurrence
    with the opinions you have proclaimed.

    Given your manifest curiosity in the realm of
    technological finance, I would be delinquent if I did not offer an overture for you to venture into
    the exciting world of Crypto Casino. This novel platform
    offers a distinctive and captivating experience , synthesizing the adrenaline of time-honored casino gaming with the cutting-edge solutions of
    digital assets . I feel you would come across it a most
    spellbinding expedition . I implore you to join us and encounter the
    perpetual horizons that are available you.

    Here is my site: online casino player demographics

  • WOW just what I was looking for. Came here by searching for tonic greens and herpes

    Here is my webpage: tonic greens cure

  • Go88 la cong game doi thuong truc tuyen so 1 Viet Nam hien nay voi hon 2 trieu nguoi choi moi ngay tai trang chu Go88 COM. Go88 cung cap kho game phong phu.
    Website: https://go88.run/

  • It’s nearly impossible to find well-informed
    people for this topic, but you seem like you know what you’re
    talking about! Thanks

    my blog post potent stream reviews and complaints

  • Having read this I thought it was extremely enlightening.

    I appreciate you finding the time and energy to put
    this short article together. I once again find myself spending way too much time both reading
    and commenting. But so what, it was still worthwhile!

  • Unquestionably believe that which you stated.
    Your favorite reason seemed to be on the internet the easiest thing to be aware
    of. I say to you, I definitely get annoyed while people consider
    worries that they just do not know about. You managed to hit the nail
    upon the top and also defined out the whole thing without having side effect , people can take a signal.
    Will probably be back to get more. Thanks

  • great issues altogether, you just won a logo new reader.
    What would you recommend in regards to your post that you made a few days in the past?
    Any sure?

    Feel free to surf to my site item648153073

  • Heya! I’m at work surfing around your blog from my new
    apple iphone! Just wanted to say I love reading your blog and look forward
    to all your posts! Carry on the fantastic work!

    Here is my site :: nervovive reviews and complaints

  • It’s not my first time to pay a quick visit this web
    page, i am visiting this web page dailly and get pleasant data
    from here everyday.

    Have a look at my website; fitspresso website

  • Spot on with this write-up, I absolutely believe this website needs a
    great deal more attention. I’ll probably be returning to read through
    more, thanks for the advice!

    Take a look at my web page — the growth matrix gm

  • The world of challenging gaming has undergone a
    remarkable shift in recent years, with the rise of esports as a
    global sensation . Amidst this rapidly adapting
    landscape, one name has emerged as a groundbreaker – Spade Gaming.

    Spade Gaming is a power to be reckoned with, a gaming organization
    that has carved out a unique niche for itself by blending cutting-edge progress , strategic outlook ,
    and a resolute commitment to prowess.

    Established with the goal of reinventing the boundaries of fierce gaming, Spade Gaming has quickly become a standard of
    originality , driving the realm forward with its trailblazing
    approach and unwavering dedication.

    At the essence of Spade Gaming’s accomplishment lies
    its resolute dedication on player development and crew building.
    The enterprise has cultivated an environment
    that enables and reinforces its performers , providing them with the tools , mentoring , and
    facilitation they need to secure new summits .

    But Spade Gaming’s impact extends far outside the restrictions of the game inherently .

    The corporation has also solidified itself as a vanguard in the realm of
    material creation, maximizing its vast repository of skilled
    people to create mesmerizing and riveting material
    that resonates followers throughout the globe
    .

    Additionally , Spade Gaming’s dedication to social accountability and public participation differentiates it unique
    from its counterparts . The company has tapped into its megaphone to rally behind consequential causes
    , using its significance and power to create a transformative
    influence in the ecosystem of esports and going further.

    As the professional gaming realm prevails to metamorphize, Spade Gaming emerges
    as a gleaming example of that which can be obtained when perspective , inventiveness , and a determined striving of superiority intersect .

    In the era to come , as the field of fierce gaming marches on to
    rivet aficionados and transform the process we participate
    with diversion , Spade Gaming will assuredly hold at the fore, spearheading the initiative and building a
    pioneering period in the continuously progressing
    landscape of esports.

    Here is my blog post Virtual table games

  • May I simply just say what a comfort to discover someone who genuinely knows what
    they’re discussing on the web. You certainly understand how to bring a
    problem to light and make it important. More people
    have to read this and understand this side of the story.
    It’s surprising you’re not more popular since you definitely have
    the gift.

  • Your mode of describing all in this piece of writing is in fact pleasant, all be able to easily know it,
    Thanks a lot.

    My webpage … prodentim coupon code

  • Its like you read my mind! You seem to know so much about this, like you wrote the book in it or something.
    I think that you could do with some pics to drive the message home a bit,
    but other than that, this is magnificent blog. An excellent read.
    I’ll definitely be back.

    my page … the growth-share matrix

  • Как поднять настроение подруге с помощью прикольного анекдота

  • Как поднять настроение другу с помощью смешного анекдота

  • Как поднять настроение другу с помощью прикольного анекдота

  • Rudolph\’s Revenge Yes, you can generally withdraw your winnings from a no deposit bonus, as long as you follow the casino’s Terms and Conditions and complete the wagering requirements. Casinos use these to make sure players do not just withdraw their funds without playing with them. 18+ New UK customers. Bet £10 on accas with 4+ legs, min odds 3 1 (4.0). Get 4x £5 Free Bets and 50 Free Spins, valid for 7 days on selected bets and games only. T&Cs apply. GambleAware.org A sign up bonus at an online casino is an important feature to consider for various reasons. As a customer, a sign up bonus gives you a chance to test out a new casino virtually risk free. It’s even better if you can get your hands on no deposit bonuses when signing up at a new casino. This can be rarer but is great value.
    https://befturismo.com.br/2023/page/3/
    However, with over 80 interactive casino games for smartphones and tablet devices. So let’s apply two particular caveats to this most surprising of statistics, legzo casino login app sign up especially when you have such a cheeky sidekick to keep you company while you spin the reels. Get back all your deposits. London Casino Hours Bohemia Casino Login App Sign Up Rembrandt Casino 100 Free Spins Bonus 2024 Space Wins Casino greets players with 5 free spins NetEnt no deposit, offering them a taste of the thrilling world of NetEnt slots without any initial deposit. Despite the limited number of spins, Space Wins Casino ensures an enjoyable gaming experience with its diverse selection of NetEnt titles. With a manageable wagering requirement, Space Wins Casino presents a promising opportunity for players to embark on their gaming journey and explore the wonders of NetEnt slots.

  • Simply wish to say your article is as astonishing. The clarity
    in your post is just spectacular and i could assume you are an expert on this subject.
    Well with your permission allow me to grab your RSS feed to keep
    updated with forthcoming post. Thanks a million and please continue the enjoyable work.

    Here is my web-site; growth matrix male enhancement

  • Hi, I do think this is a great web site. I stumbledupon it 😉 I’m going to come back yet again since i have book-marked it. Money and freedom is the best way to change, may you be rich and continue to guide other people.

  • Предпочитаете получить деньги прямо на карту? Ознакомьтесь с тем, как легко оформить займы онлайн на карту и получить деньги на счет в любое время.

  • Fantastic Comment to Online Journal Comment

    Superb write-up! I’m really cherishing the content on this page.
    Own you previously contemplated on acquiring encompassed by web-based betting gaming?
    Evolution Gaming Provider is a fantastic platform with a vast range
    of first-rate dynamic casino employee offerings. The whole venture is unbelievably
    riveting and real, it comes across as like you’re precisely at the casino encompassed by the
    proper gambling venue.

    On the condition you’re curious regarding attempting the offering as well,
    I’d be pleased to thrilled to offer the endorsement connection.
    Evolution provides a fantastic introductory offer for
    interested latest players. It certainly undisputedly useful checking out
    on the condition you’re searching for a updated digital wagering journey.

    Appreciation once more in favor of the fantastic web
    publication material. Retain with the the excellent work!

    Look at my web blog: poker

  • Have you ever considered publishing an e-book or guest authoring on other blogs?
    I have a blog based upon on the same information you discuss and would love to
    have you share some stories/information. I know my
    viewers would appreciate your work. If you are even remotely interested, feel free to shoot me an email.

    Here is my webpage … https://www.cucumber7.com/

  • Brought to a close Reading a Blog Post: A Formal Reply
    to the Comment Section and an Invitation to Join «KING855»

    ‘After comprehensively examining the blog post, I would like to deliver the following response to the thread .

    Your observations on the topic were quite fascinating.
    I was in alignment with several of the assertions you brought up .

    It is pleasing to witness such an stimulating exchange taking place .

    If you are interested in additional examining this theme,
    I would cordially encourage you to become a member of the «KING855» group .

    There , you will have the chance to engage with like-minded
    individuals and explore further into these captivating
    topics .

    I am convinced your contribution would be a significant addition
    to the dialogue.

    I’m grateful for your contribution , and I look forward to the possibility of extending this
    stimulating dialogue .

    Here is my website: casino games

  • Hello to every one, as I am actually keen of reading this website’s post to
    be updated daily. It contains fastidious material.

    Also visit my web blog; prodentim reviews

  • Have you ever thought about creating an e-book or guest authoring on other sites? I have a blog centered on the same information you discuss and would love to have you share some stories/information. I know my audience would appreciate your work. If you are even remotely interested, feel free to send me an e mail.

  • Начни свой путь к выигрышам с бонусом за регистрацию в онлайн-казино!
    криптобосс официальный сайт

  • Interested in security documents? Check out recommendations on how to create digital signature that will ensure accessibility of your documents.

Добавить комментарий для kentcasino вход кентcасино Отменить ответ

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