- Conoscere il modulo RF nRF24L01
- Interfacciamento nRF24L01 con Arduino
- Lato ricevitore: connessioni modulo Arduino Uno nRF24L01
- Lato trasmettitore: Collegamenti modulo Arduino Nano nRF24L01
- Lavorare con nRF24L01 + modulo ricetrasmettitore wireless
- Programmazione nRF24L01 per Arduino
- Controllo del servomotore utilizzando nRF24L01 in modalità wireless
Mentre Internet delle cose (IoT), Industria 4.0, comunicazione da macchina a macchina ecc. Stanno diventando sempre più popolari, la necessità di comunicazioni wireless è diventata fondamentale, con più macchine / dispositivi che parlano tra loro sul cloud. I progettisti utilizzano molti sistemi di comunicazione wireless come Bluetooth Low Energy (BLE 4.0), Zigbee, moduli Wi-Fi ESP43, moduli RF 433 MHz, Lora, nRF ecc. E la selezione del supporto dipende dal tipo di applicazione in cui viene utilizzato.
Tra tutti, un popolare mezzo wireless per la comunicazione di rete locale è il nRF24L01. Questi moduli funzionano su 2,4 GHz (banda ISM) con velocità di trasmissione da 250 Kbps a 2 Mbps che è legale in molti paesi e può essere utilizzata in applicazioni industriali e mediche. Si afferma inoltre che con antenne adeguate questi moduli possono trasmettere e ricevere fino a una distanza di 100 metri tra di loro. Interessante vero !!? Quindi, in questo tutorial impareremo di più su questi moduli nRF24l01 e su come interfacciarli con una piattaforma microcontrollore come Arduino. Condivideremo anche alcune soluzioni per i problemi comunemente affrontati durante l'utilizzo di questo modulo.
Conoscere il modulo RF nRF24L01
I moduli nRF24L01 sono moduli ricetrasmettitori, il che significa che ogni modulo può sia inviare che ricevere dati ma poiché sono half-duplex possono inviare o ricevere dati contemporaneamente. Il modulo ha l'IC generico nRF24L01 dei semiconduttori nordici che è responsabile della trasmissione e della ricezione dei dati. L'IC comunica utilizzando il protocollo SPI e quindi può essere facilmente interfacciato con qualsiasi microcontrollore. Diventa molto più semplice con Arduino poiché le librerie sono prontamente disponibili. Le pinouts di un modulo standard nRF24L01 seguito riportiamo
Il modulo ha una tensione operativa da 1,9 V a 3,6 V (tipicamente 3,3 V) e consuma molta meno corrente di soli 12 mA durante il normale funzionamento, il che lo rende efficiente dalla batteria e quindi può anche funzionare con celle a bottone. Anche se la tensione operativa è di 3,3 V, la maggior parte dei pin tollerano i 5 V e quindi possono essere interfacciati direttamente con microcontrollori da 5 V come Arduino. Un altro vantaggio dell'utilizzo di questi moduli è che ogni modulo ha 6 pipeline. Ciò significa che ogni modulo può comunicare con altri 6 moduli per trasmettere o ricevere dati. Ciò rende il modulo adatto per la creazione di reti a stella o mesh nelle applicazioni IoT. Inoltre hanno una vasta gamma di indirizzi di 125 ID univoci, quindi in un'area chiusa possiamo utilizzare 125 di questi moduli senza interferire tra loro.
Interfacciamento nRF24L01 con Arduino
In questo tutorial impareremo come interfacciare il nRF24L01 con Arduino controllando il servomotore collegato ad un Arduino variando il potenziometro sull'altro Arduino. Per semplicità abbiamo utilizzato un modulo nRF24L01 come trasmettitore e l'altro come ricevitore, ma ogni modulo può essere programmato per inviare e ricevere dati individualmente.
Di seguito è mostrato lo schema del circuito per collegare il modulo nRF24L01 con Arduino. Per varietà, ho usato UNO per il lato ricevitore e Nano per il lato trasmettitore. Ma la logica per la connessione rimane la stessa anche per altre schede Arduino come mini, mega.
Lato ricevitore: connessioni modulo Arduino Uno nRF24L01
Come detto in precedenza, nRF24L01 comunica con l'aiuto del protocollo SPI. Su Arduino Nano e UNO i pin 11, 12 e 13 sono usati per la comunicazione SPI. Quindi colleghiamo i pin MOSI, MISO e SCK da nRF ai pin 11, 12 e 13 rispettivamente. I pin CE e CS sono configurabili dall'utente, ho usato i pin 7 e 8 qui, ma è possibile utilizzare qualsiasi pin modificando il programma. Il modulo nRF è alimentato dal pin 3.3V su Arduino, che nella maggior parte dei casi funzionerà. In caso contrario, è possibile provare un alimentatore separato. Oltre ad interfacciare l'nRF ho anche collegato un servomotore al pin 7 e alimentato tramite il pin 5V su Arduino. Allo stesso modo il circuito del trasmettitore è mostrato di seguito.
Lato trasmettitore: Collegamenti modulo Arduino Nano nRF24L01
Anche le connessioni per il trasmettitore sono le stesse, inoltre ho usato un potenziometro collegato attraverso il pin 5V e Ground di Arduino. La tensione analogica in uscita che varierà da 0-5V è collegata al pin A7 del Nano. Entrambe le schede sono alimentate tramite la porta USB.
Lavorare con nRF24L01 + modulo ricetrasmettitore wireless
Tuttavia, per far funzionare il nostro nRF24L01 senza rumore, potremmo considerare le seguenti cose. Ho lavorato a lungo su questo nRF24L01 + e ho imparato i seguenti punti che possono aiutarti a non essere colpito da un muro. Puoi provarli quando i moduli non funzionavano normalmente.
1. La maggior parte dei moduli nRF24L01 + sul mercato sono falsi. Quelli economici che possiamo trovare su Ebay e Amazon sono i peggiori (non preoccuparti, con pochi ritocchi possiamo farli funzionare)
2. Il problema principale è l'alimentatore, non il codice. La maggior parte dei codici online funzionerà correttamente, io stesso ho un codice funzionante che ho testato personalmente, fammi sapere se ne hai bisogno.
3. Prestare attenzione perché i moduli stampati come NRF24L01 + sono in realtà Si24Ri (Sì, un prodotto cinese).
4. I moduli clone e fake consumeranno più energia, quindi non sviluppare il circuito di alimentazione in base alla scheda tecnica nRF24L01 +, perché Si24Ri avrà un elevato consumo di corrente di circa 250mA.
5. Fare attenzione alle ondulazioni di tensione e ai picchi di corrente, questi moduli sono molto sensibili e potrebbero facilmente bruciarsi. (;-(2 moduli fritti finora)
6. L'aggiunta di un paio di condensatori (10uF e 0.1uF) tra Vcc e Gnd del modulo aiuta a rendere pura l'alimentazione e questo funziona per la maggior parte dei moduli.
Tuttavia, se hai problemi segnala nella sezione commenti o leggi questo, o fai le tue domande sul nostro forum.
Controlla anche il nostro precedente progetto sulla creazione di una chat room utilizzando nRF24L01.
Programmazione nRF24L01 per Arduino
È stato molto facile usare questi moduli con Arduino, grazie alla libreria prontamente disponibile creata da maniacbug su GitHub. Fare clic sul collegamento per scaricare la libreria come cartella ZIP e aggiungerla al proprio IDE Arduino utilizzando l' opzione Schizzo -> Includi libreria -> Aggiungi libreria.ZIP . Dopo aver aggiunto la libreria possiamo iniziare a programmare per il progetto. Dobbiamo scrivere due programmi, uno per il lato trasmettitore e l'altro per il lato ricevitore. Tuttavia, come ho detto prima, ogni modulo può funzionare sia come trasmettitore che come ricevitore. Entrambi i programmi sono riportati alla fine di questa pagina, nel codice del trasmettitore l'opzione del ricevitore sarà commentata e nel programma del ricevitore il codice del trasmettitore sarà commentato. Puoi usarlo se stai provando un progetto in cui il modulo deve funzionare come entrambi. Di seguito viene spiegato il funzionamento del programma.
Come tutti i programmi, iniziamo includendo i file di intestazione. Poiché nRF utilizza il protocollo SPI, abbiamo incluso l'intestazione SPI e anche la libreria che abbiamo appena scaricato. La libreria servo viene utilizzata per controllare il servomotore.
#includere
La riga successiva è la riga importante in cui istruiamo la libreria sui pin CE e CS. Nel nostro schema circuitale abbiamo collegato CE al pin 7 e CS al pin 8, quindi abbiamo impostato la linea come
RF24 myRadio (7, 8);
Tutte le variabili associate alla libreria RF devono essere dichiarate come una struttura di variabili composite. In questo programma la variabile msg viene utilizzata per inviare e ricevere dati dal modulo RF.
pacchetto struct { int msg; }; typedef struct pacchetto Pacchetto; Dati sulla confezione;
Ogni modulo RF ha un indirizzo univoco tramite il quale può inviare dati al rispettivo dispositivo. Poiché qui abbiamo solo una coppia, impostiamo l'indirizzo a zero sia nel trasmettitore che nel ricevitore, ma se hai più moduli puoi impostare l'ID su una stringa univoca di 6 cifre.
indirizzi byte = {"0"};
Successivamente, all'interno della funzione di configurazione del vuoto , inizializziamo il modulo RF e lo impostiamo per funzionare con la banda 115 che è priva di rumore e impostiamo anche il modulo per funzionare in modalità di consumo energetico minimo con velocità minima di 250 Kbps.
void setup () { Serial.begin (9600); myRadio.begin (); myRadio.setChannel (115); // 115 bande sopra i segnali WIFI myRadio.setPALevel (RF24_PA_MIN); // MIN power low rage myRadio.setDataRate (RF24_250KBPS); // Velocità minima myservo.attach (6); Serial.print ("Setup Initialized"); ritardo (500); }
La funzione void WriteData () scrive i dati passati ad essa. Come detto in precedenza l'nRF ha 6 differenti pipe su cui possiamo leggere o scrivere dati, qui abbiamo usato 0xF0F0F0F066 come indirizzo per scrivere i dati. Sul lato ricevente dobbiamo usare lo stesso indirizzo sulla funzione ReadData () per ricevere i dati che sono stati scritti.
void WriteData () { myRadio.stopListening (); // Interrompi la ricezione e avvia la trasmissione di myRadio.openWritingPipe (0xF0F0F0F066); // Invia i dati su questo indirizzo a 40 bit myRadio.write (& data, sizeof (data)); ritardo (300); }
La funzione void WriteData () legge i dati e li inserisce in una variabile. Anche in questo caso su 6 differenti pipe usando le quali possiamo leggere o scrivere dati qui abbiamo usato 0xF0F0F0F0AA come indirizzo per leggere i dati. Ciò significa che il trasmettitore dell'altro modulo ha scritto qualcosa su questo indirizzo e quindi lo stiamo leggendo dallo stesso.
void ReadData () { myRadio.openReadingPipe (1, 0xF0F0F0F0AA); // Quale pipe leggere, indirizzo a 40 bit myRadio.startListening (); // Stop Transminting and start Reveicing if (myRadio.available ()) { while (myRadio.available ()) { myRadio.read (& data, sizeof (data)); } Serial.println (data.text); } }
Oltre a queste righe, le altre righe nel programma vengono utilizzate per leggere il POT e convertirlo da 0 a 180 utilizzando la funzione map e inviarlo al modulo ricevitore dove controlliamo il servo di conseguenza. Non li ho spiegati riga per riga poiché l'abbiamo già imparato nel nostro tutorial sull'interfacciamento dei servi.
Controllo del servomotore utilizzando nRF24L01 in modalità wireless
Una volta che sei pronto con il programma, carica il codice del trasmettitore e del ricevitore (indicato di seguito) sulle rispettive schede Arduino e accendili con la porta USB. È inoltre possibile avviare il monitor seriale di entrambe le schede per verificare quale valore viene trasmesso e cosa viene ricevuto. Se tutto funziona come previsto quando si ruota la manopola POT sul lato del trasmettitore, anche il servo sull'altro lato dovrebbe ruotare di conseguenza.
Il funzionamento completo del progetto è dimostrato nel video sottostante. È abbastanza normale che questi moduli non funzionino al primo tentativo.Se hai riscontrato problemi, controlla di nuovo il codice e il cablaggio e prova le linee guida per la risoluzione dei problemi sopra indicate. Se non funziona, pubblica il tuo problema sui forum o nella sezione commenti e cercherò di risolverli.