Comunicazione senza fili con Arduino: modulo NRF24L01

In questo articolo tratteremo la comunicazione senza fili con Arduino, in particolare analizzeremo il modulo NRF24L01.

Cos’è il modulo NRF24L01?

Il modulo NRF24L01 è un chip prodotto dall’azienda Nordic Semiconductor ed è in grado di trasmettere dati in modo bidirezionale.

La trasmissione avviene attraverso onde radio a 2,4Ghz ISM (per la precisione 2,4 -2,4835 GHZ).


Si rammenta che le onde radio non corrispondo al “wi-fi”: analizzeremo tale metodo in un prossimo articolo.


Questo sistema di comunicazione è a dir poco straordinario, infatti questi moduli scambiano dati fino ad un centinaio di metri.


Esistono anche moduli provvisti di antenna, per coprire distanze maggiori.


Il loro costo è minore di 2 euro e possono essere settati in una modalità di risparmio energetico.

Il ché consente di ottimizzare i consumi nel caso in cui l’apparato funzionasse con una batteria.

Specifiche tecniche del modulo NRF24L01

  • Tensione operativa: 1.9V~3.6V
  • Modalità di risparmio energetico: consumo 1μA
  • Antenna: 2.4GHZ integrata
  • Velocità operativa (max): 2Mbps
  • Regolatore di tensione: integrato
  • Altre funzioni: comunicazione Multi-point a 125 canali, salto di frequenza, anti-interferenza, modulazione GFSK
  • Rilevamento errori CRC
  • Connettore: 2×4 pin maschio, passo standard 2,54mm – presaldato
  • Dimensioni: 29 x 15 x 12mm
  • Peso: 3g

Come funziona il modulo NRF21L01?

Il chip NRF24L01+ è gestito dall’interfaccia SPI. Attraverso tale interfaccia è possibile accedere ai registri del chip e modificarne tutti i parametri.


Per saperne di più sull’interfaccia SPI, leggi l’articolo a riguardo al seguente link: clicca qui.


Questa complessa operazione però, per noi è facilitata dalle librerie facilmente reperibili in rete, con cui potremmo facilmente sfruttare questo modulo utilizzando l‘IDE di Arduino.

Illustreremo il collegamento filare ad una scheda Arduino UNO ed utilizzeremo la libreria NRF24 scaricabile cliccando qui.

Comunicazione senza fili con Arduino: occorrente e connessione

Per prima cosa, muniamoci di due moduli NRF24L01 e due schede Arduino. Effettuiamo il collegamento con Arduino.


Possiamo utilizzare anche l’Arduino Nano: i collegamenti sono gli stessi.


Notiamo che il modulo NRF24L01+ è dotato di un connettore a 8 pin già saldato.

Dunque non dobbiamo fare altro che identificare questi pin e collegarli agli appositi pin di Arduino.

Comunicazione senza fili con Arduino: modulo NRF24L01

 NOME PIN ARDUINO UNO
1 GND GND
2 VCC 3.3v
3 CE pin a scelta
4 CSN pin a scelta
5 SCK 13
6 MOSI 11
7 MISO 12
8 IRQ non collegato

I pin, dunque, sono:

  • GND: la massa, il polo a potenziale 0, nulla di complicato.
  • VCC: polo positivo, che andremo a collegare su un’alimentazione compresa tra 1,9V e 3,6V come da specifica.
  • CE: sta per Chip Enable, ed è il pin che stabilisce se il modulo funziona da trasmettitore o da ricevitore.
  • CSN: SPI Chip select.
  • SCK: SPI SCLK.
  • MOSI: SPI MOSI.
  • MISO: SPI MISO.

La definizione degli ultimi quattro pin è stata omessa in quanto già descritta nell’articolo dedicato al bus SPI, citato in precedenza.


Detto ciò, possiamo effettuare il collegamento del modulo ad Arduino seguendo la tabella sopra descritta.

Comunicazione senza fili con Arduino: analisi degli sketch

Una volta collegati correttamente i moduli alle schede passiamo alla parte software.

Analizzeremo lo sketch di esempio della libreria scaricata riferito al test del PING tra un client e un server.


PING (acronimo di Packet Internet Grouper ) consiste in un programma utilizzato per misurare

il ritardo di trasmissione dati delle connessioni a Internet da postazione fissa.

In parole povere, il tempo necessario per trasmettere dati di piccole dimensioni verso la destinazione.


Comprendere la logica con cui la libreria permette lo scambio dati ci sarà utile per poter poi applicare tale concetto ad applicazioni ben più complesse.

Apriamo lo sketch di Arduino, poi i due esempi della libreria NRF24 con il nome “nrf24_ping_client” e “nrf24_ping_server”.

Ci troveremo davanti ad una schermata del genere:

Sketch di esempio della libreria NRF24

Naturalmente, occorre caricare su una scheda lo sketch relativo al server e sull’altra quello relativo al client.

SKETCH SERVER:

Sketch server

Innanzitutto notiamo che per la comunicazione senza fili con Arduino, non è necessario specificare i pin a cui colleghiamo CS e CSN.


Questo è valido solo se ad ogni scheda Arduino colleghiamo UN SOLO modulo NRF24L01.

Infatti questi due pin servono proprio ad indicare quale dei moduli connessi al bus vogliamo far funzionare e in che modo (RX o TX).

Ciò significa che nel caso in cui collegassimo un solo modulo per ogni scheda possiamo evitare di collegare questi due pin.


NRF24 nrf24; // Dichiarazione dell’istanza

Void setup(): 

Nel “void setup” troviamo le istruzioni che servono a configurare il modulo. In particolare:

if (!nrf24.setThisAddress((uint8_t*)“serv1”, 5))

  • Tale istruzione definisce il nome del dispositivo. In questo caso stiamo definendo il nome del dispositivo che sarà “serv1”.

if (!nrf24.setPayloadSize(sizeof(unsigned long)))

  • Quest’ istruzione è fondamentale e dobbiamo assicurarci che sia uguale su tutte le schede che vogliamo far comunicare tra loro.

Essa definisce il tipo di variabile che sarà usata per trasmettere e ricevere i dati.

Per la nostra comunicazione senza fili con Arduino, sono due le schede che avranno questa stessa istruzione.

Si è scelto “unsigned long” e dunque anche nel client dovrà essere dettata ugualmente.

if (!nrf24.setRF(NRF24::NRF24DataRate2Mbps, NRF24::NRF24TransmitPower0dBm))

  • Infine abbiamo questa riga, che imposta la velocità di trasmissione dei dati e la potenza del segnale.

La stringa non va modificata a meno di casi particolari che non citiamo in quanto esulano dallo scopo di questo articolo.

Void loop():

nrf24.waitAvailable();

  • Monitora l’attività del bus fin quando non trova un dato da ricevere.

unsigned long data;

  • Definisce la variabile in cui inserire il dato che si prepara a ricevere, di tipo unsigned long.

uint8_t len = sizeof(data);

  • Assegna alla variabile “len” di tipo “uint8_t”, il valore del ‘peso’ della variabile che ospiterà il dato da ricevere.

if (!nrf24.recv((uint8_t*)&data, &len)) 

  •  Se è disponibile un dato, lo riceve nella variabile “data” di cui conosce il ‘peso’ dato dalla variabile “len”.

Visto che si tratta di un test PING, il programma prevede di ricevere un dato dal client e rinviarlo allo stesso. Dunque a seguire troveremo:

if (!nrf24.setTransmitAddress((uint8_t*)“clie1”, 5))

  • Setterà l’indirizzo (nome) a cui trasmettere il dato, che nel nostro caso è “clie1”.

Ovvero il nome che comparirà nello sketch del client come vedremo a breve.

if (!nrf24.send((uint8_t*)&data, sizeof(data))

  • Definiamo ancora una volta i parametri del dato da trasferire analogamente a come fatto poco fa.

if (!nrf24.waitPacketSent())

  • Istruzione di invio che in caso di riscontro negativo produrrà un messaggio di errore sulla seriale di Arduino.

SKETCH DEL CLIENT:

if (!nrf24.setTransmitAddress((uint8_t*)”serv1″, 5))

unsigned long time = millis();
if (!nrf24.send((uint8_t*)&time, sizeof(time)))

if (!nrf24.waitPacketSent())

Troveremo le istruzioni che inviano il dato, con le stesse modalità utilizzate per il server. In questo caso tale dato sarà il valore ricavato dalla funzione millis().

Successivamente, così come per il server, le istruzioni per la ricezione del dato:

unsigned long data;
uint8_t len = sizeof(data);
if (!nrf24.recv((uint8_t*)&data, &len))
Serial.println(“read failed”);

Come si può notare, la logica delle funzioni della libreria è la stessa sia per il server che per il client.

Comunicazione senza fili con Arduino: prova del funzionamento

Bene, una volta effettuati i collegamenti e caricati gli sketch, possiamo effettuare finalmente la nostra comunicazione senza fili con Arduino.

Proviamo il funzionamento di questo modulo. Apriamo entrambi gli sketch e il monitor seriale su entrambi gli Arduino.

Vedremo che i moduli inizieranno la comunicazione e il server ci mostrerà il tempo che intercorre tra l’invio e la ricezione del dato:

Comunicazione nrff24


Arduino UNO

Per saperne di più sull’utilizzo di Arduino, visita la sezione dedicata a guide e tutorial!!!

Iscriviti alla nostra newsletter  per non perdere i prossimi articoli!

 

8 risposte

  1. Ciao, vorrei far notare che c’è un errore di collegamento nello schema
    Il pin SCK del nRF24L01 deve essere collegato al pin 13 dell’Arduino UNO o Nano e non sul pin 10 come mostrato nello schema.

  2. Sto cercando di provare i moduli nrf24L01 con antenna, ma non riesco proprio a farli comunicare.
    Ho provato diversi esempi ma nulla.
    avreste un esempio di invio dati da una scheda e ricezione in un’altra con due arduino uno r3?

    Grazie

    1. Ciao Gianluca, controlla bene i collegamenti, e che i pin nel software siano effettivamente quelli che hai collegato. Se hai problemi, contattaci tramite l’apposita pagina inviandoci lo sketch e i collegamenti che hai effettuato, cercheremo di aiutarti nel minor tempo possibile.

  3. il disegno dei collegamenti arduino uno/nano sono sbagliati, come ti ha fatto presente Giovanni in data 25/febbraio sarebbe bene modificarli onde evitare delusioni da chi mette in pratica l’articolo

  4. Ciao, sto provando ad utilizzare questo test di comunicazione tra una UNO (trasmettitore) e una Nano 33 IoT (ricevitore), ma non funziona (il ricevitore mi dà un ping a monitor seriale ma il trasmettitore mi scrive “wait PacketSent failed”). Cosa potrebbe essere? Ci vuole una libreria specifica per la 3 IoT o è sufficiente la NRF24 linkata nell’articolo?

    1. Buongiorno Paolo, innanzitutto ti consiglio di verificare bene i cablaggi e di verificare la correttezza dei settaggi nello sketch, poi, invia tramite il form contatti gli sketch caricati sulle due schede, daremo un’occhiata per verificare che sia tutto ok

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *

*

Per info e contatti