4 Arduino Master Slave in RS485

Ma nel caso appunto di un sistema home-made non penso che bloccare il ciclo di interrogazioni per 1/2 secondi porti a chissà quali catastrofi :wink:

leo72:
Ma nel caso appunto di un sistema home-made non penso che bloccare il ciclo di interrogazioni per 1/2 secondi porti a chissà quali catastrofi :wink:

Io sinceramente me la ero pensata diversamente...appunto per evitare il tempo di latenza tra comando e reazione, il microcontroller integrato nello slave esegue direttamente il comando in questione inviando solo un feedback al master per informarlo dell'azione seguita, il master praticamente mi deve gestire soltanto l'invio di comandi da remoto ethernet shield e company...e interviene nel caso dell'attivazione del risparmio energetico disattivando le luci e mettendo in condizione gli slave di rispondere allo stato dei sensori PIR per l'accensione delle luci ecc...in pratica gli slave...oltre ad essere slave e quindi gestiti dal master hanno al loro interno un codice che eseguono per conto loro...

Ad esempio io utilizzerò uno slave per ogni stanza...in caso di attivazione manuale mi sembra inutile far partire il comando dalla stanza verso il master per poi restituire il comando di accensione...quindi esegue direttamente l'operazione ed informa il master di ciò che ha eseguito.

Senz'altro per una installazione nella propria casa chi meglio di te può sapere le tue esigenze?

leo72:
Senz'altro per una installazione nella propria casa chi meglio di te può sapere le tue esigenze?

Certo...questo è ovvio...il mio problema reale è la comunicazione seriale...che, parlandoci chiaro, non riesco a comprendere in nessun modo...se il tizio del sito avesse messo i commenti a fianco alle righe di codice spiegando che fa e a che serve quella stringa a quest'ora avrei finito...vorrei trovare un metodo molto più semplice per creare il protocollo ma non si trova nulla su internet...di comprensibile ho trovato solo qualche cosa qui sul forum, ma purtroppo non adatto alle mie esigenze...

peppe91:
..vorrei trovare un metodo molto più semplice per creare il protocollo ma non si trova nulla su internet...di comprensibile ho trovato solo qualche cosa qui sul forum, ma purtroppo non adatto alle mie esigenze...

Lascia perdere il protocollo fai dai da te, serve molta competenza ed esperienza per realizzarlo, usa modbus RTU che trovi pronto all'uso per Arduino https://sites.google.com/site/jpmzometa/arduino-mbrt

Mi sa che è molto meglio...grazie...avevo trovato anche questo: Gammon Forum : Electronics : Microprocessors : RS485 communications

peppe91:

leo72:
Senz'altro per una installazione nella propria casa chi meglio di te può sapere le tue esigenze?

Certo...questo è ovvio...il mio problema reale è la comunicazione seriale...che, parlandoci chiaro, non riesco a comprendere in nessun modo...se il tizio del sito avesse messo i commenti a fianco alle righe di codice spiegando che fa e a che serve quella stringa a quest'ora avrei finito...vorrei trovare un metodo molto più semplice per creare il protocollo ma non si trova nulla su internet...di comprensibile ho trovato solo qualche cosa qui sul forum, ma purtroppo non adatto alle mie esigenze...

Mi pareva di averti accennato alla sezione Serial sul Reference.
Se non ti ho già messo il link, te lo metto ora:

Qui ci trovi tutto quello che devi studiarti sulla comunicazione seriale. Una volta che hai capito a che serve un Serial.available() o perché un carattere spedito come "a" è diverso da uno spedito come 'a', allora non ti serve più nessun commento nel codice :wink:

Secondo me usare ModBus senza sapere come avvengono le cose è come prendersi un'auto senza sapere qual è il pedale del freno.
Dai un'occhiata ad uno degli sketch di esempio e poi ne riparliamo... :sweat_smile:

eheheeh...ti dò perfettamente ragione...fare qualcosa senza capire ciò che si fa...non è il massimo...ti ringrazio nuovamente per l'aiuto...domani leggerò la pagina del reference...peccato che sia in inglese...ma arduino non è italiano??? grrrrr... vabbè....

Ma riuscire a collegare due arduino1 tra loro di cui uno Master e l'altro Slave e riuscire a usarlo in questa maniera :

ARDUINO MASTER ARDUINO SLAVE 1

Pin 3 Premo Pulsante Pin 3 Accendo Led per 2 secondi
Pin 4 Premo Pulsante Pin 4 Accendo Led per 2 secondi
Pin 5 Premo Pulsante Pin 5 Accendo Led per 2 secondi

.... come affrontare la creazione di un "protocollo" sul bus rs485 per riuscire ad effettuare quello che ho descritto sopra ???

Sembra strano ma veramente sul Web se ne parla poco o pochissimo e in più gli esempi che ci sono su youtube o siti vari non descrivono affatto l'approccio al protocollo e alla famosa "tabella" comandi da creare in byte...

Qualcuno che in parole più spicciole e con qualche esempio concreto di sketch base per iniziare a lavorarci sopra ???

Ringraziando in anticipo i futuri interlocutori vi auguro un buon fine settimana con Arduino....

pietro78:
Ma riuscire a collegare due arduino1 tra loro di cui uno Master e l'altro Slave e riuscire a usarlo in questa maniera :

ARDUINO MASTER ARDUINO SLAVE 1

Pin 3 Premo Pulsante Pin 3 Accendo Led per 2 secondi
Pin 4 Premo Pulsante Pin 4 Accendo Led per 2 secondi
Pin 5 Premo Pulsante Pin 5 Accendo Led per 2 secondi

.... come affrontare la creazione di un "protocollo" sul bus rs485 per riuscire ad effettuare quello che ho descritto sopra ???

Sembra strano ma veramente sul Web se ne parla poco o pochissimo e in più gli esempi che ci sono su youtube o siti vari non descrivono affatto l'approccio al protocollo e alla famosa "tabella" comandi da creare in byte...

Qualcuno che in parole più spicciole e con qualche esempio concreto di sketch base per iniziare a lavorarci sopra ???

Ringraziando in anticipo i futuri interlocutori vi auguro un buon fine settimana con Arduino....

Bella domanda Pietro...io è quello che cerco...una dispensa che indichi come fare e il perchè fare una determinata procedura invece di un altra...gli esempi concreti a mio avviso servono ma non tanto... io sono dell'opinione che sarebbe meglio fare da se e confrontare con uno sketch già pronto...per comparare e per vedere eventuali dimenticanze...inoltre non dimentichiamoci che BYTE non è più supportato dalla versione 1.0 dell'IDE in poi...ma bisogna usare il Serial.write...c'è veramente poco in giro sul web....e se non fosse per quei pochi che hanno dedicato il loro tempo per spiegarmi qualcosa, sarei ancora a 0...ma ti dico la verità...che anche avendo letto e riletto e anche con gli aiuti dei ragazzi sul forum ancora non mi reputo in grado di scrivere un protocollo...ma se lo imparo per bene la faccio io una dispensa a disposizione di tutti...qualcuno ci deve pur pensare a farla....nei link che ho postato c'erano alcuni sketch....tu c'hai capito qualcosa?...magari condividiamo per riuscire ad arrivare a qualcosa di concreto...ciaoo

Ciao,

innanzitutto provo a rispondere alla domanda di peppe e pietro. Mi pare giusto dato che mi sono inserito di "prepotenza" nel thread.

Ovviamente la mia risposta potrebbe essere discussa insieme proprio perchè non sono sicuro che l'architettura che ho in mente sia quella corretta.

Come ho già detto, a differenza di peppe, io non immagino una logica di controllo sugli slaves perchè questo mi costringerebbe ad aggiornarne il firmware in caso di modifiche. Preferirei avere una logica centralizzata con gli slaves che fanno solo da sensori/attuatori.

Ciò premesso penso che il sistema dovrebbe funzionare in questo modo.

1 - il master chiede ad ogni slave il suo stato (per esempio lo stato dei pulsanti ad esso collegati oppure l'ultimo valore di temperatura letto)
2 - conoscendo lo stato di uno slave invia un comando ad uno o più slaves (per esempio sullo slave 2 è stato premuto il pulsante 1 e comanda allo slave 3 di chiudere il relè 2 ed allo slave 4 di chiudere il relè 3)

Dal punto di vista del protocollo seriale, pensando a qualcosa di simile a quello indicato all'inizio di questo thread, il master chiede lo stato ad ogni slave inviando un pacchetto con un determinato codice comando (per esempio RichiestaStatoInput = 1). Lo slave risponde con un pacchetto con codice comando RispostaStatoInput = 2. In questo caso deve comunicare un valore e lo fa utilizzando i bytes del pacchetto predisposti per eventuali dati. Il master deve quindi comandare la chiusura dei relè e lo fa inviando al relativo slave un pacchetto con codice comando ImpostaStatoOutput = 3 utilizzando ancora i bytes di dati per comunicare il valore di Stato che vuole impostare.

Ovviamente si tratta solo di una traccia, il protocollo andrebbe approfondito nel dettaglio anche in funzione di quello che si deve implementare.

Ciao.
Vittorio.

E ritorno anche al mio dubbio...

50 ms sono una eternità, il tempo medio per la transazione master/slave è 4-5 ms, il timeout mediamente si imposta tra 10-20 ms ed è una condizione di errore

certo, con 4-5 ms i conti tornano... ho però qualche dubbio. In questo tempo, il master deve inviare la richiesta e lo slave deve rispondere; pensi che sia fattibile con Arduino? Appena ho un po' di tempo ci provo.

E poi non è che il master debba terminare tutto il ciclo di interrogazioni quando deve spedire un comando.

questo mi piace :slight_smile: In pratica appena riceve una variazione da uno slave esegue la logica di controllo per verificare se deve comandare qualcosa ed invia i comandi necessari.

Il controllo degli slave sarà fatto nei momenti di idle del sistema.

questo invece non lo capisco. Mi pare, come dice anche astrobeed, che il sistema interroghi sempre gli slaves, altrimenti come fa a sapere se c'e' stata una variazione o meno. E comunque immagino che la logica di controllo venga eseguita in un tempo brevissimo; credo che il master passi la maggior parte del tempo ad interrogare gli slaves.

Ciao.

Allora dopo tutto questo parlare peché non ci uniamo in u n unico gruppo e iniziamo
a mettere le basi per un "simple protocol" da usare per un Arduino Master che
collegato con due slave esegue un controllo dello stato pin dei due slave in scansione e in continuazione e appena riceve uno stato High dei pin input 2,3,4 di ogni slave esegue un digitalWrite High dei suoi Pin Output 2,3,4 5,6,7 8,9,10

Slave1 pin2,3,4 ---- segue Master pin2,3,4
Slave2 pin2,3,4 ---- segue Master pin5,6,7
Slave3 pin2,3,4 ---- segue Master pin8,9,10

Da dove iniziamo??

@vittorio68:
la mia affermazione sul controllo degli slave nei periodi di idle era fatta relativamente ad un master che dovesse anche interagire con l'utente, lo avevo precisato che appunto in modalità "interattiva" dedicasse la sua attenzione al "padrone" piuttosto che alle sue periferiche.
Ovviamente questo dipende da come fai la lettura degli slave, se usi uno scheduler tipo il mio leOS e l'interrogazione la fai in background, puoi sempre ricevere dati senza fermare il loop principale del codice.

pietro78:
Allora dopo tutto questo parlare peché non ci uniamo in u n unico gruppo e iniziamo
a mettere le basi per un "simple protocol" da usare per un Arduino Master che
collegato con due slave esegue un controllo dello stato pin dei due slave in scansione e in continuazione e appena riceve uno stato High dei pin input 2,3,4 di ogni slave esegue un digitalWrite High dei suoi Pin Output 2,3,4 5,6,7 8,9,10

Slave1 pin2,3,4 ---- segue Master pin2,3,4
Slave2 pin2,3,4 ---- segue Master pin5,6,7
Slave3 pin2,3,4 ---- segue Master pin8,9,10

Da dove iniziamo??

Pietro...l'idea mi piace...scrivere qualcosa noi da mettere a disposizione di tutti (visto che si trova davvero poco) quello da cui partire sarebbe inventarci il protocollo

rispondendo a Vittorio...
la mia idea di avere un codice in esecuzione all'interno degli slave è solo per i comandi delle luci e per il sensore gas sostanzialmente...ciò per avere un'affidabilità maggiore e un tempo di risposta immediato, la sirena del sensore gas in questo caso è allocata all'interno dello slave in questione...nel caso di una fuga di gas..lo slave dovrebbe rilevare il gas, inviare il comando di accensione della sirena al master e il master dovrebbe restituirlo allo slave dicendo di attivare la sirena...mettiamo caso ci fosse un errore di comunicazione o qualsiasi altro problema per cui il segnale non riesce ad arrivare al master...la sirena non si attiva...è solo una questione di affidabilità, praticamente lo slave mi esegue il codice inviando solo un feedback al master alla prima interrogazione...comunque se vogliamo fare un codice insieme sono a disposizione...cominciamo a buttare giù qualcosa...

Dovreste creare una serie di livelli di sicurezza. Se l'operazione è banale, come ad esempio accendere un faretto quando inizia a fare buio, potete usare un livello basso, spedendo al master la lettura del sensore ed attendendo che il master spedisca il comando.
Ma se il livello di sicurezza è alto, lo slave è abilitato ad invertire la sequenza: operare in proprio attivando una certa cosa ed informando il master del problema.

Allora dopo tutto questo parlare peché non ci uniamo in u n unico gruppo e iniziamo
a mettere le basi per un "simple protocol"

Qualche tempo fa avevo fatto qualche prova con un paio di Arduino Mega (scelti sopratutto per la maggiore capacità di memoria...) ed un paio di SN75716BP per creare una RS485. Appena ho un po' di tempo rimetto insieme gli sketch di prova che avevo fatto e comincio a postarli.

Ciao.
Vittorio.

leo72:
Dovreste creare una serie di livelli di sicurezza. Se l'operazione è banale, come ad esempio accendere un faretto quando inizia a fare buio, potete usare un livello basso, spedendo al master la lettura del sensore ed attendendo che il master spedisca il comando.
Ma se il livello di sicurezza è alto, lo slave è abilitato ad invertire la sequenza: operare in proprio attivando una certa cosa ed informando il master del problema.

Cosa consigli???

Una semplice tabella con i livelli di sicurezza.
Ad ogni operazione che deve eseguire lo slave assegnate un livello. Se il livello è base, fate la solita trafila: spedire al master il dato, attendere la decisione del master. Questo va bene, ad esempio, per la lettura di una fotoresistenza.
Se il livello è superiore (allarme fuga gas), potete decidere se:

  1. inviare il dato al master e mettere un timeout alla sua risposta, per evitare che una caduta dello stesso o un problema sulla linea impedisca allo slave di prendere una decisione. Oppure
  2. attivare una contromisura (es.: sirena) in maniera indipendente ed informare il master dell'accaduto.

Il master potrà avvisare l'utente con un sms/email/led, a seconda di come è stato programmato.