nRF24l01 тестирование с различными платами

12.06.2018
By

nRF24l01 – недорогой способ связать Ваши устройства радиосетью в диапазоне 2,4Ghz. Библиотека RF24 представляет очень простые и удобные средства программирования. Это устройство протестировали с различными платами – WiFi nodeM (RobotDyn), Nano, Pro Mini 3,3V, STM32F103C8T6 (только с последней платой не удалось быстро запустить «из коробки» с использованием среды Arduino IDE).

Модуль имеет простое подключение к любой плате с использованием интерфейса ISP и двух дополнительных цифровых пинов, к которым подключаются контакты CE и CSN. Для плат Nano и Pro Mini это контакты D7 и D8 для WiFi NodeM использованы контакты D2 и D1, которые в Arduino IDE имеют наименование 4 и 5 соответственно.

подключение SCK, MISO, MOSI соответственно D5-D7.

Скетч для передатчика 1 (WiFi nodeM плата):

#include <SPI.h>                                               // Подключаем библиотеку для работы с шиной SPI
#include <nRF24L01.h>                                          // Подключаем файл настроек из библиотеки RF24
#include <RF24.h>                                              // Подключаем библиотеку для работы с nRF24L01+
RF24           radio(4, 5);                                   // Создаём объект radio для работы с библиотекой RF24, указывая номера выводов nRF24L01+ (CE, CSN)
int            data[1];                                        // Создаём массив для передачи данных (так как мы будем передавать только одно двухбайтное число, то достаточно одного элемента массива типа int)
                                                               // Для данного примера, можно использовать не массив data из одного элемента, а переменную data типа int
void setup(){
    radio.begin();                                             // Инициируем работу nRF24L01+
    radio.setChannel(5);                                       // Указываем канал передачи данных (от 0 до 127), 5 - значит передача данных осуществляется на частоте 2,405 ГГц (на одном канале может быть только 1 приёмник и до 6 передатчиков)
    radio.setDataRate     (RF24_1MBPS);                        // Указываем скорость передачи данных (RF24_250KBPS, RF24_1MBPS, RF24_2MBPS), RF24_1MBPS - 1Мбит/сек
    radio.setPALevel      (RF24_PA_HIGH);                      // Указываем мощность передатчика (RF24_PA_MIN=-18dBm, RF24_PA_LOW=-12dBm, RF24_PA_HIGH=-6dBm, RF24_PA_MAX=0dBm)
    radio.openWritingPipe (0xAABBCCDD11LL);                    // Открываем трубу с идентификатором 0xAABBCCDD11 для передачи данных (на одном канале может быть открыто до 6 разных труб, которые должны отличаться только последним байтом идентификатора)
}
void loop(){
    data[0] = 234; //analogRead(A0);                           // считываем значение с аналогового входа A0
    radio.write(&data, sizeof(data));                          // отправляем данные из массива data указывая сколько байт массива мы хотим отправить. Отправить данные можно с проверкой их доставки: if( radio.write(&data, sizeof(data)) ){данные приняты приёмником;}else{данные не приняты приёмником;}
    delay(50);                                                 // устанавливаем задержку на 50 мс, за это время приемник успеет принять и обработать данные этого и другого передатчика.
}
Скетч для передатчика 2 (Nano плата):
// 2018-06-01 for nano board
#include <SPI.h>                                               // Подключаем библиотеку для работы с шиной SPI
#include <nRF24L01.h>                                          // Подключаем файл настроек из библиотеки RF24
#include <RF24.h>                                              // Подключаем библиотеку для работы с nRF24L01+
RF24           radio(7, 8);                                   // Создаём объект radio для работы с библиотекой RF24, указывая номера выводов nRF24L01+ (CE, CSN)
int            data[1];                                        // Создаём массив для передачи данных (так как мы будем передавать только одно двухбайтное число, то достаточно одного элемента массива типа int)
                                                               // Для данного примера, можно использовать не массив data из одного элемента, а переменную data типа int
void setup(){
    radio.begin();                                             // Инициируем работу nRF24L01+
    radio.setChannel(5);                                       // Указываем канал передачи данных (от 0 до 127), 5 - значит передача данных осуществляется на частоте 2,405 ГГц (на одном канале может быть только 1 приёмник и до 6 передатчиков)
    radio.setDataRate     (RF24_1MBPS);                        // Указываем скорость передачи данных (RF24_250KBPS, RF24_1MBPS, RF24_2MBPS), RF24_1MBPS - 1Мбит/сек
    radio.setPALevel      (RF24_PA_HIGH);                      // Указываем мощность передатчика (RF24_PA_MIN=-18dBm, RF24_PA_LOW=-12dBm, RF24_PA_HIGH=-6dBm, RF24_PA_MAX=0dBm)
    radio.openWritingPipe (0xAABBCCDD22LL);                    // Открываем трубу с идентификатором 0xAABBCCDD22 для передачи данных (на одном канале может быть открыто до 6 разных труб, которые должны отличаться только последним байтом идентификатора)
}
void loop(){
    data[0] = 432; //analogRead(A0);                                  // считываем значение с аналогового входа A0
    radio.write(&data, sizeof(data));                          // отправляем данные из массива data указывая сколько байт массива мы хотим отправить. Отправить данные можно с проверкой их доставки: if( radio.write(&data, sizeof(data)) ){данные приняты приёмником;}else{данные не приняты приёмником;}
    delay(50);                                                 // устанавливаем задержку на 50 мс, за это время приемник успеет принять и обработать данные этого и другого передатчика.
}
Скетч для приемника (Pro Mini):
#include <SPI.h>                                               // Подключаем библиотеку для работы с шиной SPI
#include <nRF24L01.h>                                          // Подключаем файл настроек из библиотеки RF24
#include <RF24.h>                                              // Подключаем библиотеку для работы с nRF24L01+
RF24           radio(7, 8);                                   // Создаём объект radio для работы с библиотекой RF24, указывая номера выводов nRF24L01+ (CE, CSN)
int            data[1];                                       // Создаём массив для приема данных (так как мы будем передавать только одно двухбайтное число, то достаточно одного элемента массива типа int)
uint8_t        pipe;                                           // Для данного примера, можно использовать не массив data из одного элемента, а переменную data типа int

void setup(){
    Serial.begin(115200);
    radio.begin();                                             // Инициируем работу nRF24L01+
    radio.setChannel(5);                                       // Указываем канал приёма данных (от 0 до 127), 5 - значит приём данных осуществляется на частоте 2,405 ГГц (на одном канале может быть только 1 приёмник и до 6 передатчиков)
    radio.setDataRate     (RF24_1MBPS);                        // Указываем скорость передачи данных (RF24_250KBPS, RF24_1MBPS, RF24_2MBPS), RF24_1MBPS - 1Мбит/сек
    radio.setPALevel      (RF24_PA_HIGH);                      // Указываем мощность передатчика (RF24_PA_MIN=-18dBm, RF24_PA_LOW=-12dBm, RF24_PA_HIGH=-6dBm, RF24_PA_MAX=0dBm)
    radio.openReadingPipe (1, 0xAABBCCDD11LL);                 // Открываем 1 трубу с идентификатором 1 передатчика 0xAABBCCDD11, для приема данных
    radio.openReadingPipe (2, 0xAABBCCDD22LL);                 // Открываем 2 трубу с идентификатором 2 передатчика 0xAABBCCDD22, для приема данных
    radio.startListening  ();                                  // Включаем приемник, начинаем прослушивать открытые трубы
//  radio.stopListening   ();                                  // Выключаем приёмник, если потребуется передать данные
}
void loop(){
    if(radio.available(&pipe)){                                // Если в буфере имеются принятые данные, то получаем номер трубы, по которой они пришли, по ссылке на переменную pipe
        radio.read(&data, sizeof(data));                       // Читаем данные в массив data и указываем сколько байт читать
        if(pipe==1){ // Если данные пришли от 1 передатчика, то выводим в сериал
          Serial.print("pipe 1: ");
          Serial.println(data[0]);
          }
        if(pipe==2){ // Если данные пришли от 2 передатчика, то выводим в сериал
          Serial.print("pipe 2: ");
          Serial.println(data[0]);
          }
    }
}

Данке шен авторам за их материалы:
https://lesson.iarduino.ru/page/urok-26-5-soedinyaem-neskolko-arduino-po-radiokanalu-cherez-nrf24l01/
https://arduino-kit.ru/userfiles/image/2,4G%20Wireless%20nRF24L01.pdf

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