Радиомодуль nRF24L01+ и arduino. Подключение и пример передачи данных

Радиомодуль nRF24L01+ и arduino

Ни в одном проекте на arduino я еще не сталкивался с беспроводной передачей данных, хотя это очень большая и интересная тема. Передавать данные на расстоянии можно многими способами, но в этой статье речь пойдет о радиомодуле nRF24L01+. Поскольку такие передатчики относительно простые в использовании, дешевые и имеют большой радиус действия.

Описание радиомодуля nRF24L01+

Радиомодуль nRF24L01+, как я уже писал, стоит достаточно дешево – всего 50 руб, то есть за 100 руб можно купить два передатчика, между которыми и будет осуществляться беспроводная передача данных. Модуль может работать как передатчик и как приемник, отличия будут только в прошивке. Дальность действия составляет 100 метров на открытой местности и 30 метров в помещении.
Из минусов стоит отметить, что nRF24L01+ работает на частоте 2,4 ГГц, которую используют Wi-Fi и Bluetooth, они могут заглушать сигнал передатчика. Еще одним небольшим минусом является то, что nRF24L01+ питается от напряжения 3.3в, поэтому подключать его нужно аккуратно – 5в могут испортить модуль. Большинство плат arduino имеет пины с напряжением 3.3в, поэтому иногда проблема решается просто. Но бывают и другие случаи, например, arduino pro mini не всегда оснащена пином с нужным питанием, в таком случае придется использовать преобразователь напряжения.
Также к сложностям можно отнести то, что при запуске, nRF24L01+ требуется довольно большой ток и многие китайские копии arduino не могут его выдавать. Чтобы решить такую проблему достаточно припаять к радиомодулю(к пинам питания) конденсатор емкостью от 10 мфд. Поскольку я пользуюсь arduino, которые бережно собирают в Китае, то столкнувшись с проблемой, немного модернизировал nRF24L01+, получилось вот так:

Конденсаторы для стабилизации радиомодуля nrf24l01+

Подключение nRF24L01+ к arduino

Радиомодуль nRF24L01+ общается с микроконтроллером через интерфейс SPI, поэтому подключение должно быть к соответствующим пинам arduino. Главное помнить, что пины SPI у arduino Uno/Nano/Pro mini и arduino Mega отличаются:
Пины для Uno/Nano/Pro mini:
MOSI — 11
MISO — 12
SCK – 13
Пины для Mega2560:
MOSI — 51
MISO — 50
SCK — 52
Ниже на картинке распиновка самого радиомодуля nRF24L01+

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

И схема подключения nRF24L01+ к arduino.

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

Скетч arduino для отправки данных через nRF24L01+

Для работы с радиомодулем существует несколько библиотек, самая удобная, на мой взгляд, это RF24. Скачать ее можно тут: скачать.
Ниже приведен код с подробными комментариями:

// передатчик

// Библиотека для работы с SPI
#include <SPI.h> 
// Файл с настройками для библиотеки RF24
#include <nRF24L01.h> 
// Библиотека RF24
#include <RF24.h> 

// 9 и 10 - это номера пинов CE и CSN модуля nRF24L01+
RF24 radio(9, 10); 

void setup(){
	// инициализация nRF24L01+
	radio.begin(); 
	// задаем канал для передачи данных (от 0 до 127)
	radio.setChannel(0); 
	// Скорость передачи данных 1Мбит/сек. 
	// Возможны: RF24_250KBPS, RF24_1MBPS, RF24_2MBPS
	radio.setDataRate (RF24_1MBPS); 
	// Мощность передатчика -6dBm. 
	// Возможные можности: 
	// RF24_PA_MIN = -18dBm, RF24_PA_LOW = -12dBm, 
	// RF24_PA_HIGH = -6dBm, RF24_PA_MAX = 0dBm
	radio.setPALevel (RF24_PA_HIGH); 
	// Открываем трубу с идентификатором 0x1234567890 для передачи данных 
	// на одном канале можно открыть 6 разных труб 
	// они должны отличаться только последним байтом
	radio.openWritingPipe (0x1234567890LL); 
}

void loop(){  
	// массив для тестовых данных
	int data[2] = {0, 0}; 
	// читаем значение с аналогового пина для получения тестового числа
	data[0] = analogRead(0); 
	// второе тестовое значение будет фиксированным
	data[1] = 80; 
	// отправляем данные
	radio.write(&data, sizeof(data)); 
}
 

Скетч arduino для приема данных через nRF24L01+

Ниже приведен код с подробными комментариями:

// приемник

#include <SPI.h>
#include <nRF24L01.h>
#include <RF24.h>
RF24 radio(9, 10);

void setup(){
	// инициализация nRF24L01+
	radio.begin(); 
	// задаем канал для приёма данных. Идентично передатчику
	radio.setChannel(0); 
	// Скорость передачи данных. Идентично передатчику
	radio.setDataRate (RF24_1MBPS); 
	// Мощность передатчика. Идентично передатчику
	radio.setPALevel (RF24_PA_HIGH); 
	// Открываем 1 трубу с идентификатором 0x1234567890
	radio.openReadingPipe (1, 0x1234567890LL); 
	// Включаем приемник и слушаем открытую трубу
	radio.startListening (); 

	// монитор порта
	Serial.begin(9600);
}

void loop(){  
	// массив, для получения данных
	int data[2]={}; 

	// если что-то удалось получить
	if (radio.available()){ 
		// читаем данные    
		radio.read(&data, sizeof(data)); 
		// вывод первого элемента массива
		Serial.print("data[0]: "); 
		Serial.print(data[0]); 
		
		// вывод второго элемента массива
		Serial.print(" data[1]: ");
		Serial.println(data[1]); 
	}   
}
 

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

Послесловие

Область применения беспроводной передачи данных очень обширная – различные игрушки с пультами управления, системы оповещения и тд. Поэтому тема с радиомодулем nRF24L01+ в будущем будет продолжена, есть некоторые идеи, до которых пока еще не дошли руки.
Ели у вас тоже есть какие-то мысли или идеи по использованию радиомодуля, то пишите в комментарии, буду рад обсудить их, а возможно и воплотить в жизнь.

Рассказать друзьям:


Оценить:
(12 оценок, среднее: 4,42 из 5)

Радиомодуль nRF24L01+ и arduino. Подключение и пример передачи данных: 5 комментариев

  1. Спасибо! повторил — все работает, добавил команд, дополнительно навешал светодиодов и с задержками гасил и включал в общем цикле. Безмерно благодарен за полезную статью!!!!

  2. Эх, елки-палки, а мне надо его к Attyny85 прикрутить так, чтобы оставался свободный пин, и что теперь делать — хрен знает… Чувствую, выход есть, но будет дороже )

  3. Это работает!!! а другие примеры из простора интернета не подошли…
    Спасибо!!!

Добавить комментарий для madmentat Отменить ответ

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

*

code