Радиомодуль NRF24L01
Если нам необходимо соединить два Arduino-устройства, очень популярным и бюджетным вариантом будет использование беспроводных модулей NRF24L01. Малое энергопотребление, достойный радиус действия и низкая цена — вот основные качества радиомодуля NRF24L01. Это позволяет ему конкурировать с устройствами Xbee и Bluetooth.
![]() |
![]() |
![]() |
Характеристики радиомодуля NRF24L01:
напряжение питания — от 1,9 до 3,6 вольт DC;
ток потребления:
пиковый ток при 2 Мбит — 12,5 мА;
рабочий ток — 11 мА;
режим ожидания — 32 мкА;
скорость передачи — до 2 Мбит, интерфейс SPI;
125 каналов связи, скачкообразная перестройка частоты;
поддержка многоточечной связи, аппаратный контроль ошибок;
встроенная антенна 2,4 ГГц;
встроенный стабилизатор напряжения;
количество PIN — 10;
радиус действия — 100 метров (на открытом пространстве);
размер — 33×14 мм;
вес — до 10 г.
Если вам нужно большее расстояние передачи, можно использовать модуль с внешней антенной , при этом расстояние передачи может составить до 1000 м со скоростью 250 Кбит/с (или 500 м со скоростью до 2 Мбит/с).
![]() |
Назначение выводов модуля NRF24L01 |
Библиотека для работы с модулем NRF24L01
Набор функций, предоставляемых модулем NRF24L01, поддерживает библиотека Mirf. Скачать библиотеку можно с официального сайта Arduino по ссылке http://playground.arduino.cc/InterfacingWithHardware/Nrf24L01.
![]() |
Arduino и беспроводной радиомодуль NRF24L01 |
Используемые контакты модуля NRF24L01:
12 — MOSI;
11 — MISO;
13 — SCK;
8 — CE;
7 — CSN.
![]() |
Подключение NRF24L01 |
Параметры библиотеки Mirf
Mirf.csnPin — пин CE (по умолчанию 9);
Mirf.cePin — пин CSN (по умолчанию 7);
Mirf.payload — размер буфера в байтах (по умолчанию 16, максимум 32);
Mirf.channel — номер радиоканала 0–127 (по умолчанию 0).
Функции библиотеки Mirf
Функция init()
Функция init() инициализирует модуль, устанавливает значения для настраиваемых контактов и инициализирует модуль SPI.
Синтаксис: Mirf.init()
Параметров нет.
Функция setRADDR()
Функция setRADDR() устанавливает адрес получателя.
Синтаксис:
Mirf.setRADDR(byte *addr)
Параметр: addr — адрес получателя.
Функция setTADDR()
Функция setTADDR() устанавливает адрес отправителя.
Синтаксис:
Mirf.setTADDR(byte *addr)
Параметр: addr — адрес получателя.
Функция config()
Функция config() устанавливает определенные в параметрах номер канала
Mirf.channel и емкость буфера Mirf.payload.
Синтаксис: Mirf.config(). Параметров нет.
Функция dataReady()
Функция dataReady() определяет, есть ли данные для получения.
Синтаксис:
Mirf.dataReady()
Параметров нет.
Возвращаемые значения:
true — есть данные для получения;
false — нет данных для получения.
Функция getData()
Функция getData() получает данные из буфера размером Mirf.payload.
Синтаксис:
Mirf.getData(byte *data)
Параметр: data — указатель на массив для получения данных.
Функция send()
Функция send() отправляет данные.
Синтаксис:
Mirf.send(byte *data)
Параметр: data — указатель на массив данных.
Функция isSending()
Функция isSending() определяет, отправляются данные или нет.
Синтаксис:
Mirf.isSending()
Параметров нет. Возвращаемые значения:
true —– данные отправляются;
false — данные не отправляются.
Пример соединения двух плат Arduino с помощью модуля NRF24L01
Радиомодули NRF24L01 подключаются к микроконтроллеру по SPI-интерфейсу. Для работы требуется напряжение в диапазоне от 1,8 до 3,6 вольт, впрочем, входы/выходы выдерживают до 5 вольт, поэтому при подключении к пятивольтовым устройствам дополнительные согласующие цепи ставить нет необходимости. Подключаем к платам Arduino по схеме, приведенной в таблице.
Контакты модуля NRF24L01 |
Контакты платы Arduino |
MISO |
12 |
MOSI |
11 |
SCK |
13 |
CE |
8 |
CSN |
7 |
3,3 В |
3,3 В |
GND |
GND |
Напишем скетч, отправляющий данные, полученные по последовательному порту, из одной платы Arduino в другую через модуль NRF24l01. Код скетча представлен в примере.
Sketch code
#include <SPI.h>
#include <Mirf.h>
#include <nRF24L01.h>
#include <MirfHardwareSpiDriver.h>
#define MAX_BUFF 32 // Буфер приема-передачи
void setup(){ Serial.begin(9600);
Mirf.spi = &MirfHardwareSpi; Mirf.init();
Mirf.setRADDR((byte *)"module1"); // Здесь задаем адрес
Mirf.payload = MAX_BUFF; // Здесь задаем буфер Mirf.channel = 10;
// Это канал приема-передачи - должен
// быть одинаковым у устройств. Mirf.config();
Serial.println("Start..");
}
char buff[MAX_BUFF]; int c_count = 0;
void loop(){ int i;
//sending
if (c_count = Serial.available()) { if (c_count <= MAX_BUFF) {
for (i=0; i<c_count; i++) { buff[i] = Serial.read();
}
} else {
for (i=0; i<MX_BUFF; i++) { buff[i] = Serial.read();
}
}
buff[i] = 0;
Mirf.setTADDR((byte *)" module2"); //Адрес! Serial.print(">");
Mirf.send((uint8_t *)buff); while(Mirf.isSending()){
}
Serial.println(buff);
}
delay(10);
//receiving if(Mirf.dataReady()) { Mirf.getData((uint8_t *)buff); Serial.print("<"); Serial.println(buff);
}
delay(100);
}
Загружаем скетч в одну из плат Arduino.
Для другой платы в скетче меняем строки:
Mirf.setRADDR((byte *)"module1"); // Здесь задаем адрес
Mirf.setTADDR((byte *)" module2"); // Адрес!
на следующие:
Mirf.setRADDR((byte *)"module2"); // Здесь задаем адрес
Mirf.setTADDR((byte *)" module1"); // Адрес!
Запускаем монитор последовательного порта для первой платы и видим обмен данными по беспроводному соединению между ними.
![]() |
Отправка/получение данных через NRF24L01 (первая плата) |
![]() |
Отправка/получение данных через NRF24L01 (вторая плата) |
Скачать библиотеку для RF24: RF24.zip
Скачать библиотеку для RF24: RF24.zip