ELECTRONICS

nRF24L01+ и Arduino: схема подключения по SPI, библиотека RF24, передатчик и приёмник

Беспроводные модулиСкетч проверен компиляцией

nRF24L01+ — радиомодуль на 2,4 ГГц для связи двух и более Arduino между собой: пульт и машинка, датчики по дому и приёмник у компьютера. Дальность обычной версии 30–100 метров, версии PA+LNA с внешней антенной — до километра на открытом месте.

У модуля репутация капризного, и она заслужена одним обстоятельством: питание 3,3 В со всплесками тока при передаче. Стабилизатор UNO их не тянет. Конденсатор 10–100 мкФ прямо на выводах питания модуля решает девять проблем из десяти.

Схема подключения

Наведите на провод или нажмите на него — расскажу, зачем он нужен.

Распиновка

ПроводКуда и зачем
GND (1)Земля. Квадратная площадка — ключ разъёма.
VCC (2)3,3 В, до 15 мА в пиках. Конденсатор рядом.
CE (3)Chip Enable: включает приём или передачу. Любой вывод.
CSN (4)SPI Chip Select. Любой вывод, в примере 10.
SCK (5)Такт SPI, вывод 13.
MOSI (6)Вывод 11.
MISO (7)Вывод 12.
IRQ (8)Прерывание по приёму. Не подключается в простых схемах.

Характеристики

Частота
2,4 ГГц, 126 каналов
Скорость
250 кбит/с, 1 и 2 Мбит/с
Дальность
30–100 м; PA+LNA — до 1 км
Питание
1,9–3,6 В
Ток
12–15 мА в пиках, 1 мкА в сне
Интерфейс
SPI
Размер
29 × 15,5 мм

Труба, адрес и канал

Модули общаются по «трубам» — адресам из пяти байт. Передатчик открывает трубу на запись, приёмник — на чтение с тем же адресом. Адрес произвольный, лишь бы совпадал; в примерах ставят что-то вроде 00001.

Канал — номер частоты от 0 до 125. По умолчанию 76, и он пересекается с Wi-Fi. Если связь рвётся в квартире, переставьте оба модуля на канал выше 100: там Wi-Fi нет. Скорость 250 кбит/с даёт лучшую дальность — для датчиков её хватает с запасом.

Библиотека

RF24 (TMRh20)В менеджере библиотек их несколько с похожими именами. Нужна RF24 от TMRh20 — самая живая и с нормальными примерами.

Готовый скетч

#include <SPI.h>
#include <RF24.h>

RF24 radio(9, 10);                      // CE, CSN
const byte address[6] = "00001";

// Поставьте true на одной плате и false на другой
const bool IS_TRANSMITTER = true;

void setup() {
  Serial.begin(9600);
  radio.begin();
  radio.setPALevel(RF24_PA_LOW);         // рядом хватает малой мощности
  radio.setDataRate(RF24_250KBPS);        // медленнее — дальше
  radio.setChannel(108);                  // выше Wi-Fi
  if (IS_TRANSMITTER) {
    radio.openWritingPipe(address);
    radio.stopListening();
  } else {
    radio.openReadingPipe(1, address);
    radio.startListening();
  }
}

void loop() {
  if (IS_TRANSMITTER) {
    int value = analogRead(A0);
    bool ok = radio.write(&value, sizeof(value));
    Serial.println(ok ? "отправлено" : "нет ответа");
    delay(500);
  } else if (radio.available()) {
    int value = 0;
    radio.read(&value, sizeof(value));
    Serial.print("принято: ");
    Serial.println(value);
  }
}

Скетч собирается arduino-cli под Arduino UNO

Один скетч на обе платы: меняется только IS_TRANSMITTER. Передатчик шлёт значение с A0, приёмник печатает его.

Частые ошибки

radio.write возвращает false, приёмник молчит

В девяти случаях из десяти — питание. Конденсатор 10–100 мкФ между VCC и GND модуля, максимально близко к разъёму. Без него модуль сбрасывается в момент передачи.

Работает на столе, теряется в другой комнате

Мощность стоит RF24_PA_LOW — поднимите до HIGH или MAX. Для MAX нужен ещё больший конденсатор и хороший источник 3,3 В.

Сгорел при подключении

Подали 5 В на VCC. Модуль терпит 5-вольтовые сигналы на входах, но не на питании.

Модули не видят друг друга через раз

Разные версии библиотеки, разные настройки скорости или канала. Оба модуля должны иметь одинаковые setDataRate и setChannel, а адреса совпадать побайтно.

Версия PA+LNA хуже обычной

Антенный модуль ест до 115 мА и требует стабилизатора на 3,3 В с запасом — от UNO он не работает. Ставят переходник с собственным стабилизатором или конденсатор от 470 мкФ.

Что понадобится