Programmiamo Arduino UNO per parlare tramite la connessione Wireless

Arduino è in grado di comunicare con altre dev-board in diverse maniere, ma una della più comode è senza dubbio la comunicazione senza cavo, attuabile tramite alcuni moduli che sfruttano la interfaccia SPI. Possiamo così far parlare il nostro Arduino UNO con un altro Arduino UNO o Arduino Nano o Arduino Mega tramite il modulo nRF24L01.

Specifiche

Esistono diverse versioni del modulo nRF24L01, alcune con antenna integrata, altri con un’antenna esterna. Di base, però, la programmazione è la medesima, come pure sono le specifiche tecniche. Il modulo opera ad una frequenza di 2,4GHz, in grado di raggiungere anche una distanza superiore ai 50 metri. La tensione di lavoro del modulo è di 3,3V con una corrente nominale a 50mA, quindi sconsigliamo di alimentarlo con i 5V per non danneggiare la scheda.

Va però specificato che, talvolta, soprattutto nell’utilizzare Arduino UNO non originali si possano riscontrare problemi nell’alimentare il modulo collegandolo al pin da 3,3V. In questi casi è consigliabile adoperare un apposito adattatore o saldare al modulo un condensatore elettrolitico da 10μF, ponendolo tra il pin Vcc e GND.

Per acquistare 2 Moduli nRF24L01 con adattatori da Amazon: https://amzn.to/3kLRH9m



Collegamenti

Adopereremo due Arduino UNO con relativi moduli nRF24L01, ponendo in entrambi gli stessi collegamenti. In fase di scrittura di codice, invece, porremo un Arduino UNO come trasmittente e l’altro come ricevitore. Partiamo dicendo che il modulo nRF24L01 è dotato di 8 pin, di cui andremo ad utilizzarne solo 7. Il pin IRQ, usato come “interruttore” per attivare o disattivare il modulo, non verrà trattato in questa guida.

nRF24L01Arduino UNO
Vcc (V+)3,3V
GNDGND
CSN8
CE7
SCK13
MOSI11
MISO12

nRF24L01

Codice

Per programmare con Arduino UNO il modulo wireless nRF24L01 necessitiamo di scaricare l’apposita libreria RF24-Master da GitHub e poi caricarla sulla nostra IDE. Una volta che avremo caricato la libreria, realizziamo il codice per programmare Arduino UNO come trasmittente (da scaricare QUI) e, per farlo, partiamo come sempre dalle librerie, inserendo le apposite librerie e la libreria SPI.h. Definiamo poi i pin digitali per comunicare con il modulo e creiamo l’oggetto myRF24 che adopereremo per inviare un messaggio di testo. Settiamo correttamente l’indirizzo per la comunicazione (pipe) chiamandolo address, costituito da una serie di quattro zeri e da un 1 finale; in caso di più comunicazioni, cambiamo l’ultima cifra. Possiamo creare fino ad un massimo di 6 connessioni.


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

RF24 myRF24 (7, 8);
byte address[6] = "00001";

Nel VOID SETUP avviamo il monitor seriale, poi avviamo il modulo, predisponendolo per la scrittura e invio, definiamo il livello di segnale a minimo (potremmo anche impostarlo al massimo con RF24_PA_MAX) e interrompiamo l’ascolto, anche se quest’ultima riga non è strettamente necessaria.


Serial.begin(9600);

myRF24.begin();
myRF24.openWritingPipe(address);
myRF24.setPALevel(RF24_PA_MIN);
myRF24.stopListening();

Possiamo anche settare altri valori come il canale con

 myRF24.setChannel(115); 

o il data rate con

 myRF24.setDataRate (RF24_250KBPS);

ma non sono parametri essenziali in questo momento. Spostandoci, infine, nel VOID LOOP creiamo una variabile char che contiene un array formato da 5 lettere e che formano la parola Prova. Chiediamo poi al modulo di “scrivere” la variabile e il peso per poi inviarla. Stampiamo su monitor seriale e attendiamo 1 secondo.

 


char text[5] = "Prova";

myRF24.write(&text, sizeof(text));

Serial.println(text);
delay(1000);

Carichiamo il codice sul primo Arduino UNO, selezionando la corretta porta, dopodiché passiamo a redigere il codice per il secondo Arduino UNO che fungerà da ricevente (da scaricare QUI). La prima parte del codice è la medesima, quindi la riportiamo semplicemente:


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

RF24 myRF24 (7, 8);
byte address[6] = "00001";

I cambiamenti avvengono nel VOID SETUP, dove chiediamo al nostro modulo di aprire una comunicazione con l’Arduino Trasmittente sullo stesso indirizzo, creando una singola comunicazione con questo dispositivo inserendo il numero 0 prima dell’indirizzo.


Serial.begin(9600);
delay(1000);

myRF24.begin();
myRF24.openReadingPipe(0, address);
myRF24.setPALevel(RF24_PA_MIN);
myRF24.startListening();

Nel VOID LOOP controlliamo se la comunicazione è stata avviata, successivamente creiamo una variabile char vuota dentro la quale verrà caricato il messaggio ricevuto e lo stampiamo sul monitor seriale.


if ( myRF24.available()) {
char text[5] = "";
myRF24.read( &text, sizeof(text));
Serial.println(text);
}

Se tutto è andato bene, apriamo il Serial Monitor e vedremo che la trasmittente manda un messaggio alla ricevente che lo stampa ogni secondo sul monitor seriale.