NRF24L01 се захранва с 3.3v. Една от хубавите страни на тези модули е, че нивата на сигналите за комуникация с Ардуино работят както на 3.3v, така и на 5v, за разлика от WiFi модулите ESP8266, които са само на 3.3v. При първите опити за подкарване на комуникацията между два nRF модула или не се получаваше никаква връзка, или в най-добрия случай беше само в едната посока. Един от проблемите са свързани именно със захранване на модулите - нужно е да се ползва кондензатор като филтър. За целта между Vcc (3.3v) и Gnd свързах един кондензатор 47µf. Вероятно ще е най-добре да се ползва отделно захранване с по-добри характеристики.

След като захранихме nRF24L01 модула, време е да свържем и останалите пинове към Ардуино-то.

Номерация на пиновете на nRF24L01:
1 GND 2 VCC 3 CE 4 CSN 5 SCK 6 MOSI 7 MISO 8 IRQ
При използване на Arduino Nano:
nRF24L01 | Nano ---------------- (GND) 1 Gnd (VCC) 2 3.3v (CE) 3 D9 (CSN) 4 D10 (SCK) 5 D13 (MOSI) 6 D11 (MISO) 7 D12 (IRQ) 8 Не се ползва
Ако ползваме Arduino Mega:
nRF24L01 | Mega ---------------- (GND) 1 Gnd (VCC) 2 3.3v (CE) 3 D8 (CSN) 4 D7 (SCK) 5 D52 (MOSI) 6 D51 (MISO) 7 D50 (IRQ) 8 Не се ползва
Идва ред на софтуера. Използва се библиотека за NF24L01 (download).
Декларация на библиотеки:
#include <SPI.h>
#include <nRF24L01.h>
#include <RF24.h>
Инициализация:
// Деклариране на константи и пинове
#define CE_PIN 9 //За MEGA пин 8
#define CSN_PIN 10 //За MEGA пин 7
// Забележка: "LL" в краят на константата е идентификатор за тип "LongLong"
const uint64_t pipe = 0x0102030405LL; // Дефиниция на адрес на комуникационната линия
// Деклариране на обекти
RF24 radio(CE_PIN, CSN_PIN); // Създаване на радио-обект
void setup()
{
Serial.begin(9600);
//инициализация на радио обекта и поставянето му в режим на приемане
radio.begin();
radio.openReadingPipe(1, pipe);
radio.startListening();
}
Един примерен Loop():
int ccTest = 0;
void loop()
{
String recievedData = NRF24Listener(); //това трябва да стои в loop-а(слушаме за пакети с данни)
if (recievedData != "") //проверка дали има приет пакет с данни
{
//действия с получената информация от радиото (в променливата recievedData)
Serial.println(recievedData);
}
//примерна ситуация за изпращане на пакет с данни
ccTest++;
if (ccTest == 9999)
{
sendDataPacket(String(ccTest)); //изпращаме пакет с данни при ccTest равнo на 9999
ccTest = 0;
}
//край на примера за изпращане на пакет с данни
}
Описание на методи за изращане и получаване на информация:
void sendDataPacket(String dataToSend) //фукция за изпращане на пакет данни
{
radio.stopListening();
Serial.println("Tx:" + dataToSend;
int str_len = dataToSend.length() + 1;
char text[str_len];
dataToSend.toCharArray(text, str_len);
radio.openWritingPipe(pipe);
radio.write(&text, sizeof(text));
delay(10);
radio.openReadingPipe(1, pipe);
radio.openReadingPipe(0, 0ULL);
radio.startListening();
}
String NRF24Listener()
{
String result = "";
if ( radio.available() )
{
// Четем докато получим целия пакет с информация
bool done = false;
while (!done)
{
// Fetch the data payload
char text[32] = {0};
done = radio.read(&text, sizeof(text));
result = text;
}
}
}