NRF24L01 2.4 ГГц радио/беспроводные передатчики и Arduino
Давайте начнем с тех возможностей, которые откроются перед вами, если вы обеспечите беспроводной обмен данными между двумя платами Arduino:
- Удаленное снятие показаний с датчиков температуры, давления, систем сигнализации на основе пироэлектрических датчиков движения и т.п.
- Беспроводное управление и мониторинг состояния роботов на расстоянии от 50 2000 футов.
- Беспроводное управление и мониторинг помещений в соседних домах.
- И т.д. и т.п. В общем, практически все, что требует беспроводных систем управления и мониторинга...
Существует целая серия радио модулей 2.4 ГГц, которые созданы на базе чипа Nordic Semiconductor nRF24L01+ (более детальная информация на английском языке) Nordic nRF24L01+ включает в себя 2.4 ГГц RF трансивер, логику, которая поддерживает высокоскоростной SPI интерфейс для подключения и обмена данными. Маломощный, с небольшой дальностью действия (200 футов или около того) передатчик для Arduino со встроенной антенной можно приобрести меньше чем за 3 $!


Ссылки для заказа необходимого оборудования из Китая
Проблемы с питанием NRF24L01
У многих возникают проблемы при запуске модуля nRF24L01. В основном это связано с тем, что в модуле питания 3.3 В не предусмотрена необходимая сила тока. Решение проблемы следующее:
- Подключите конденсатор на 3.3 или 10 мкФ (микрофарад) напрямую к модулю - от 3.3 В (+) к GND (-). Некоторые рекомендуют использовать 10 мкФ или больше.
- Отдельный источник питания на 3.3 В.
- Использовать совместимый с Arduino YourDuinoRobo1, на котором добавлен регулятор 3.3 В (в этом случае, возможно, стоит добавить конденсатор на 1 мкФ на радиомодуль).
- Старайтесь максимально избегать дополнительных проводов при подключении модуля радиопередатчика.
- Разработать отдельную плату, на которую устанавливается модуль nRF24L01 и добавляются конденсаторы на 1 и 10 мкФ неподалеку от контактов 3.3 В и GND.
Проблемы с питанием возникают при использовании таких микроконтроллеров как, например, Arduino Uno, Nano, Mega, в которых на пины подается всего 50 мА. На некоторых новых модификациях плат делают пины с силой тока до 350 мА. Ну или вы можете отдельно приобрести шилды для увеличения мощности.
Рабочее расстояние NRF24L01
Расстояние зависит от внешних условий. То есть: находитесь вы в помещении или на улице, есть ли препятствия на пути сигнала от радиопередатчика. Большинство производителей модулей nRF24L01 с маленькой мощностью передатчика указывают расстояние его действия 200 футов или 100 метров. Это характеристика передатчиков, которые используются на открытом воздухе, без препятствий на пути сигнала. Частота передатчика настроена на 2500 кГц. Внутри помещений, из-за наличия стен и других преград расстояние срабатывания будет меньше.
Рекомендуем протестировать ваш радиопередатчик в конкретных условиях перед его использованием. Кроме того, есть некоторые модификации радиопередатчиков nRF24L01 с внешней антенной, которая усиливает сигнал. Каждая конкретная ситуация накладывает свои ограничения, так что установить точную характеристику расстояния их действия невозможно.
Если вы хотите более детально ознакомится с техническими характеристиками этого маленького "радио", можете скачать даташит. Самые полезные страницы: 7, 8, 9 (общая характеристика и особенности радиопередатчика nRF24L01) и страница 39 (MultiCeiver, который дает возможность передавать информацию с 6 плат Arduino на основной (Primary) Arduino).
Существуют дополнительные модули для трансмиттера/ресивера (передатчика/приемника), которые обеспечивают беспроводную радиопередачу на расстояния до 1 км! Эти модули используют внешнюю антенну, которая может устанавливаться непосредственно на модуль или антенна, которая подключается с помощью дополнительных коннекторов. На фото ниже приведены несколько разновидностей модулей.
Слева маломощная версия передатчика со встроенной антенной. Справа вы можете увидеть нижние контакты (на фото они сверху), которые подключаются к Arduino. Схему подключения мы рассмотрим позже.


На фото ниже показаны трансмиттер с возможностью подключения внешней антенны и сама антенна. Для подключения радиопередатчика к Arduino используются те же 8 контактов и тот же софт.


Трансивер использует частоту 2.4 ГГц, как и большинство современных WiFi роутеров, телефонов.
Подобные трансиверы отправляют и принимают пакеты данных по несколько байт. Предусмотрена встроенная коррекция погрешностей и возможность отправить данные еще раз. Каждый отдельный модуль NRF24L01 может одновременно обмениваться данными с шестью! аналогичными модулями!
Этот недорогой модуль не так просто освоить, но талантливые люди написали библиотеки для Arduino, благодаря которым использовать эти передатчики стало на порядок проще. Ниже приведены примеры использования передатчиков с Arduino и ссылки на библиотеки, которые вам понадобятся. На рисунках ниже показана схема подключения NRF24L01 к Arduino, которая используется во всех последующих примерах.
Подключение NRF24L01 к Arduino (вид сверху):

Подключение NRF24L01 к Arduino (вид снизу):

Сигнал | Контакт на модуле RF |
Цвет кабеля |
Пин на модуле |
Контакт на Arduino (библиотека TMRh20,RF24) |
Контакт на Arduino (библиотека RF24) | Контакт на Arduino (библиотека Mirf) | Контакт MEGA2560 (библиотека RF24) | Контакт Arduino (библиотека RH_NRF24 RadioHead) | Контакт MEGA2560 (библиотека RH_NRF24 RadioHead) |
---|---|---|---|---|---|---|---|---|---|
GND | 1 |
Коричневый | GND | GND | GND | GND | GND | GND | GND |
VCC | 2 | Красный | VCC | 3.3 V | 3.3V | 3.3V | 3.3V | 3.3V | 3.3V |
CE | 3 | Оранжевый | CE | 7 | 9 | 8 | 9 | 8 | 8 |
CSN | 4 | Желтый | CSN | 8 | 10 | 7 | 53 | 10 | 53 |
SCK | 5 | Зеленый | SCK | 13 | 13 | 13 | 52 | 13 | 52 |
MOSI | 6 | Синий | MO | 11 | 11 | 11 | 51 | 11 | 51 |
MISO | 7 | Фиолетовый | MI | 12 | 12 | 12 | 50 | 12 | 50 |
IRQ | 8 | Серый | IRQ | - | 2 | Зависит от библиотеки |
N/C | N/C |
Обратите внимание! Большинство проблем при передаче возникает из-за шумов от источника питания 3.3 В. Особенно это чувствуется при использовании плат Arduino Mega. Решить эту проблему можно следующим образом: добавить в схему конденсатор между контактом GND и 3.3 В на радио модуле. Можно использовать конденсаторы номиналом 100 нФ. Некоторые ставят конденсаторы номиналом от 1 пкФ до 10 пФ.
Цвета приведены для удобства кодировки. Вы можете использовать их иначе. Главное, не запутаться.
Обратите внимание, что модули подключаются к 3.3 В, а не 5.0 В, хотя ваш Arduino при этом может работать и от 5 В. NRF24L01+ IC рассчитан на питание от 3.3 В, но контакты выдержат и питание 5 В.
На платах Arduino Uno и более ранних версиях есть выход 3.3 В, который можно использовать для некоторых версий передатчиков (смотрите в статье выше - проблемы с питанием). Но если вы используете более мощные передатчики, на них надо подавать отдельное питание на 3.3 В.
nRF24L01 - софт и библиотеки
Ниже будет приведен пример софта для передачи и приема данных. Кроме того, есть множество примеров на странице загрузок библиотеки RF24 Library. Как уже не раз упоминалось, для работы передатчика/приемника будем использовать библиотеки, в которых решены многие мелкие задачи, усложняющие наладку работы передатчика с Arduino.
Библиотека TMRh20's RF24 Library.
Скачать ее можно здесь (Кнопка "Download ZIP" в нижнем правом углу страницы).
После загрузки ZIP архива, на вашем ПК появится архив RF24-master.ZIP. Измените название архива на RF24.ZIP. Внутри архива находится папка с тем же названием RF24-master. Ее тоже переименуйте в RF24.
Для начинающих разбираться в Arduino, есть отличная инструкция по установке библиотек в Arduino IDE.
После установки библиотек, вы можете запускать примеры, включенные в библиотеку.
Скетчи для nRF24L01 и Arduino
Скетчи для nRF24L01 и Arduino
Пример: передача данных о положении координат джойстика Х и Y от одного модуля nRF24L01 к другому nRF24L01. Второй модуль получает данные положении джойстика и передает их на дальнейшее отображение.
Ниже два скетча. Загрузите первый на ваш первый Arduino, к которому подключен радиопередатчик nRF24L01 и джойстик (или можно использовать потенциометр). Второй скетч загрузите на Arduino с подключенным модулем nRf24L01.
/* YourDuinoStarter пример: nRF24L01 передаем данные о положении джойстика
- Что делает скетч: считывает аналоговые значения на контакте A0, A1 и передает их
с помощью радиопередатчика nRF24L01 приемнику.
- Подключение nRF24L01 модуля смотрите на:
1 - GND
2 - VCC 3.3V !!! НЕ 5V
3 - CE к Arduino пину 9
4 - CSN к Arduino пину 10
5 - SCK к Arduino пину 13
6 - MOSI к Arduino пину 11
7 - MISO к Arduino пину 12
8 - НЕ ИСПОЛЬЗУЕТСЯ
Аналоговый джойстик или два потенциометра 10 КОм:
GND к Arduino GND
VCC к Arduino +5V
X потенциометр к Arduino A0
Y потенциометр к Arduino A1 */
/*-----(Импортируем необходимые библиотеки)-----*/
#include <SPI.h>
#include <nRF24L01.h>
#include <RF24.h>
/*-----(Объявляем константы и номера пинов)-----*/
#define CE_PIN 9
#define CSN_PIN 10
#define JOYSTICK_X A0
#define JOYSTICK_Y A1 // ПРИМЕЧАНИЕ: "LL" в конце константы - это тип данных "LongLong"
const uint64_t pipe = 0xE8E8F0F0E1LL;
/*-----(Объявляем объекты)-----*/
RF24 radio(CE_PIN, CSN_PIN); // Создаем объект Radio
/*-----(Объявляем переменные)-----*/
int joystick[2]; // массив из 2-х элементов, в котором хранятся с джойстика
int i = 0;
void setup() /****** SETUP: ОТРАБАТЫВАЕТ 1 РАЗ ******/
{
Serial.begin(9600);
radio.begin();
radio.openWritingPipe(pipe);
}//--(завершение setup )---
void loop() /****** LOOP: ОТРАБАТЫВАЕТ В БЕСКОНЕЧНОМ ЦИКЛЕ ******/
{
joystick[0] = i++;
joystick[1] = i++;
radio.write( joystick, sizeof(joystick) );
delay(3);
}//--(завершаем главный цикл)---
Еще один интересный пример обмена данными между двумя радиомодулями RF24 находится по ссылке на Github.
Если что-то не работает???
В первую очередь проверьте питание 3.3 В. Хотя среднее значение силы тока питания равно 15 мА, бывают резкие скачки. В результате бывает такое, что передатчик отлично работает день/минуту, а потом перестает. Поэтому в схеме подключения желательно использовать конденсаторы на 10 мкФ между контактами GND и 3.3 В.
Оставляйте Ваши комментарии, вопросы и делитесь личным опытом ниже. В дискуссии часто рождаются новые идеи и проекты!