Ricetrasmettitore Wi-Fi nRF24L01+

nrf24L01Tutorial sul Modulo nRF24L01+, tra i più Economici e Versatile, Utile per Connessioni Wireless tra Microcontrollori fino a 2Mbps con Potenza fino a 1mW…


 
 
 
 




 

INTRO

Molte volte bisogna connettere senza fili due microcontrollori, l’operazione sembra molto difficile, ma con le giuste conoscenze e la giusta libreria, può diventare molto semplice. Il chip montato sul modulo in questione è prodotto dalla Nordic Semiconductor, mentre il modulo assemblato può essere acquistato a pochi euro su Ebay.

Dispone di un interfaccia SPI per la comunicazione con il microcontrollore, e permette inoltre di ricevere e trasmettere dati, non contemporaneamente, ma ad istanti temporali successivi, infatti è nominato transceiver.

Al suo interno implementa un protocollo di comunicazione che semplifica molto il controllo del modulo, inoltre grazie ad appositi registri è possibile settare la potenza, la frequenza e altri parametri della componentistica ad alta frequenza integrata.

 

CARATTERISTICHE DEL MODULO nRF24L01+

Le caratteristiche salienti riportate nel datasheet sono le seguenti:

Radio:

  • 126 Canali a radiofrequenza
  • 250Kbps, 1Mbps e 2Mbps velocità possibili
  • Potenza programmabile 0dBm, -6dBm, -12dBm e -18dBm
  • Consumo di 11.3mA come trasmettitore con potenza 0dBm
  • Consumo di 13.5mA come trasmettitore a 2Mbps

Protocollo comunicazione:

  • Dimensione del pacchetto da 1 a 32 bytes
  • Auto trasmissione dei pacchetti errati
  • Aggancio automatico dei pacchetti
  • SPI fino a 10Mbps
  • Fifo a 32bytes una per i dati ricevuti, una per i dati da trasmettere

Tensioni e correnti

  • Regolatore di tensione integrato
  • Tensioni ammissibili da 1.9V a 3.6V
  • 26µA in Standby, 900nA in power down mode
  • Ingressi digitali con tensione massima 5V

 

 

PIEDINATURA DEL MODULO nRF24L01+

Il modulo si presenta con la seguente forma e piedinatura:

nRF24L01 piedinatura e moduloI pin hanno la seguente funzione:

  • VCC e GND: sono rispettivamente la tensione positiva e quella di riferimento di alimentazione.
  • CE: Chip enable, serve per selezionare se il chip lavora come RX o TX
  • CSN: SPI Chip select
  • SCK: SPI clock
  • MOSI: SPI data input
  • MISO: SPI data output
  • IRQ: Interrupt del dispositivo, attivo basso

 




 

COMUNICARE COL MODULO

La comunicazione SPI permette di scrivere i registri del nRF14L01 e scambiare con esso i dati. La comunicazione SPI del modulo ha un data rate massimo di 10Mbps, ma non conviene superare 8Mbps.

Il timing del protocollo SPI è il seguente:

nRF24L01 SPI TIMINGI microcontrollori dispongono del modulo SPI che, ricevuti i dati da leggere o inviare, li inviano o li ricevano in protocollo SPI. Usare la struttura hardware interna al microprocessore riduce il lavoro software da fare e velocizza il microcontrollore, invece, scrivere un protocollo che emula l’SPI rende più portatile il codice, ovvero, cambiando microcontrollore, il codice continua ad essere valido anche senza la presenza del modulo SPI. Nel diagramma sono illustrati 4 segnali, CSN è un segnale di selezione, SCK è il clock, e deve avere il fronte di salita a metà del periodo del dato presente sul segnale MOSI e del MISO. I Cn rappresentano i bit del comando per controllare il modulo, gli Sn rappresentano i bit dello status register mentre i Dn sono i bit dei dati.

Quindi se voglio leggere un dato dal modulo, invio il comando sul pin MOSI, sul pin MISO ricevo informazioni sullo stato del registro e al byte successivo ricevo il dato desiderato. L’operazione è molto semplice e nel capitolo successivo verranno illustrati i comandi disponibili. Se invece voglio scrivere un dato nel modulo invio il comando sul pin MOSI e ricevo informazione sul registro sul pin MISO. Al byte successivo invio i dati che voglio inserire nel modulo tramite il pin MOSI.

 




 

COMANDI DISPONIBILI

Per avviare la comunicazione tra microcontrollore e nRF24L01 servono i seguenti comandi:nrf24l01 command

  • R_REGISTER: è un comando necessario per leggere i registri, gli ultimi 5bit, quelli contrassegnati dalla lettera A, rappresentano il numero del registro, se voglio leggere dal registro 2 (in binario 00010) allora il comando sarà 00000010.
  • W_REGISTER: è un comando necessario per scrivere i registri, gli ultimi 5bit, quelli contrassegnati dalla lettera A, rappresentano il numero del registro, se voglio scrivere dal registro 3 (in binario 00011) allora il comando sarà 00100011.
  • R_RX_PAYLOAD: questo comando serve se si vuole leggere il dato ricevuto, restituisce un numero di byte pari alla lunghezza del dato.
  • FLUSH_TX: svuota la fifo dei dati in trasmissione, da usare prima di scrivere un nuovo dato.
  • FLUSH_RX: svuota la fifo dei dati ricevuti, non viene eseguita se si sta inviando ancora l’ACK ovvero un dato che informa della corretta ricezione.
  • REUSE_TX_PL: ritrasmette l’ultimo dato trasmesso.
  • R_RX_PL_WID: ritorna un dato di lunghezza 1byte che informa sulla lunghezza del dato ricevuto.
  • W_ACK_PAYLOAD: serve a scrivere il dato da trasmettere insieme i byte di ACK che possono essere massimo 3.
  • W_TX_PAYLOAD_NO: usato in modalità trasmissione, disabilita l’ACK.
  • NOP: No operazioni.

 

I REGISTRI DEL MODULO nRF24L01+

Vi sono vari registri da configurare per il corretto funzionamento del modulo, partiamo dai primi tre registri, il registro CONFIG, il registro EN_AA e il registro EN_RXADDR rispettivamente registro di configurazione, registro per abilitare l’auto ACK e il registro per abilitare gli indirizzi del dato.

nrf24l01 register 0Partiamo dal primo registro e dal bit meno significativo, ovvero PRIM_RX, Questo bit seleziona se ho un RX o un TX. Il bit PWR_UP serve per attivare o no il modulo. EN_CRC serve per attivare o no un campo di controllo del dato inviato. MASK_MAX_RT abilita l’interrupt e se si attiva questo interrupt si avrà uno stato basso quando si raggiunge il massimo numero di ritrasmissioni del pacchetto. MASK_TX_DS  serve in modalità TX, se si attiva questo interrupt, si avrà uno stato basso sul pin dell’interrupt quando il ricevitore riceve il byte di ACK. L’ultimo bit, MAX_RX_DR serve per attivare l’interrupt quando il dato viene ricevuto.

Il registro EN_AA è molto semplice, si ha la possibilità di attivare 6 byte di auto ACK, si scrive 1 nel registro se si vuole attivare il byte di auto ACK, 0 per byte di auto ACK che non si attivare. Stessa cosa succede per il registro EN_RXADDR che serve però ad attivare o no i byte di indirizzo.

nrf24l01 register 1Il registro 03 ovvero SETUP_AW serve per selezionare il numero di indirizzi inseriti per ogni pacchetto, il registro 04, SETUP_RETR, serve per settare la ritrasmissione del pacchetto e si può settare il ritardo tra le auto ritrasmissioni, ovvero il tempo di attesa prima di una ritrasmissione se vi è un fallimento di trasmissione, e inoltre, si può settare il numero massimo di ritrasmissioni.

Il registro RF_CH serve per settare il canale, si modificano i 7 LSB e il canale può andare da 0 (00000000) fino a 127 (01111111). Il registro RF_SETUP serve per controllare il modulo a radiofrequenza. Il bit CONT_WAVE fa lavorare il modulo con una portante continua, ovvero trasmette anche senza pacchetto, questo bit non può essere a livello alto se si usa il comando REUSE_TX_PL. Poi vi sono i bit RF_DR_LOW e RF_DR_HIGH per settare la velocità d trasmissione, sembrerebbe conveniente usare la massima velocità, ma se non necessaria, usare la massima velocità riduce il range di trasmissione. I due bit RF_PWR serve a settare la potenza di trasmissione. Una potenza elevata permette di avere una comunicazione a lunga distanza, però aumenta il consumo di potenza del modulo, quindi bisogna utilizzare una potenza adeguata alle caratteristiche.

nrf24l01 register 2Il registro STATUS è un registro che contiene una serie di informazioni. Il bit RX_DR indica che il dato è pronta nella FIFO del ricevitore, il bit TX_DS indica l’avvenuta trasmissione, il bit MAX_RT indica che si è raggiunto il massimo numero di ritrasmissione, RX_P_NO indica il numero di byte pronti da leggere, mentre il bit TX_FULL indica se la FIFO del trasmettitore è piena. Il registro OBSERVE_TX contiene il numero di pacchetti persi e contiene il numero di pacchetti ritrasmessi.

nrf24l01 register 3I registri 0A, 0B, 0C, 0D, 0E e 0F contiene l’indirizzo del ricevitore, mentre il registro TX_ADDR contiene l’indirizzo del trasmettitore. I registri dal 0X11 al 0X16 contengono la lunghezza del pacchetto da inviare per ogni pipe che è abilitato.

nrf24l01 register 4Gli ultimi tre registri da analizzare sono il registro FIFO_STATUS, DYNPD e FEATURE. Il primo dei tre registri contiene dei flag che informano sullo stato della memoria FIFO, in ordine si ha: TX_REUSE che informa se il TX è pronto a riusare il pacchetto appena inviato, TX_FULL e TX_EMPTY utile a sapere se la FIFO del trasmettitore è piena o vuota e RX_FULL e RX_EMPTY utile a sapere se la FIFO del ricevitore è piena o vuota. Il registro DYNPD serve ad attivare la lunghezza dinamica del pacchetto per ogni data pipe mentre il registro FEATURE serve per abilitare la lunghezza dinamica del pacchetto , l’ACK o il comando di EN_TX_PAYLOAD_NOACK.

 

LE MEMORIE FIFO

Letteralmente FIFO significa first input first output ovvero il bit che entra per primo esce per primo. Ci sono 5 FIFO da 32byte e queste 5 FIFO rappresentano i data pipe, inoltre ci sono 5 FIFO per il ricevitore e 5 per il trasmettitore. In queste FIFO si possono quindi contenere 5 pacchetti da 32byte in ricezione e in trasmissione.

nrf24l01 fifo

 

FORMATO DEL PACCHETTO

Il pacchetto contiene le informazioni che si vogliono inviare, solo che ha bisogno di altri byte per effettuare una trasmissione sicura, in particolare è formato da:

  • PREAMBLE (1byte): è formato dalla seguente stringa 10101010 e serve come informazione di inizio pacchetto e come sincronizzazione con il ricevitore.
  • ADDRESS (3-5byte): contiene l’indirizzo del pacchetto e ha lunghezza minima di 3byte e massima di 5byte.
  • PAYLOAD (1-32byte) è l’informazione vera e propria, al ricevitore giunge tutto il pacchetto ma solo questi byte sono disponibile al difuori del modulo.
  • CRC (1-2byte): sono dei byte di controllo, utili come ACK, per la ritrasmissione del pacchetto o come campo di controllo per eventuali errori. Questo campo può essere presente o no.

L’ACK è un ulteriore pacchetto che viene trasmesso dal ricevitore al trasmettitore per informarlo della corretta ricezione del pacchetto. ACK è l’abbreviazione di ACKNOWLEDGEMENT.

 

INVIARE UN DATO COL MODULO nRF24L01+

Per inviare un pacchetto i passi da seguire sono i seguenti:

  1. Settare PRIM_RX=0 e le altre informazioni (potenza, datarate….)
  2. Comunicare l’indirizzo (TX_ADDR) e il dato da inviare (TX_PLD) attraverso SPI. L’indirizzo non va ricomunicato se rimane uguale a quello della precedente trasmissione. Se si vuole l’ACK configurare il data pipe per l’ACK. L’indirizzo del ricevitore deve essere uguale all’indirizzo del trasmettitore data pipe per data pipe.
  3. Un impulso di CE avvia la trasmissione.
  4. Se è abilitato l’ACK (ENAA_P0 =1) e il pacchetto è giunto a destinazione, il bit TX_DS nel registro STATUS viene settato a livello logico 1, se invece non arriva il pacchetto di ACK il pacchetto viene ritrasmesso . se l’ACK è disabilitato allora, finita la trasmissione, anche se non è andata a buon fine, il bit TX_DS viene settato a livello logico alto.
  5. Il modulo va in standby se CE = 0, altrimenti trasmette il pacchetto successivo, ma va in standby di nuovo se la FIFO è piena.

 

RICEVERE UN DATO COL MODULO nRF24L01+

Per ricevere un pacchetto i passi da seguire sono i seguenti:

  1. Si seleziona la modalità RX settando il bit PRIM_RX nel registro CONFIG. Tutti i possibili pipe che si possono riempire di dati vanno abilitati (EN_RXADDR), se si usa la modalità con ACK bisogna abilitarla (EN_AA) e inoltre bisogna settare la corretta dimensione del pacchetto.
  2. La modalità RX si attiva quando CE=1.
  3. Dopo 130µs inizia a cercare possibili comunicazioni, quindi potrebbe ricevere un pacchetto.
  4. Quando riceve un pacchetto valido (indirizzo e campo di controllo, CRC, validi) il pacchetto viene inserito nella FIFO del ricevitore e il bit RX_DR nel registro status è settato. Se si attiva l’interrupt di ricezione, il pin IRQ va a livello basso quando si riceve un pacchetto valido.
  5. Se è attivo l’ACK viene inviato al trasmettitore, e se vi è un pacchetto da inviare subito dopo la ricezione, l’ACK viene aggiunto a questo.
  6. Il microcontrollore legge tramite SPI il dato ricevuto e dopo di che il modulo nRF24L01 può spegnersi, rimanere in uno stato di RX o andare in uno stato di TX.

 
DATASHEET nRF24L01+

Per ulteriori approfondimenti e delucidazioni vi rimando al datasheet che potete scaricare o visionare grazie al seguente LINK!!!





 

[Voti Totali: 0 Media Voti: 0]
Segui la Nostra Pagina Facebook: Facebook

Lascia un commento

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