Ricetrasmettitore rf per Arduino: nRF24L01

Ciao a tutti!


Oggi vedremo come utilizzare il modulo nRF24L01.
Questo dispositivo è un ricetrasmettitore RF funzionante a 2.4GHz utile se volete trasmettere dati o semplicemente "telecomandare" un altro arduino.





Questo modulo ha molti pregi, vediamo quali:
- costo contenuto
- dimensioni compatte
- consumo di corrente in standby nell'ordine del milliampere
- consumo in trasmissione/ricezione di circa 12 mA
- raggio di azione senza ostacoli di un centinaio di metri (da provare).

I primi 2 difetti riscontrati invece sono: la disposizione dei piedini che rende impossibile l'uso diretto su una breadboard, e forse l'uso non semplicissimo.

Quello che vedremo oggi è un semplice esempio di comunicazione tra 2 moduli, con uno utilizzato come trasmettitore ed uno come ricevitore che consentiranno di controllare 2 led grazie a 2 pulsanti.

ecco un video dimostrativo:



Se avete in mano i vostri moduli passiamo subito alla realizzazione dei 2 circuiti:



Trasmettitore:




Ricevitore:


Ora che avete realizzato i circuiti possiamo passare alla parte di codice da caricare nei nostri Arduini.
Per prima cosa dovrete installare la libreria RF24 scaricabile da qui.


poi caricate questo sketch nell'Arduino "trasmettitore"


  1. /* Basato sull'esempio "YourDuinoStarter Example: nRF24L01 Transmit Joystick values"
  2.  http://arduino-info.wikispaces.com/Nrf24L01-2.4GHz-HowTo
  3.  http://www.danielealberti.it/2016/01/ricetrasmettitori-rf-per-arduino.html
  4.  Collegamenti del modulo RF24L01 ad Arduino:
  5.  1 - GND
  6.  2 - VCC 3.3V !!! NOT 5V
  7.  3 - CE to Arduino pin 9
  8.  4 - CSN to Arduino pin 10
  9.  5 - SCK to Arduino pin 13
  10.  6 - MOSI to Arduino pin 11
  11.  7 - MISO to Arduino pin 12
  12.  8 - UNUSED
  13.  */
  14. #include <SPI.h>
  15. #include <nRF24L01.h>
  16. #include <RF24.h>
  17. #define CE_PIN   9
  18. #define CSN_PIN 10
  19. const uint64_t pipe = 0xE8E8F0F0E1LL; // Definisce il canale di trasmissione
  20. RF24 radio(CE_PIN, CSN_PIN); // Stabilisce la comunicazione
  21. int button1=6;
  22. int button2=7;
  23. int buttonstate1;
  24. int buttonstate2;
  25. int datatosend[1];
  26. void setup()  
  27. {
  28.   pinMode (button1, INPUT_PULLUP);
  29.   pinMode (button2, INPUT_PULLUP);
  30.   radio.begin();
  31.   radio.openWritingPipe(pipe);
  32. }
  33. void loop()  
  34. {
  35.   buttonstate1 = digitalRead (button1);
  36.   buttonstate2 = digitalRead (button2);
  37.   if (buttonstate1 == LOW)
  38.   {
  39.     datatosend[0] = 1;
  40.   }
  41.   if (buttonstate2 == LOW)
  42.   {
  43.     datatosend[0] = 2;
  44.   }
  45.   radio.write (datatosend, sizeof(datatosend)) ;
  46. }



Invece caricate quest'altro nell'Arduino "ricevitore"


  1. /* Basato sull'esempio "YourDuinoStarter Example: nRF24L01 Transmit Joystick values"
  2.  http://arduino-info.wikispaces.com/Nrf24L01-2.4GHz-HowTo
  3.  http://www.danielealberti.it/2016/01/ricetrasmettitori-rf-per-arduino.html
  4.  Collegamenti del modulo RF24L01 ad Arduino:
  5.  1 - GND
  6.  2 - VCC 3.3V !!! NOT 5V
  7.  3 - CE to Arduino pin 9
  8.  4 - CSN to Arduino pin 10
  9.  5 - SCK to Arduino pin 13
  10.  6 - MOSI to Arduino pin 11
  11.  7 - MISO to Arduino pin 12
  12.  8 - UNUSED
  13.  */
  14. #include <SPI.h>
  15. #include <nRF24L01.h>
  16. #include <RF24.h>
  17. #define CE_PIN   9
  18. #define CSN_PIN 10
  19. const uint64_t pipe = 0xE8E8F0F0E1LL; // Definisce il canale di trasmissione
  20. RF24 radio(CE_PIN, CSN_PIN); // Stabilisce la comunicazione
  21. int ledpin1 = 6;
  22. int ledpin2 = 7;
  23. int datatoreceive[1];
  24. void setup()  
  25. {
  26.   delay(1000);
  27.   radio.begin();
  28.   radio.openReadingPipe(1,pipe);
  29.   radio.startListening();
  30.   pinMode (ledpin1, OUTPUT);
  31.   pinMode (ledpin2, OUTPUT);
  32. }
  33. void loop()  
  34. {
  35.   if ( radio.available() )
  36.   {
  37.     // leggi i dati in ricezione finchè il messaggio è completo
  38.     bool done = false;
  39.     while (!done)
  40.     {
  41.       // ricevi il messaggio
  42.       done = radio.read( datatoreceive, sizeof(datatoreceive) );
  43.     }
  44.    
  45.     if ((datatoreceive[0])==1)
  46.     {
  47.       digitalWrite (ledpin1,HIGH);
  48.     }
  49.     else
  50.     {
  51.       digitalWrite (ledpin1,LOW);
  52.     }
  53.     if ((datatoreceive[0])==2)
  54.     {
  55.       digitalWrite (ledpin2,HIGH);
  56.     }
  57.     else
  58.     {
  59.       digitalWrite (ledpin2,LOW);
  60.     }
  61.   }
  62. }



Per maggiori info vi allego anche il sito che mi ha aiutato a comprendere meglio come utilizzare questo modulo (in inglese): http://arduino-info.wikispaces.com/Nrf24L01-2.4GHz-HowTo

Per eventuali dubbi lasciate pure un commento qui sotto, sarò molto contento di rispondervi se conoscerò la risposta ;), ciao!
Segui Daniele Alberti su Google+!

42 commenti:

  1. Salve, ho problemi con il trasmettitore ho messo un debug tramite serial.print la funzione radio.write restituisce un valore falso e quindi non trasmette cosa potrebbe essere?

    RispondiElimina
  2. Interessante, hai provato ad usarlo con un attiny84 per miniaturizzare un po' il progetto?

    RispondiElimina
    Risposte
    1. no, purtroppo non so dirti se la libreria è compatibile, fammi sapere!

      Elimina
  3. Nella mia inesperienza (collegato oggi per la prima volta l' nrf24l01 ad arduino) non riesco a capire qual è la potenza di trasmissione radio e il canale che è stato impostato; comunque l'ho montato e funzione perfettamente ma ora vorrei provare a modificare la potenza e il canale di trasmissione.
    Grazie

    RispondiElimina
    Risposte
    1. Ciao Carlo, il canale è questo:
      0xE8E8F0F0E1LL
      la potenza in questo sketch non è modificata. A breve pubblicherò un nuovo post che utilizza una libreria più aggiornata dove si vedono i canali disponibili e il modo di modificare la potenza di trasmissione.
      Ciao

      Elimina
  4. Grazie per la risposta. Il canale in altri esempi lo avevo visto come numero decimale da 0 a 124; questo faccio fatica ad interpretarlo anche come esadecimale.
    Grazie ancora

    RispondiElimina
  5. Salve, sarei interessato a questo sketch in quanto fà al mio caso, ma quando compilo il tutto mi compare il seguente errore. Le librerie sono state scaricate e installate. Questo accade sia con lo sketch master e anche con lo slave

    Arduino:1.6.12 (Windows 7), Scheda:"Arduino/Genuino Uno"
    Ricevitore:19: error: redefinition of 'const uint64_t pipe'
    const uint64_t pipe = 0xE8E8F0F0E1LL; // Definisce il canale di trasmissione
    ^
    C:\Users\---\Desktop\Trasmettitore\Trasmettitore.ino:19:16: note: 'const uint64_t pipe' previously defined here
    const uint64_t pipe = 0xE8E8F0F0E1LL; // Definisce il canale di trasmissione
    ^
    Ricevitore:20: error: redefinition of 'RF24 radio'
    RF24 radio(CE_PIN, CSN_PIN); // Stabilisce la comunicazione
    ^
    C:\Users\---\Desktop\Trasmettitore\Trasmettitore.ino:20:6: note: 'RF24 radio' previously declared here
    RF24 radio(CE_PIN, CSN_PIN); // Stabilisce la comunicazione
    ^
    C:\Users\---\Desktop\Trasmettitore\Ricevitore.ino: In function 'void setup()':
    Ricevitore:24: error: redefinition of 'void setup()'
    void setup()
    ^
    C:\Users\---\Desktop\Trasmettitore\Trasmettitore.ino:26:6: note: 'void setup()' previously defined here
    void setup()
    ^
    C:\Users\---\Desktop\Trasmettitore\Ricevitore.ino: In function 'void loop()':
    Ricevitore:33: error: redefinition of 'void loop()'
    void loop()
    ^
    C:\Users\---\Desktop\Trasmettitore\Trasmettitore.ino:33:6: note: 'void loop()' previously defined here
    void loop()
    ^
    exit status 1
    redefinition of 'const uint64_t pipe'

    RispondiElimina
  6. Sembra come se tu abbia ripetutto parte del testo facendo copia incolla. Controlla bene.

    RispondiElimina
    Risposte
    1. ho controllato, il copia e incolla del codice ed è identico, nessuna anomalia, quando clicco su VERIFICA mi seleziona di rosso la seguente riga
      const uint64_t pipe = 0xE8E8F0F0E1LL; // Definisce il canale di trasmissione. Sia con la parte ricevitore che trasmettitore. Ho provato ad aprire un esempio e ho notato che le librerie sono racchiuse tra le virgolette anziche tra il maggiore e minore <> ma anche cambiando i simboli da lo stesso errore. altri consigli?

      Elimina
    2. Ciao, prova con questa libreria:
      github.com/tmrh20/RF24/
      Fammi sapere, ciao!

      Elimina
    3. chiedo profondamente scusa se ho fatto perdere del tempo, ma posto comunque la soluzione per descrivere da cosa era causato il problema. Le librerie funzionano entrambe, l'errore era dovuto al fatto che io da bravo pirla ho creato un file .ino contenente 2 schede (trasmettitore e ricevitore) come diceva giustamente "lezioni live" nella sua risposta, l'IDE vedeva una sorta di doppio copia e incolla. Ho creato il TX in un file .ino a parte, e l'RX nell'altro. Lo sketch ora viene caricato correttamente senza errori.

      Nuovo problema:
      Quando verifico lo sketch del ricevitore mi da il seguente errore.

      In function 'void loop()':
      ricevitore:41: error: void value not ignored as it ought to be
      done = radio.read(datatoreceive, sizeof(datatoreceive) );
      ^
      exit status 1
      void value not ignored as it ought to be

      Si illumina la seguente riga di rosso.
      done = radio.read(datatoreceive, sizeof(datatoreceive) );

      Elimina
    4. Ciao, ho provato con la versione 1.6.12 e da errore anche a me, prova con la 1.0.6 (che non mi ha dato errore).
      Potrebbe essere anche una differenza tra librerie perchè sulla 1.0.6 ho quella vecchia (quella nel link di questo post), mentre nella 1.6.12 ho quella che ti ho linkato nel commento precedente.

      Fammi sapere, ciao!

      Elimina
    5. Il caricamento degli sketch è avvenuto con la versione da te indicata 1.0.6 e la libreria RF24. E' già qualcosa anche se questo progetto mi sta facendo dannare ora c'e il problema che i moduli non sono abbastanza alimentati a 3.3V come dice la guida in inglese citata nell'articolo.
      Intanto grazie per l'aiuto e chiarimenti :)

      Elimina
    6. Pongo un altra domanda in quanto anche seguendo altre guide online questi moduli non riesco a farli partire. Ho ricontrollato le connessioni piu volte e sono fatte come indicato, mi chiedo come sia possibile che alcuni riescono a farlo funzionare con connessione diretta (vedendo lo schema di Fritzing) mentre alcune guide dicono che bisogna inserire dei condensatori perche arduino non riesce ad alimentare questi moduli. Gli arduini UNO non sono tutti uguali?

      Elimina
    7. Questa connessione l'ho provata più volte e funziona, aggiungere dei condensatori per stabilizzare la tensione non dovrebbe essere un problemq, anzi.
      Che problema ti da? ti da errori di compilazione?

      Elimina
  7. Salve, vorrei sapere se è possibile, modificando il programma, sostituire i pulsanti con due potenziometri e i led con due servocomandi, vorrei provare a costruire un radiocomando a breve raggio per i miei modellini.
    Sono un neofita anche se un po attempato e se ho scritto una cavolata......grazie per il tempo che vorrai dedicarmi

    RispondiElimina
    Risposte
    1. Ciao Federico, purtroppo non è così semplice perchè questo modulo è abbastanza particolare e richiede un po di prove prima di dire che la cosa funzioni.
      Prossimamente cercherò di pubblicare un post con la tua idea, perchè penso che possa interessare a molti.
      Ciao!

      Elimina
    2. Grazie per la tempestiva risposta, volevo realizzare se possibile un radiocomando con poca portata, vorrei comandare un modello di escavatore, quindi il raggio di azione è di pochi metri, ma avrei bisogno di molti canali, eventualmente anche on/off. Ciao

      Elimina
    3. Ciao Daniele, dimenticavo, eventualmente anche con altri moduli tx rx ma se possibile a basso costo.
      Grazie ancora

      Elimina
  8. Ciao si puo fare una comunicazioni con due arduini che comunicano dati e un terzo arduino che riceve i dati dei due? Grazie

    RispondiElimina
    Risposte
    1. ciao, dai un occhio qua
      http://www.danielealberti.it/2016/11/rete-di-moduli-nrf24l01.html

      Elimina
  9. Ciao Daniele , ho testato i moduli eliminando la parte pulsanti e mandando il segnale del tuo esempio per far accendere e spegnere ogni 5 secondi il led del pin 13 di Arduino. Ma non funziona seppur caricati i programmi senza problemi. Come potrei verificare se gli Arduino stanno trasmettendo e ricevendo? Grazie Alessandro

    RispondiElimina
    Risposte
    1. Fai attenzione che il pin 13 in questo sketch è già stato usato per collegare piedino 5 SCK del modulo

      Elimina
  10. Ciao Daniele , ho testato i moduli eliminando la parte pulsanti e mandando il segnale del tuo esempio per far accendere e spegnere ogni 5 secondi il led del pin 13 di Arduino. Ma non funziona seppur caricati i programmi senza problemi. Come potrei verificare se gli Arduino stanno trasmettendo e ricevendo? Grazie Alessandro

    RispondiElimina
    Risposte
    1. Ci sono vari esempi di pingback per testare la comunicazione tra due moduli. Se no puoi anche guardare direttamente le librerie di mysensors che sono molto comode per gestire sensori e attuatori

      Elimina
  11. come uno sproveduto ho usato il pin 13, non so a cosa stavo pensando.
    ora ho inserito un led al 7 ma non funziona nulla, secondo te ho bruciato il modulo?

    RispondiElimina
    Risposte
    1. non credo che tu l'abbia bruciato, per sicurezza prova a replicare esattamente il progetto nel tutorial, in modo da essere sicuro che non ci siano altri errori. Ciao!

      Elimina
  12. Ciao Daniele, ho testato il tuo progetto utilizzando, al posto dei pulsanti e dei led, la sonda di temperatura DS18B20. Il tutto funziona perfettamente. I tuoi progetti sono un sicuro riferimento per chi, come il sottoscritto, cerca di imparare anche dall'esperienza altrui.
    A questo proposito, mi piacerebbe capire come si fa a definire l'indirizzo dei canali di trasmissione/ricezione.
    Grazie in anticipo

    RispondiElimina
    Risposte
    1. Ciao grazie mille!
      l'indirizzo è definito nella riga 22, è il codice esadecimale E8E8F0F0E1LL. Ciao!

      Elimina
    2. Grazie per la risposta, ma non riesco a capire come si faccia a definire il codice per ogni singolo modulo. In altre parole, in base a quali criteri viene stabilito il codice per il canale di ricetrasmissione?
      In altri esempi vengono riportati numeri decimali, tipo : canale 90, canale 10 etc.
      Grazie e scusa per la mia scarsa competenza.Ciao

      Elimina
  13. Vorrei aggiugere alcune considerazioni sull'utilizzo di questo modulo: attenzione ad utilizzare l'uscita 3.3v perchè sembra essere stabile solo sugli arduino originali, mentre sugli altri cloni è necessario un condensatore da 47 uF (o maggiore) per stabilizzare la tensione durante la trasmissione che richiede ben più dei 12mA, se no la trasmissione non funziona (esistono anche dei regolatori di tensione specifici per questo modulo su gearbest). Il range di funzionamento indoor è alla meglio di 10 metri, ma più realisticamente sono massimo 6-7 che però si possono aumentare usando il modulo con amplificatore e antenna esterna o saldando un dipolo al posto dell'antenna stampata sul PCB (ci sono tutorial su internet). Purtropo anche negli NFR24L01 ci sono una miriade di cloni che possono funzionare bene come anche dare problemi (se avete pagato meno di 2€ per modulo è facilmente un clone); in generale vanno evitati i moduli che invece del chip in vista hanno la goccia di resina che lo nasconde, perchè spesso e volentieri danno problemi o non funzionano

    RispondiElimina
  14. Salve, nel ricevente ho un problema, mi da questo errore:" In function 'void loop()':
    riceventeeeee:42: error: void value not ignored as it ought to be
    void value not ignored as it ought to be", e mi evidenzia la riga 48 done = radio.read( datatoreceive, sizeof(datatoreceive) );
    Grazie in anticipo!! Una buona giornata Samuele

    RispondiElimina
    Risposte
    1. Ho risolto mettendo l'ide 1.0.6! Grazie lo stesso. saluti

      Elimina
  15. Ciao,
    sono riuscito a caricare I due esempi (Tx su un Arduino Nano e RX su un Arduino Uno) ma non succeed nulla.
    Mi spiego meglio:

    pigio I tasti dal Tx e non si accende nessun Led in Rx
    Ho provato anche a mettere una println per capire se sentiva il pigiamento del tasto ma non esce nulla (ho messo addirittura la println nel loop prima del controllo del pigiamento, in modo che ad ogni ciclo dovrebbe uscire una stampa, ma non stampa nemmeno quello).
    NOn capisco cosa stia succedendo...

    RispondiElimina
  16. Chiedo scusa,
    ieri avevo dei problem con la seriale.
    Ora vedo che sente il pigiamento dei bottone, anche se non capisco come mai, se io non pigio nulla, continua a rilevare il pigiamento del tasto 2.
    A parte questo, il ricevitore non riceve nulla.
    Puo' essere, come ho letto in un comment, che usando un Nano e un Uno non originali, debba aggiungere un condensatore sul trasmettitore?

    Grazie

    RispondiElimina
    Risposte
    1. Ciao, il tasto 1 lo vedi premuto o funziona? verifica i collegamenti e l'orientamento del tasto.

      Elimina
    2. Ciao,
      ho scoperto che il problema era dovuto a un tasto con i piedini leggermente storti e che quindi non facevano contatto.
      Grazie mille

      Ora devo "soli" trovare il modo di ridurre il consumo a meno di 1mA e svegliarlo a interrupt o timer

      Elimina
  17. Ciao, ma per usarlo come ricetrasmettitore nello stesso momento (ad esempio per fare le stesse cose con entrambi gli Arduino ) basta copiare i codici sia del trasmettitore che del ricevitore su entrambe le schede?
    Grazie in anticipo per la risposta.

    RispondiElimina
  18. ciao i miei due led non danno segni di vita premendo i pulsanti, i codici sia sul trasmittente che sul ricevitore sono andati a buon fine. Invece di usare i moduli nell'esempio, uso quelli con le antenne che in realtà dovrebbero essere uguale nell'hardware del collegamento (non quello per ricevere e trasmettere) e anche di software. Ora la prima cosa che noto è che si scaldano veramente tanto ma non danno segni di cortocircuito come puzza o fumo, ma semplicemente caldo.
    Quindi ti chiedo se questo codice è compatibile con questi moduli.
    Ti lascio il link dal sito dove li ho comprati in tal modo da vedere le immagini:
    https://www.banggood.com/it/3Pcs-1100-Meter-Long-Distance-NRF24L01PALNA-Wireless-Module-With-Antenna-p-1066640.html?rmmds=search

    P.s. grazie per la risposta (=

    RispondiElimina
  19. Buongiono Daniele,
    Ho realizzato il piccolo robot autobilanciato di cui ti allego il link. Purtroppo esso monta una scheda wireless che non ho. Disponendo invece di diverse schede RF24L01 volevo chiederti se fosse possibile la sostituzione della schedina originale con una di queste. Purtroppo sono inesperto e vedo che le piedinature sono completamente differenti. Ho solo rispettato l'alimentazione a 3.3V disponendo di una scheda Arduino Nano. Mentre invece per quanto riguarda la trasmissione non capisco tra TX/RX e MOSI/MISO etc.
    Mi puoi aiutare?
    Grazie per l'eventuale risposta
    Questo il link: http://www.brokking.net/yabr_main.html

    RispondiElimina
  20. Buongiorno e complimenti per la chiarezza dell'esposizione.

    Purtroppo ho gli stessi problemi di Alessandro G e Polito nella compilazione del programma per la ricevente, ciò nonostante abbia sostituito la versione di Arduino più recente con la 1.0.6 come consigliato.

    Dove sbaglio? Installando la versione precedente il programma mi ha disinstallato automaticamente quella più recente. Devo fare altro?

    Grazie in anticipo per un'eventuale risposta e aiuto.

    Enrico

    RispondiElimina
  21. Buongiorno e complimenti per la chiarezza dell'esposizione.

    Purtroppo ho gli stessi problemi di Alessandro G e Polito nella compilazione del programma per la ricevente, ciò nonostante abbia sostituito la versione di Arduino più recente con la 1.0.6 come consigliato.

    Dove sbaglio? Installando la versione precedente il programma mi ha disinstallato automaticamente quella più recente. Devo fare altro?

    Grazie in anticipo per un'eventuale risposta e aiuto.

    Enrico

    RispondiElimina

Lascia un commento qui sotto, ti risponderò il prima possibile!

Related Posts Plugin for WordPress, Blogger...