Ни в одном проекте на 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+ к 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+ к arduino.
Скетч 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+ в будущем будет продолжена, есть некоторые идеи, до которых пока еще не дошли руки.
Ели у вас тоже есть какие-то мысли или идеи по использованию радиомодуля, то пишите в комментарии, буду рад обсудить их, а возможно и воплотить в жизнь.

(14 оценок, среднее: 4,50 из 5)
спасибо конкретно
Спасибо! повторил — все работает, добавил команд, дополнительно навешал светодиодов и с задержками гасил и включал в общем цикле. Безмерно благодарен за полезную статью!!!!
Эх, елки-палки, а мне надо его к Attyny85 прикрутить так, чтобы оставался свободный пин, и что теперь делать — хрен знает… Чувствую, выход есть, но будет дороже )
чётко, всё работает,Огромное спасибо
Это работает!!! а другие примеры из простора интернета не подошли…
Спасибо!!!