Salve a tutti ragazzi;
Avrei bisogno per esigenze di progetto di far comunicare tra loro più Arduino tramite la software serial. Però vorrei capire come è possibile realizzare un protocollo per cui unire e dividere le varie informazioni proveniente dai vari Arduino.
Puoi averne uno MASTER (... nel senso che dirige il traffico di informazioni) e considerare gli altri SLAVE (... caso più semplice) o ... devono essere tutti indipendenti (... caso più complesso) ???
Guglielmo
All'inizio c'era un master e gli altri slave! E li era semplice perchè univo le informazioni proveniente dai vari slave e li univo in un unica stringa che poi spedivo. Il problema di quella comunicazione era come suddividere poi dall'altra parte una volta ricevuta una stringa del genere xxxyyyzzz che erano i dati ricevuti dai tre slave e messi assieme in un unica stringa. Come facevo a suddividerle? Ora il problema è un po' più grave poichè gli Arduino in realtà non possono avere configurazione master/slave poichè alcune operazioni possono essere eseguite solo se li arrivano dati da un altro slave!
Suddividere un "char array" è di una banalità unica ... basta che all'interno della stringa metti dei separatori e cerchi quelli dopo di che prendi da separatore a separatore ... es : @123456@654321@789456@654987@ ... crechi il carattere scelto come separatore, la @, e prendi quello che c'è in mezzo.
Anche l'altro problema che ti poni è molto semplice, specie usando la struttura semplificata MASTER/SLAVE ...
... il master interroga in continuazione, se uno slave deve dare qualche cosa ad un altro slave ... lo passa la master che lo gira allo slave. Se invece il messaggio è per il master, il master se lo tiene e lo elabora ![]()
Ogni unità deve avere un indirizzo logico, ogni messaggio deve avere una struttura con una testata, un corpo ed una coda ... nella testata si mette chi invia e a chi, nel corpo i dati, e nella coda i codici di controllo.
Certo ... se tu mi dici che non sei capace a suddividere una stringa ...
... beh, sinceramente, ti dico torna quando avrai sufficiente preparazione, perché scrivere un protocollo non è affatto banale e ... il MASTER/SLAVE è il più semplice ... non parliamo di cose più complesse.
Altra strada ... usa una cosa già fatta ...
... esempio, per Arduino si trovano le librerie per il protocollo MODBUS ... che è un protocollo multi-point ... puoi usarle per far comunicare i tuoi Arduini anche a distanze notevoli, visto che può lavorare anche su un bus RS485 ![]()
Guglielmo
Beh diciamo che la mia esperienza è più che altro in Java. In Java puoi definire un separatore e leggere per esempio un file csv. In Arduino invece non so come si possa fare! Altra cosa come si a definire degli indirizzi logici per ogni Arduino? Forse non ho ben chiaro l'architettura master/slave? L'alternativa al master/slave quale è?
pres961:
In Arduino invece non so come si possa fare! Altra cosa come si a definire degli indirizzi logici per ogni Arduino?
Beh, se già programmi in Java, non dovresti aver problemi a capire quello che segue ...
Devi sfruttare la libreria AVR libc che è automaticamente inclusa dall IDE. Per la gestione delle stringhe, ti consiglio di guardare la <string.h> ... scoprirai un sacco di belle possibilità ![]()
pres961:
Forse non ho ben chiaro l'architettura master/slave? L'alternativa al master/slave quale è?
L'alternativa, se non hai uno che dirige (il master) è che ciascuno può diventare, in qualsiasi momento master e chiamare un altro che diventa temporaneamente lo SLAVE. La cosa si incasina parecchio e ti devi gestire tutta la "contetion" del bus dove tutti parlano e le eventuali collisioni.
Dai retta, dai un'occhiata a MODBUS .. è già fatto ed è estremamente affidabile. Inoltre, senza che ti inventi l'acqua calda, è uno standard !
Guglielmo
quindi la libreria MODBUS gestisce l'intero protocollo inserendo l'indirizzo del destinatario e tutta la pappardella di dati vari?
Si, cerca su google sia MODBUS per avere le caratteristiche che "Arduino MODBUS" per trovare le lib.
Se cerchi anche qui sul forum se ne è parlato più volte.
Guglielmo