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+!

24 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
  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
  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

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

Related Posts Plugin for WordPress, Blogger...