Avere due o più schede Arduino in grado di comunicare tra loro in modalità wireless a distanza apre molte possibilità come il monitoraggio a distanza dei dati dei sensori, il controllo dei robot, la domotica e la lista continua. E quando si tratta di avere soluzioni RF a 2 vie economiche ma affidabili, nessuno fa un lavoro migliore del modulo transceiver nRF24L01+ di Nordic Semiconductor.

il modulo transceiver nRF24L01+ (più) può spesso essere ottenuto online per meno di due dollari, rendendolo una delle opzioni di comunicazione dati più economiche che si possano ottenere. E soprattutto, questi moduli sono super piccoli, permettendoti di incorporare un’interfaccia wireless in quasi tutti i progetti.

Panoramica dell’hardware

Frequenza radio

Il modulo transceiver nRF24L01+ è progettato per operare nella banda di frequenza ISM a 2,4 GHz in tutto il mondo e utilizza la modulazione GFSK per la trasmissione dei dati. La velocità di trasferimento dati può essere di 250kbps, 1Mbps e 2Mbps.

Cos’è la banda ISM a 2,4 GHz?

La banda a 2,4 GHz è una delle bande ISM (Industrial, Scientific, and Medical) riservate a livello internazionale per l’uso di dispositivi a bassa potenza senza licenza. Esempi sono i telefoni cordless, i dispositivi Bluetooth, i dispositivi near field communication (NFC) e le reti di computer wireless (WiFi), tutti usano le frequenze ISM.

Consumo di energia

La tensione di funzionamento del modulo è da 1,9 a 3.6V, ma la buona notizia è che i pin logici sono tolleranti a 5 volt, quindi possiamo facilmente collegarlo a un Arduino o a qualsiasi microcontrollore con logica a 5V senza utilizzare alcun convertitore di livello logico.

Il modulo supporta una potenza di uscita programmabile, ovvero 0 dBm, -6 dBm, -12 dBm o -18 dBm e consuma incredibilmente circa 12 mA durante la trasmissione a 0 dBm, che è anche inferiore a un singolo LED. E soprattutto, consuma 26 µA in modalità standby e 900 nA in modalità di spegnimento. Ecco perché sono il dispositivo wireless di riferimento per le applicazioni a basso consumo.

Interfaccia SPI

Il modulo transceiver nRF24L01+ comunica su un’interfaccia seriale periferica (SPI) a 4 pin con una velocità massima di dati di 10Mbps. Tutti i parametri come il canale di frequenza (125 canali selezionabili), la potenza di uscita (0 dBm, -6 dBm, -12 dBm o -18 dBm), e la velocità dei dati (250kbps, 1Mbps, o 2Mbps) possono essere configurati attraverso l’interfaccia SPI.

Il bus SPI utilizza un concetto di Master e Slave, nelle applicazioni più comuni il nostro Arduino è il Master e il modulo transceiver nRF24L01+ è lo Slave. A differenza del bus I2C il numero di slave sul bus SPI è limitato, su Arduino Uno è possibile utilizzare un massimo di due slave SPI cioè due moduli transceiver nRF24L01+.

Ecco le specifiche complete:

Frequency Range 2.4 GHz ISM Band
Maximum Air Data Rate 2 Mb/s
Modulation Format GFSK
Max. Potenza di uscita 0 dBm
Tensione di alimentazione operativa da 1,9 V a 3,6 V
Corrente massima di funzionamento . Operating Current 13.5mA
Min. Current (Standby Mode) 26µA
Ingressi logici 5V Tolerant
Campo di comunicazione 800+ m (linea di vista)

modulo nRF24L01+ Vs nRF24L01+ modulo PA/LNA

Ci sono una varietà di moduli disponibili basati sul chip nRF24L01+. Qui sotto ci sono le versioni più popolari.

nRF24L01+ Wireless Module

La prima versione usa l’antenna on-board. Questo permette una versione più compatta del breakout. Tuttavia, l’antenna più piccola significa anche un raggio di trasmissione inferiore. Con questa versione, sarete in grado di comunicare su una distanza di 100 metri. Naturalmente questo è all’aperto in uno spazio aperto. La tua portata all’interno, specialmente attraverso i muri, sarà leggermente indebolita.

nRF24L01+ PA LNA Wireless Transceiver Module with External Antenna

La seconda versione ha un connettore SMA e un’antenna a papera ma non è questa la vera differenza. La vera differenza è che è dotata di un chip speciale RFX2401C che integra il PA, l’LNA e il circuito di commutazione trasmissione-ricezione. Questo chip range extender insieme ad una duck-antenna aiuta il modulo a raggiungere un raggio di trasmissione significativamente più grande di circa 1000m.

Che cos’è PA LNA?

Il PA sta per Power Amplifier. Aumenta semplicemente la potenza del segnale trasmesso dal chip nRF24L01+. Invece, LNA sta per Low-Noise Amplifier. La funzione dell’LNA è di prendere il

schema a blocchi PA/LNA dell’nRF24L01+

segnale estremamente debole e incerto dall’antenna (di solito dell’ordine dei microvolt o sotto i -100 dBm) e amplificarlo a un livello più utile (di solito circa 0.5 a 1V)

L’amplificatore a basso rumore (LNA) del percorso di ricezione e l’amplificatore di potenza (PA) del percorso di trasmissione si collegano all’antenna tramite un duplexer, che separa i due segnali e impedisce all’uscita relativamente potente del PA di sovraccaricare il sensibile ingresso LNA. Per maggiori informazioni guardate questo articolo su digikey.com

A parte questa differenza, entrambi i moduli sono compatibili drop-in. Significa che se costruisci il tuo progetto con uno puoi semplicemente scollegarlo e usarne un altro senza bisogno di fare alcuna modifica al sistema.

Come funziona il modulo transceiver nRF24L01+?

RF Channel Frequency

Il modulo transceiver nRF24L01+ trasmette e riceve dati su una certa frequenza chiamata Channel. Anche per far sì che due o più moduli transceiver possano comunicare tra loro, devono essere sullo stesso canale. Questo canale potrebbe essere qualsiasi frequenza nella banda ISM di 2,4 GHz o, per essere più precisi, potrebbe essere tra 2,400 e 2,525 GHz (da 2400 a 2525 MHz).

Ogni canale occupa una larghezza di banda di meno di 1MHz. Questo ci dà 125 possibili canali con una spaziatura di 1 MHz. Così, il modulo può usare 125 canali diversi che danno la possibilità di avere una rete di 125 modem che lavorano indipendentemente in un posto.

Il canale occupa una larghezza di banda di meno di 1MHz a 250kbps e 1Mbps air data rate. Tuttavia, a 2Mbps air data rate, viene occupata una larghezza di banda di 2MHz (più ampia della risoluzione dell’impostazione della frequenza del canale RF). Quindi, per garantire canali non sovrapposti e ridurre il cross-talk in modalità 2Mbps, è necessario mantenere una distanza di 2MHz tra due canali.

La frequenza del canale RF del canale selezionato è impostata secondo la seguente formula:

Freq(selezionato) = 2400 + CH(selezionato)

Per esempio, se selezioni 108 come canale per la trasmissione dati, la frequenza del canale RF del tuo canale sarebbe 2508MHz (2400 + 108)

nRF24L01+ Rete Multiceiver

L’nRF24L01+ fornisce una caratteristica chiamata Multiceiver. È un’abbreviazione di Multiple Transmitters Single Receiver. In cui ogni canale RF è logicamente diviso in 6 canali dati paralleli chiamati Data Pipes. In altre parole, un data pipe è un canale logico nel canale RF fisico. Ogni data pipe ha il suo indirizzo fisico (Data Pipe Address) e può essere configurato. Questo può essere illustrato come mostrato di seguito.

nRF24L01+ Multiceiver Network – Multiple Transmitters Single Receiver

Per semplificare lo schema precedente, immaginate il ricevitore primario che agisce come un ricevitore hub che raccoglie informazioni da 6 diversi nodi trasmettitori simultaneamente. Il ricevitore hub può smettere di ascoltare in qualsiasi momento e si comporta come un trasmettitore. Ma questo può essere fatto solo un tubo/nodo alla volta.

Protocollo Enhanced ShockBurst

Il modulo transceiver nRF24L01+ utilizza una struttura a pacchetti nota come Enhanced ShockBurst. Questa semplice struttura di pacchetto è suddivisa in 5 diversi campi, che è illustrata qui sotto.

nRF24L01+ Enhanced ShockBurst Packet Structure

La struttura ShockBurst originale consisteva solo nei campi Preamble, Address, Payload e Cyclic Redundancy Check (CRC). Enhanced ShockBurst ha portato una maggiore funzionalità per comunicazioni più avanzate utilizzando un nuovo campo di controllo dei pacchetti (PCF).

Questa nuova struttura è grande per una serie di ragioni. In primo luogo, permette carichi utili di lunghezza variabile con uno specificatore di lunghezza del carico utile, il che significa che i carichi utili possono variare da 1 a 32 byte.

In secondo luogo, fornisce ad ogni pacchetto inviato un ID di pacchetto, che permette al dispositivo ricevente di determinare se un messaggio è nuovo o se è stato ritrasmesso (e quindi può essere ignorato).

Infine, e più importante, ogni messaggio può richiedere l’invio di un riconoscimento quando viene ricevuto da un altro dispositivo.

nRF24L01+ Automatic Packet Handling

Ora, discutiamo tre scenari per capire meglio come due moduli nRF24L01+ interagiscono tra loro.

Transazione con riconoscimento e interruptQuesto è un esempio di scenario positivo. Qui il trasmettitore inizia una comunicazione inviando un pacchetto di dati al ricevitore. Una volta che l’intero pacchetto è trasmesso, attende (circa 130 µs) la ricezione del pacchetto di riconoscimento (pacchetto ACK). Quando il ricevitore riceve il pacchetto, invia il pacchetto ACK al trasmettitore. Alla ricezione del pacchetto ACK il trasmettitore asserisce il segnale di interrupt (IRQ) per indicare che i nuovi dati sono disponibili.

Transazione con pacchetto dati persoQuesto è uno scenario negativo dove è necessaria una ritrasmissione a causa della perdita del pacchetto trasmesso. Dopo la trasmissione del pacchetto, il trasmettitore aspetta di ricevere il pacchetto ACK. Se il trasmettitore non lo riceve entro il tempo di Auto-Retransmit-Delay (ARD), il pacchetto viene ritrasmesso. Quando il pacchetto ritrasmesso viene ricevuto dal ricevitore, viene trasmesso il pacchetto ACK che a sua volta genera un interrupt al trasmettitore.

Transazione con acknowledgement persoQuesto è di nuovo uno scenario negativo dove è necessaria una ritrasmissione a causa della perdita del pacchetto ACK. Qui anche se il ricevitore riceve il pacchetto al primo tentativo, a causa della perdita del pacchetto ACK, il trasmettitore pensa che il ricevitore non abbia ricevuto il pacchetto. Così, dopo che il tempo di Ritardo alla Ritrasmissione Automatica è finito, ritrasmette il pacchetto. Ora, quando il ricevitore riceve il pacchetto contenente lo stesso ID del pacchetto precedente, lo scarta e invia nuovamente il pacchetto ACK.

Questa intera gestione dei pacchetti è fatta automaticamente dal chip nRF24L01+ senza il coinvolgimento del microcontrollore.

Pinout del modulo transceiver nRF24L01+

Diamo uno sguardo al pinout di entrambe le versioni del modulo transceiver nRF24L01+.

GND è il pin di terra. Di solito è segnato incassando il pin in un quadrato in modo che possa essere usato come riferimento per identificare gli altri pin.

VCC fornisce alimentazione al modulo. Questo può essere ovunque da 1,9 a 3,9 volt. Potete collegarlo all’uscita 3.3V del vostro Arduino. Ricorda di collegarlo al pin 5V probabilmente distruggerà il tuo modulo nRF24L01+!

CE (Chip Enable) è un pin attivo-alto. Quando viene selezionato, l’nRF24L01 trasmetterà o riceverà, a seconda della modalità in cui si trova attualmente.

CSN (Chip Select Not) è un pin attivo-LOW e viene normalmente tenuto HIGH. Quando questo pin va basso, l’nRF24L01 inizia ad ascoltare sulla sua porta SPI per i dati e li elabora di conseguenza.

SCK (Serial Clock) accetta gli impulsi di clock forniti dal bus SPI Master.

MOSI (Master Out Slave In) è l’ingresso SPI all’nRF24L01.

MISO (Master In Slave Out) è l’uscita SPI dall’nRF24L01.

IRQ è un pin di interrupt che può avvisare il master quando sono disponibili nuovi dati da elaborare.

Cablaggio – Collegamento del modulo transceiver nRF24L01+ ad Arduino UNO

Ora che abbiamo una comprensione completa di come funziona il modulo transceiver nRF24L01+, possiamo iniziare a collegarlo al nostro Arduino!

Per cominciare, collegate il pin VCC del modulo a 3,3V su Arduino e il pin GND a terra. I pin CSN e CE possono essere collegati a qualsiasi pin digitale su Arduino. Nel nostro caso, sono collegati rispettivamente ai pin digitali 8 e 9. Ora siamo rimasti con i pin che sono usati per la comunicazione SPI.

Come il modulo transceiver nRF24L01+ richiedono un sacco di trasferimento dati, daranno le migliori prestazioni quando sono collegati ai pin SPI hardware su un microcontrollore. I pin SPI hardware sono molto più veloci del ‘bit-banging’ del codice di interfaccia usando un altro set di pin.

Nota che ogni scheda Arduino ha diversi pin SPI che dovrebbero essere collegati di conseguenza. Per le schede Arduino come la UNO/Nano V3.0 quei pin sono i digitali 13 (SCK), 12 (MISO) e 11 (MOSI).

Se avete un Mega, i pin sono diversi! Vorrai usare i pin digitali 50 (MISO), 51 (MOSI), 52 (SCK) e 53 (SS). Fate riferimento alla tabella sottostante per una rapida comprensione.

MOSI MISO SCK
Arduino Uno 11 12 13
Arduino Nano 11 12 13
Arduino Mega 51 50 52

Nel caso tu stia usando una scheda Arduino diversa da quelle menzionate sopra, è consigliabile controllare la documentazione ufficiale di Arduino prima di procedere.

Cablaggio del modulo ricetrasmettitore wireless nRF24L01+ ad Arduino UNO

Cablaggio del modulo wireless nRF24L01+ PA LNA ad Arduino UNO

Ricorda! Dovete fare due di questi circuiti. Uno funge da trasmettitore e l’altro da ricevitore. Il cablaggio per entrambi è identico.

Una volta che hai tutto collegato sei pronto a partire!

Libreria Arduino RF24 per il modulo nRF24L01+

Interfacciarsi con il modulo transceiver nRF24L01+ è un sacco di lavoro, ma fortunatamente per noi, ci sono diverse librerie disponibili. Una delle librerie popolari è RF24. Questa libreria è stata in giro per diversi anni. È semplice da usare per i principianti, ma offre ancora molto per gli utenti avanzati. Nei nostri esperimenti, useremo la stessa libreria.

Puoi scaricare l’ultima versione della libreria sul fork del repository GitHub di RF24 oppure, basta cliccare questo pulsante per scaricare lo zip:

Per installarla, aprite l’IDE di Arduino, andate su Sketch > Include Library > Add .ZIP Library, e poi selezionate il file RF24-master che avete appena scaricato. Se hai bisogno di maggiori dettagli sull’installazione di una libreria, visita questo tutorial Installing an Arduino Library.

Codice Arduino – Per il trasmettitore

Nel nostro esperimento invieremo semplicemente un tradizionale messaggio ‘Hello World’ dal trasmettitore al ricevitore.

Ecco lo sketch che useremo per il nostro trasmettitore:

//Include Libraries#include <SPI.h>#include <nRF24L01.h>#include <RF24.h>//create an RF24 objectRF24 radio(9, 8); // CE, CSN//address through which two modules communicate.const byte address = "00001";void setup(){ radio.begin(); //set the address radio.openWritingPipe(address); //Set module as transmitter radio.stopListening();}void loop(){ //Send message to receiver const char text = "Hello World"; radio.write(&text, sizeof(text)); delay(1000);}

Lo sketch inizia includendo le librerie. La libreria SPI.h gestisce la comunicazione SPI mentre nRF24L01.h e RF24.h controllano il modulo.

//Include Libraries#include <SPI.h>#include <nRF24L01.h>#include <RF24.h>

In seguito, dobbiamo creare un oggetto RF24. L’oggetto prende due numeri di pin come parametri ai quali sono collegati i segnali CE e CSN.

//create an RF24 objectRF24 radio(9, 8); // CE, CSN

Poi dobbiamo creare un array di byte che rappresenterà l’indirizzo del tubo attraverso il quale due moduli nRF24L01+ comunicano.

//address through which two modules communicate.const byte address = "00001";

Possiamo cambiare il valore di questo indirizzo in qualsiasi stringa di 5 lettere come “node1”. L’indirizzo è necessario se avete pochi moduli in una rete. Grazie all’indirizzo, potete scegliere un particolare modulo a cui siete interessati a comunicare, quindi nel nostro caso avremo lo stesso indirizzo sia per il trasmettitore che per il ricevitore.

Prossimo nella funzione setup: dobbiamo inizializzare l’oggetto radio usando radio.begin() e usando la funzione radio.openWritingPipe() impostiamo l’indirizzo del trasmettitore.

//set the addressradio.openWritingPipe(address);

Infine, useremo la funzione radio.stopListening() che imposta il modulo come trasmettitore.

//Set module as transmitterradio.stopListening();

Nella sezione loop: creiamo un array di caratteri a cui assegniamo il messaggio “Hello World”. Usando la funzione radio.write() invieremo quel messaggio al destinatario. Il primo argomento è il messaggio che vogliamo inviare. Il secondo argomento è il numero di byte presenti in quel messaggio.

const char text = "Hello World";radio.write(&text, sizeof(text));

Con questo metodo, potete inviare fino a 32 byte alla volta. Perché questa è la dimensione massima di un singolo pacchetto che l’nRF24L01+ può gestire. Se avete bisogno di una conferma che il ricevitore ha ricevuto i dati, il metodo radio.write() restituisce un valore bool. Se restituisce TRUE, i dati hanno raggiunto il ricevitore. Se restituisce FALSE, i dati sono stati persi.

la funzione radio.write() blocca il programma finché non riceve la conferma o esaurisce tutti i tentativi di ritrasmissione.

Codice Arduino – Per il ricevitore

Ecco lo sketch che useremo per il nostro ricevitore

//Include Libraries#include <SPI.h>#include <nRF24L01.h>#include <RF24.h>//create an RF24 objectRF24 radio(9, 8); // CE, CSN//address through which two modules communicate.const byte address = "00001";void setup(){ while (!Serial); Serial.begin(9600); radio.begin(); //set the address radio.openReadingPipe(0, address); //Set module as receiver radio.startListening();}void loop(){ //Read the data if available in buffer if (radio.available()) { char text = {0}; radio.read(&text, sizeof(text)); Serial.println(text); }}

Questo programma è abbastanza simile al programma del trasmettitore, tranne alcuni cambiamenti.

All’inizio della funzione di setup avviamo la comunicazione seriale. Poi usando la funzione radio.setReadingPipe() impostiamo lo stesso indirizzo del trasmettitore e in questo modo abilitiamo la comunicazione tra trasmettitore e ricevitore.

 //set the address radio.openReadingPipe(0, address);

Il primo argomento è il numero del flusso. È possibile creare fino a 6 stream che rispondono a indirizzi diversi. Noi abbiamo creato solo l’indirizzo per lo stream numero 0. Il secondo argomento è l’indirizzo a cui lo stream reagirà per raccogliere i dati.

Il prossimo passo è impostare il modulo come ricevitore e iniziare a ricevere dati. Per farlo usiamo la funzione radio.startListening(). Da quel momento il modem attende i dati inviati all’indirizzo specificato.

//Set module as receiver radio.startListening();

Nella funzione loop: Lo sketch controlla se qualche dato è arrivato all’indirizzo usando il metodo radio.available(). Questo metodo restituisce il valore TRUE se qualche dato è disponibile nel buffer.

if (radio.available()) { char text = {0}; radio.read(&text, sizeof(text)); Serial.println(text); }

Se i dati sono ricevuti, allora crea un array di 32 caratteri riempito di zeri (in seguito il programma lo riempirà con i dati ricevuti). Per leggere i dati usiamo il metodo radio.read (& text, sizeof (text)). Questo memorizzerà i dati ricevuti nel nostro array di caratteri.

Alla fine ci limitiamo a stampare il messaggio ricevuto sul monitor seriale. Se hai fatto tutto bene e non ci sono errori nelle connessioni, dovresti vedere qualcosa di simile a questo nel tuo monitor seriale.

Uscita del ricetrasmettitore nRF24L01+ sul monitor seriale

Miglioramento della portata del modulo ricetrasmittente nRF24L01+

Un parametro chiave per un sistema di comunicazione wireless è la portata della comunicazione. In molti casi è il fattore decisivo per scegliere una soluzione RF. Quindi, discutiamo cosa possiamo fare per ottenere una portata migliore per il nostro modulo.

Ridurre il rumore dell’alimentazione

Un circuito RF che genera un segnale a radio frequenza (RF), è molto sensibile al rumore dell’alimentazione. Se non controllato, il rumore dell’alimentazione può ridurre significativamente la portata che si può ottenere.

A meno che la fonte di alimentazione sia una batteria autonoma, c’è una buona probabilità che ci sia del rumore associato alla generazione dell’alimentazione. Per evitare che questo rumore entri nel sistema, si consiglia di posizionare un condensatore di filtro da 10 µf sulla linea di alimentazione il più vicino possibile al modulo nRF24L01+.

Un modo più semplice per superarlo è usare un modulo adattatore molto economico per nRF24L01.

Adattatore nRF24L01+

Il modulo adattatore ha un connettore femmina a 8 pin per permetterti di inserire il tuo modulo nRF24L01. Può ospitare entrambi i moduli di cui abbiamo parlato prima, quello con antenna integrata e l’altro con antenna esterna (PA/LNA). Ha anche un connettore maschio a 6 pin per le connessioni SPI e Interrupt e un connettore a 2 pin per l’ingresso dell’alimentazione.

Il modulo adattatore ha il suo regolatore di tensione a 3,3 volt e un set di condensatori di filtro, quindi puoi alimentarlo con un alimentatore a 5 volt.

Cambia la frequenza del tuo canale

Un’altra potenziale fonte di rumore per un circuito RF è l’ambiente esterno, specialmente se hai reti vicine impostate sullo stesso canale o interferenze da altri dispositivi elettronici.

Per evitare che questi segnali causino problemi, suggeriamo di usare i 25 canali più alti del tuo modulo nRF24L01+. La ragione di questo è che il WiFi usa la maggior parte dei canali più bassi.

Data Rate

L’nRF24L01+ offre la massima sensibilità del ricevitore alla velocità di 250Kbps che è -94dBm. Tuttavia a 2MBps di velocità di dati, la sensibilità del ricevitore scende a -82dBm. Se parli questa lingua, sai che il ricevitore a 250Kbps è quasi 10 volte più sensibile che a 2Mbps. Ciò significa che il ricevitore può decodificare un segnale che è 10 volte più debole.

Cosa significa sensibilità del ricevitore (Rx)?

La sensibilità del ricevitore è il livello di potenza più basso al quale il ricevitore può rilevare un segnale RF. Più grande è il valore assoluto del numero negativo, migliore è la sensibilità del ricevitore. Per esempio, una sensibilità del ricevitore di -94 dBm è migliore di una sensibilità del ricevitore di -82 dBm di 12 dB.

Quindi, abbassare la velocità dei dati può migliorare significativamente la portata che puoi raggiungere. Inoltre, per la maggior parte dei nostri progetti, la velocità di 250Kbps è più che sufficiente.

Potenza di uscita più alta

Impostare la potenza di uscita massima può anche migliorare la portata della comunicazione. L’nRF24L01+ ti permette di scegliere una delle potenze di uscita: 0 dBm, -6 dBm, -12 dBm o -18 dBm. Selezionando la potenza di uscita di 0 dBm si invia un segnale più forte nell’aria.

Lascia un commento

Il tuo indirizzo email non sarà pubblicato.