Metodi per la comunicazione wireless tra arduini

Buongiorno a tutti,
sto svolgendo un progetto nel quale è necessaria la comunicazione wireless tra più arduini; qualche mese fa avevo iniziato a lavorare con i moduli nrf24l01 in quanto erano abbastanza economici. Il problema che ho riscontrato con questi moduli è la "affidabilità", nel senso che capita spesso che invio messaggi ma non vengono ricevuti. Dato che ho necessità di qualcosa molto più affidabile stavo pensando a delle alternative anche, magari, con costo più elevato....
Nel progetto, è presente un telecomando con un arduino che deve inviare messaggi con altri 4 o più arduini questi, dopo la ricezione di un pacchetto, dovranno eseguire un comando e al termine di esso dovranno inviare un feedback al telecomando. Riguardo alla portata non ho grandi necessità, 20/30 metri dovrebbero essere sufficienti.
Quali moduli potrebbero essere ideali per questa applicazione? Bluetooth o radio? grazie.

:warning:
Ti segnalo che, nella sezione in lingua Inglese, si può scrivere SOLO in Inglese ... quindi, per favore, la prossima volta presta più attenzione in quale sezione metti i tuoi post; questa volta esso è stato spostato, da un moderatore della sezione di lingua Inglese, nella sezione di lingua Italiana ... la prossima volta potrebbe venire direttamente eliminato. Grazie.

P.S.: Evitate di utilizzare la traduzione automatica fatta dal browser ... vi impedisce di capire la lingua della sezione dove andate a scrivere ...

1 Like

Mah ... perdere pacchetti può sempre capitare sia con gli nrf24l01 che con altri moduli ...

... se è veramete fondamentale non perdere dati, allora occorre implementare nel proprio software un "protocoll"o che preveda l'invio con numero di sequenza, l'accusa di ricezione, un controllo CRC sul contenuto, un sistema di timeout, un sistema per il rinviio di pacchetti non ricevuti, ecc. ecc.

Guglielmo

Altrimenti usa il WiFi ed il TCP/IP che già integra nel protocollo tutti i controlli del caso e le eventuali ritrasmissioni :wink:

Guglielmo

io ho trovato moduli xbee, non dovrebbero essere meglio?
come si fa a fare tutto quello che mi hai consigliato? sono ancora alla prime armi e sinceramente non saprei dove mettere mano :sweat_smile:

i moduli wifi non so come funzionano ma credo che dovrei collegare tutti gli arduini ad una stessa rete wifi, questa cosa mi è abbastanza difficile dato che potrebbe cambiare spesso il luogo in cui uso il progetto e potrebbe anche non esserci una rete wifi. Magari mi sto sbagliando, scusa ma sono ignorante in materia :sweat:

Un modulo ESP32, che ha un costo ridicolo, può fare da AP (access point) e creare quindi la rete WiFi per gli altri Arduino.

Consiglio gli ESP32 anche per tutti gli altri che devi usare ... integrano di base il WiFi, sono affidabili, costano poco, hanno un bel po' di memoria flash e di SRAM ... che vuoi di più?

... purtoppo, se non ti metti a studiare ... difficilmente potrai risolvere il problema. Noi possiamo consigliarti, ma le problematiche devi affrontarle tu e ... senza lo studio ... si fa un po' poco :roll_eyes:

Guglielmo

Ho provato a dare un' occhiata ai moduli esp32 nel web ed ho scoperto che è un mondo vastissimo, si possono fare mille cose ma bisognerebbe studiare molto in materia e al momento non ho né tempo né le competenze per provare a capirci qualcosa. A questo punto credo che la soluzione migliore sia migliorare il codice che ho, come mi consigliavi all' inizio. Da cosa mi consigli iniziare?
Io per il mio progetto sto usando la libraria <RF24Network.h> e con questa non ho mai trovato niente sul come gestire gli errori o come segnalare pacchetti perduti ed eventualmente inviarli di nuovo

Per un'applicazione del genere io andrei con una rete mesh per estendere quanto si vuole la portata.

Prova a dare un'occhiata a questa comoda libreria che ne semplifica l'uso in ambiente Arduino

Potrebbe essere un valida alternativa ma anche qui dovrei usare i moduli WiFi che sono nuovi per me. Per quanto sia semplificata ho dato un' occhiata alla libreria ma non ho capito un granché, penso che migliorare il codice sulla libreria <RF24Network.h> sia la strada migliore per le mie capacità ed esigenze. Solo che non so se è fattibile perché non ho ancora trovato niente per il recupero degli errori . Qualcuno sa se esiste qualcosa del genere per la mia libreria?

Ad ogni modo anche con i moduli nRF24L01+ è possibile realizzare una rete mesh per aumentare la portata della rete stessa.

Per quanto riguarda gli errori in trasmissione, il modulo è capace di gestirli da se perché ogni pacchetto di dati inviato contiene uno o due byte CRC, quindi in caso di errore il pacchetto dati viene scartato.

E' un po che non uso questi moduli però ricordo molto bene che è possibile abilitare la funzionalità "Automatic packet transaction handling" (che trovi dettagliatamente spiegata nel datasheet).

In pratica il modulo che riceve il pacchetto dati, invia in modo automatico un ACK packet (Acknowledgement packet) per informare il nodo che sta trasmettendo di aver correttamente ricevuto i dati trasmessi.
Tutto questo viene gestito direttamente a livello hardware e nel tuo codice dovresti in pratica solo abilitarlo.

Ora, io non conosco molto bene la libreria che stai usando e di fatto non l'ho mai usata, ma guardando al volo la documentazione online la scelta di usare o meno questa funzione dipende dal type della classe RF24NetworkHeader che di default è uguale a 0 e dalla descrizione non si capisce se è abilitata o meno (si fa riferimento ai valori 1-64 per il no, 65-127 per il si)

Questa è l'istruzione che c'è nell'esempio:

    RF24NetworkHeader header(/*to node*/ other_node);
    bool ok = network.write(header, &dataBuffer, sizeofSend++);

che dovrebbe quindi diventare

    RF24NetworkHeader header(/*to node*/ other_node, 65);
    bool ok = network.write(header, &dataBuffer, sizeofSend++);

Prova a sperimentare con queste funzionalità dell'nRF24 e vedi se la situazione migliora.
Io mi aspetterei che in caso di mancato ACK da parte del ricevente la variabile bool ok risulti false e quindi a quel punto potresti provare a gestire la situazione magari provando a inviare nuovamente.

Oppure, se i messaggi sono brevi, per ogni valore o carattere invii un numero di parità che ti permette, in ricezione, di verificare se quanto ricevuto è corretto.

Se leggi tutto il therad vedi che il suo problema principale NON è sapere se quello che ha ricevuto è corretto, ma ... che NON riceve proprio alcuni pacchetti :roll_eyes:

La soluzione l'ho spiegata la post #3 ... ma sembra che l'OP non sia in grado di implementrala.

Guglielmo

la variabile ok non la avevo mai considerata. Adesso ho fatto uno sketch che invia dati di continuo e dopo averli inviati stampo nel seriale la variabile ok. Ho notato che quando la ricevente riceve nel seriale scrive 1 mentre quando non riceve, scrive 0. Credo sia questo ciò che intendevi (fammi sapere se ho capito bene che non son sicuro), ho ottenuto questo risultato semplicemente scrivendo questo:

RF24NetworkHeader header(node01); 
 bool ok = network.write(header, &datodainviare, sizeof(datodainviare));
 Serial.println(ok);

e senza integrare questa scrittura

A questo punto (se ho capito bene) dovrei fare un codice che dice che se ok è uguale a 0 devo inviare di nuovo il messaggio, così fino a che ok diventa uguale a 1. In questo modo credo che lo sketch diventi più affidabile perchè non faccio più un unico tentativo di trasmissione di un messaggio ma, se non viene ricevuto lo invio per un numero n di volte.
Fammi sapere se il ragionamento può avere senso

Quindi significa che con type == 0 (valore di default) la funzionalità "Automatic packet transaction handling" è attiva.

Esatto era proprio questo che intendevo. Io eviterei solo di fare questa cosa all'infinito perché altrimenti inserisci un dead-loop nel tuo codice nel caso in cui il nodo ricevente sia effettivamente irraggiungibile.

Perfetto grazie. Adesso però mi è venuto un dubbio di un eventuale problema che potrebbe verificarsi; provo a spiegarmi..

Il telecomando invia un messaggio, il ricevitore lo riceve ed esegue il comando legato a quel messaggio.
Potrebbe verificarsi che quando il ricevitore trasmette il messaggio di "eseguita trasmissione" al telecomando qualcosa va storto e il telecomando, non ricevendo niente, lascia il valore della variabile ok a 0.
A questo punto invia di nuovo lo stesso messaggio e il ricevitore esegue di nuovo il comando e la variabile ok cambia valore diventando 1.
A questo punto sembra essere andato tutto bene ma è stato eseguito due volte lo stesso comando senza nessun allarme. non so se mi sono spiegato :sweat_smile:
é un problema che potrebbe verifcarsi?

Si certo è un'eventualità plausibile per quanto remota.
Ma non vedo come possa creare problemi: basta che fai in modo che i comandi siano espliciti in modo tale che se anche venissero ricevuti due volte non cambiano lo stato del ricevente (la seconda volta).

va bene grazie mille, adesso vedo come riesco a implementare il codice al meglio

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.