Go Down

Topic: Sincronizzazione di più Arduino tramite moduli wirelless (Read 590 times) previous topic - next topic

BlackHole900

Allora, io praticamente ora ho un nodo principale che raccoglie le informazioni e gli altri che trasmettono in delle slot temporali  a loro dedicate. Ovvero se la sincronizzazione è perfetta, si svegliano, recuperano informazioni dal server per eliminare offset e poi trasmettono il dato.  Il problema di fondo è l'utilizzo sia di millis e sia dell'RTC.   

Purtroppo l'RTC ds3231 non conta i millisecondi passati,ed è un bel problema. E' presente un'uscita a 32Khz sull'RTC ma non so come utilizzarla sinceramente, qualcuno di voi ha un'idea? Leggevo in rete la possibilità di contare i millisecondi grazie ad interrupt ma, credo che questo rallenterebbe il programma. Un'altro metodo sarebbe quello di rendere accurato il timer0 di Arduino, ma anche in questo caso non trovo neanche un esempio in giro da cui posso studiare.

Standardoil

#16
May 27, 2018, 11:21 am Last Edit: May 27, 2018, 11:26 am by Standardoil
Scusa, ho capito male io?
il satellite si sveglia
contatta il server per sapere come correggere l'orario
corrregge l'orario
trasmette
e torna a nanna?
e quale sarebbe il problema?
EDITO ah, s', ovvio, capito adesso, SE la sincronizzazione è perfetta
pero' non mi è chiara la dinamica, scusami
ma ogni quanto trasmetteresti?
quante macchine, che dati trasmetti, un idea generale di cosa vuoi fare, sarebbero utili per capire
cosè? un termometro distribuito, un antifurto...
Prima legge di Nelson (che sono io):
A parità di risultato
maggiore è il pensiero,
minore il lavoro.
Quindi prima di fare pensa!

BlackHole900

#17
May 27, 2018, 11:36 am Last Edit: May 27, 2018, 12:35 pm by BlackHole900
Il nodo centrale collegato al pc esegue sempre lo stesso ciclo ogni 4 secondi e di questi 4 secondi, utilizza 1 secondo per inviare in BROADCAST informazioni riguardo il tempo passato dall'inizio dei 4 secondi e il valore dell'RTC. Il client quando si attiva preleva questi dati e corregge gli errori. Passato questo secondo invia i dati e aspetta un  ack. Il problema è quel secondo, purtroppo  è necessario. Però potrei ridurre gli errori se solo ci fosse un modo per contare i millisecondi dell'RTC.

Le informazioni le invio in broadcast perchè in questa maniera posso permettere la sincronizzazione di altri nodi che posso aggiungere durante il funzionamento della rete.
Quindi supponiamo che ci siano 10 nodi già sincronizzati. Quando uno si sveglia corregge l'offset, trasmette ed esegue altre operazioni per un intervallo di 4 secondi, poi dorme  per un tempo pari al numero dei nodi della rete moltiplicato per l'intervallo utilizzato(4 secondi nel mio caso).
 
Comunque lasciamo stare cosa invio, ma più che altro è il problema della sincronizzazione.Che si mantiene, ma dovrebbe essere migliorato. Comunque appena lo finirò posterò anche il mio progetto, per ora c'è tanto da sistemare.



Standardoil

Il client quando si attiva preleva questi dati e corregge gli errori.
che cosa vuol dire questa frase?
se il client non è li ad ascoltare, ma si deve ancora svegliare, quello informazioni, dove sono rimaste?
cioè:
il master trasmette, delle due l'una
o il satellite è acceso, riceve e fa quello che deve
oppure è spento, lui e la sua radio, quelle info sono perse
o amgari vuoi dire che il master trasmette ogni 4 secondi e il client, 'solo se acceso' effettua la correzzione?
ma in questo caso devi essere sicuro che il client sia già acceso al momento che il master trasmette
cosa fai, lo fai svegliare un paio di secondi prima del previsto?
no, inutile, non mi è chiaro che problema hai e che dinamica usi
se metti il programma ne posso uscire....
Prima legge di Nelson (che sono io):
A parità di risultato
maggiore è il pensiero,
minore il lavoro.
Quindi prima di fare pensa!

Standardoil

Scusa, piu' ti leggo e ti rileggo e meno capisco
tu usi degli RTC che hanno accuratezza di 2 parti per milione
e hai difficoltà di timing?
scusa, ma non ci credo, con accuratezza di due parti per milione e slot time di 4 secondi tu potresti avere dei problemi non prima di un milione di secondi (che fa' un errore atteso di 2 secondi, mezzo slot time)
un milione di secondi sono un fracco di tempo, circa 11 giorni
Non è ancora passato abbastanza tempo da quando hai cominciato per aver visto questi problemi, siamo al 27 maggio e non credo che tu abbia cominciato con gli RTC molto tempo fa
faccio delle libere ipotesi e poi mi fermo, visto che senza dettagli da parte tua non si va molto avanti
1) tu ti affidi per la riaccensione dei satelliti solo sul watchdog, e questo potrebbe essere non preciso
2) tu non verifichi mai la correttezza dei tempi dei vari satelliti e lasci che tra watchdog e tempi tecnici vari lentamente escano fuori passo
secondo me quello che vuoi fare si fa tranquillamente senza alcun RTC, e ti è già stato detto come
io farei così, senza alcun RTC
divido il tempo di trasmissione in slot-time di 4 secondi
faccio svegliare da watch dog il satellite di turno (tra poco vedi come)
il satellite aspetta la trasmissione da parte del centrale
il centrale trasmette al secondo 2 del time slot
alla ricezione il satellite ri-regola i suoi tempi (memorizza millis, ad esempio)
il satellite trasmette quello che deve trasmettere nel secondo 3 (ovvero mille millisecondi dopo la ricezione)
il satellite fa quello che deve
al termine dei suoi compiti il satellite calcola il tempo di sleep che gli serve per svegliarsi circa un secondo prima della prossima trasmissione a lui destinata,
se sbaglia in più, ovvero dorme troppo, ha un secondo di margine
se sbaglia in meno, ovvero dorme troppo poco, nulla di grave, aspetta la trasmissione un pochino di più, ma tanto ripete i calcoli ad ogni ciclo
naturalmente il master ripete un ciclo di 4 secondi, al secondo 2 trasmette e si aspetta una ricezione al secondo 3
se calcoli in maniera analitica i massimi errori del master e del satellite puoi regolare i tempi in maniera da avere anche più di un secondo di margine se per caso il satellite si "sveglia tardi"
se oltretutto usi degli rtc con un pin di sveglia, come quelli che usi, puoi, prima di andare a mandare a dormire il sattellite, ri-calcolare il wake up time sul valore attuale ottenuto dal timing delle trasmissioni, in questa maniera nemmeno ti affidi al watch dog, che non è precisissimo
ma comunque, in ogni caso, se l'errore massimo atteso sommando l'errore del master e quello del satellite è minore della fascia di sicurezza che gli lasci, sei sicuro che si ri-sincronizzano ad ogni trasmissione
Prima legge di Nelson (che sono io):
A parità di risultato
maggiore è il pensiero,
minore il lavoro.
Quindi prima di fare pensa!

Standardoil

poi, non mi ornano due conti
tu dici che il master occupa il primo secondo a trasmettere " in BROADCAST informazioni riguardo il tempo passato dall'inizio dei 4 secondi e il valore dell'RTC" (dal post 17)
ostia, a 9600 bps un secondo significa qualcosa come 1000 byte trasmessi (grosso modo), anche contando il mezzo secondo che ci mettono gli HC12 a cominciare la trasmissione a partire del modo di minimo consumo (ammettendo che tu tenga sempre nel modo di minimo consumo, e non li mandi semplicemente in sleep quando servono)
dicevo, anche contando quel mezzo secono, ti avanza comunque tempo per trasmettere 500 byte,
secondo me basta trasmettere 4 byte con minuto e secondo in chiaro, nemmeno in decimale ma in ascii, e con 4 millisecondi te la sei cavata, boh, non mi è chiaro
inoltre al post 4 dici due cose "strane"
1) devi avvisare il nodo centrale che il nodo periferico si è svegliato: il nodo centrale lo sa automaticamente appena riceve la trasmissione dei dati, non serve avvisarlo
2) hai necessita che i pacchetti vadano a destinazione senza interferenze e non te la senti ti toccare la libreria: OK, capisco e condivido, ma sorella della libreria che usi c'è la RH_reliabledatagram (o un nome del genere) che fa da lei quello che ti serve, senza bisogno di toccare nulla
io quelle librerie non le ho mai usate, mi sono divertito di più a farlo da me, ma se ci sono e ti tornano comode.... oltretutto che ne sta già usando alcune
Prima legge di Nelson (che sono io):
A parità di risultato
maggiore è il pensiero,
minore il lavoro.
Quindi prima di fare pensa!

Go Up