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 мкФ.
Что понадобится
- Два модуля nRF24L01+
- Два электролитических конденсатора 47 мкФ
- Две платы Arduino
- Провода «папа-мама»