Martedì 9 Agosto 2016
Utilizzare i moduli nRF24L01+ con Arduino
Arduino collegato al modulo nRF24L01+
Smanettando un po' nel mondo di Arduino ho capito tante cose:
1) Tutto quello che vorresti utilizzare per qualunque tuo progetto è già stato studiato/analizzato/implementato
2) Programmare Arduino è come costruire qualcosa con i LEGO, ovvero tutti i mattoncini sono già pronti, li devi solo mettere assieme

Succede, a volte, che qualche modulo sia tutt'altro che banale da utilizzare, vuoi per un motivo o per l'altro c'è il bisogno di metterci un po' di più di testa nel lavorarci sopra.

Un esempio di "complicazione" di utilizzo sta proprio nel modulo nRF24L01+ (ATTENZIONE!!! i soli moduli con il '+' presentano le complicazioni sotto descritte, se il modulo che state utilizzando NON ha il più finale allora non dovreste aver problemi).
Sebbene il suo fratello maggiore il nRF24L01 non presenti alcun problema con Arduino, questo nuovo modulo può risultare problematico e non funzionare correttamente.

Sostanzialmente l'nRF24L01+ richiede picchi di corrente più elevata di quanta il nostro povero Arduino sia in grado di erogarne impedendo al modulo di inviare e ricevere dati. Tuttavia il modulo risponde correttamente a tutti gli altri comandi (letture/scritture registri, ecc.).

Ricapitolando: il modulo funziona correttamente ma non invia e non riceve (mai 'na gioia).

Se vi siete trovati nella mia stessa situazione (ovvio! Altrimenti non stareste leggendo il mio articolo!) le soluzioni sono diverse e più o meno valide:

Partiamo dallo schema elettrico:

Schema di collegamento tra Arduino e il modulo nRF24L01+

... e proseguiamo con uno sketch di prova per inviare:
#include <SPI.h>
#include "nRF24L01.h"
#include "RF24.h"

RF24 radio(9,10);

const uint64_t pipes[2] = { 0xF0F0F0F0E1LL, 0xF0F0F0F0D2LL };
unsigned long Command = 1989;
void setup() {
Serial.begin(57600);
radio.begin();
radio.setRetries(15,15);
radio.openReadingPipe(1,pipes[1]);
radio.startListening();
radio.printDetails();
radio.openWritingPipe(pipes[0]);
radio.openReadingPipe(1,pipes[1]);
radio.stopListening();
}

void loop(void) {
radio.stopListening();
radio.write( &Command, sizeof(unsigned long) );
radio.startListening();
delay(1000);
}

n.b. si sottointende che la libreria RF24 è stata precedentemente installa nell'IDE di arduino

infine lo sketch di prova per ricevere:
#include <SPI.h>
#include "nRF24L01.h"
#include "RF24.h"

RF24 radio(9,10);
const uint64_t pipes[2] = { 0xF0F0F0F0E1LL, 0xF0F0F0F0D2LL };

void setup(void) {
Serial.begin(57600);
radio.begin();
radio.setRetries(15,15);
radio.openReadingPipe(1,pipes[1]);
radio.startListening();
radio.printDetails();
radio.openWritingPipe(pipes[1]);
radio.openReadingPipe(1,pipes[0]);
radio.startListening();
}

void loop(void) {
if ( radio.available() ) {
unsigned long data = 0;
radio.read( &data, sizeof(unsigned long) );
Serial.println(data);
delay(20);
}
}


Arrivati a questo punto se carichiamo i due sketch su due Arduini diversi dovremmo vedere nell'Arduino con lo sketch di ricezione comparire una sfilza di righe con "1989".
Invece nulla, tutto tace. Questo perchè il modulo nRF24L01+ non è alimentato correttamente. Cosa possiamo fare quindi?

Soluzione 1 (immediata ma non perfetta)

La cosa più semplice che si può fare (di sicuro non proprio intuitivisssssima) è collegare tra all'alimentazione 3V3 e GND un condensatore elettrolitico da 100uF (attenzione alla polarità) che va sostanzialmente a erogare la corrente ulteriore che il modulo richiede durante la trasmissione/ricezione (vedi immagine).
Schema di collegamento tra Arduino e il modulo nRF24L01+ con condensatore

Tale soluzione garantisce il funzionamento del dispositivo ma non è infallibile: capita che qualche volta il modulo non riesca a trasmettere/ricevere comunque.

Soluzione 2 (veloce ma scomoda)

Ci attacchiamo un generatore esterno (io ho utilizzato un alimentatore da banco) che fornisca 3V3 stabili e almeno 15mA per modulo (se li collegate tutti e due servono almeno 30mA) e cortocircuitiamo tutte le masse.
In questo modo i problemi di alimentazione non sono più legati all'Arduino, ma all'atto pratico risulta molto scomodo (se non inutile) questo tipo di soluzione.

Soluzione 3

Infine ci possiamo affidare a un modulo di alimentazione secondario che prenda l'alimentazione 5V da Arduino e la trasformi in una 3V3 con una corrente sufficiente per i nostri scopi.
Tale soluzione non è altro che un modulo DC-DC esterno tipo questo fatto ad-hoc per questo tipo di modulo (in alternativa è possibile acquistare dei moduli DC-DC general purpose che consentano lo stesso scaling).


Concusione

Una volta correttamente alimentati questi moduli sono in grado di svolgere egregiamente il loro sporco lavoro di moduli wireless a basso costo. A partire dai due sketch di esempio è possibile costruire qualunque tipo di comunicazione wireless si desideri.
Torna indietro


Commenti: 0

Nome:
Messaggio:
Riscrivi il codice:

Non รจ stato inviato nessun commento!

Filtra per Tag:

-Windows (9)
-HowTo (7)
-Server (6)
-Linux (4)
-Hardware (4)
-e-commerce (3)
-Programmazione (2)
-Wireless (2)
-eMule (2)
-nVidia (2)
-WEB (1)
-Trashware (1)
-IRC (1)
-Puttanate (1)
-PDF (1)
-Arduino (1)
-Elettronica (1)