rs422 full duplex

Ciao a tutti,
sto cercandi di realizzare una rete (rs422) composta da più arduini ... ogni arduino avrà il proprio compito ma potrà impartire degli ordini agli altri ... esempio:

arduino 1 (gestisce i controllo di temperatura)
arduino 2 (gestisce una serie di relè collegati a delle prese di corrente programmati con eventi essenzialmente orari)

entrambi lavorano da soli ma al verificarsi di un evento (esempio temperatura troppo alta) l'arduino uno deve comunicare ad arduino2 di accedendere una presa dove vi è collegato un ventilatore ...

non so se ho reso l'idea ... il sistema gestirà un acquario marino ...

Inoltre ci dovrà essere un arduino (mega) che attraverso un touch gestirà la programmazione delle regole per tutti gli altri arduino ...

il mio problema è che non riesco a reperire esempi (possibilmente in italiano) che mi aiutino a capire:

  1. che tipo di protocollo Full-Duplex utilizzare
  2. come gestire una sort di plug and play all'interno della rete, cioè se aggiungo un nuovo arduino gli altri devono capirlo e chiedergli chi sei? cosa fai?

Spero che qualche anima pia possa aiutarmi a capire come procedere...

grazie e ciao a tutti
Andrea

Nessuno mi può dare una mano :blush:

Prima cosa, visto che utilizzi una MEGA2560 sei sicuro di non poter gestire tutto quanto con questa ? Ti risparmi un sacco di problemi e ti costa molto di meno.
La RS422 è inutile per questa applicazione, ti basta e avanza la RS485, come protocollo usa Modbus RTU, ci sono le librerie pronte all'uso per Arduino.
In tutti i casi i network di tipo RS4xx sono del tipo Master/Slave, tutte le richieste e gli ordini partono sempre e solamente dal Master, due Slave non possono comunicare direttamente tra di loro.

astrobeed:
Prima cosa, visto che utilizzi una MEGA2560 sei sicuro di non poter gestire tutto quanto con questa ? Ti risparmi un sacco di problemi e ti costa molto di meno.
La RS422 è inutile per questa applicazione, ti basta e avanza la RS485, come protocollo usa Modbus RTU, ci sono le librerie pronte all'uso per Arduino.
In tutti i casi i network di tipo RS4xx sono del tipo Master/Slave, tutte le richieste e gli ordini partono sempre e solamente dal Master, due Slave non possono comunicare direttamente tra di loro.

Non capisco su quali concetti si basino le tue affermazioni ...

La differenza tra una rs422 e un rs485 sta proprio nel fatto che la prima (rs422) permette un collegamento full duplex (4 fili) mentre la seconda rs485 (2 fili) permette solo una connessione hall duplex ...

Inoltre non capisco come tu possa affermare che la rs422 sia inutile per la mia applicazione se non conosci in fondo il progetto finale ... Nella descrizione sopra ho fatto un esempio di uno dei molteplici funzionamenti ...

Il colloquio tra gli slavi è la parte ferma del progetto in quanto tutto il sistema andrá in produzione per essere messo in vendita ...

chiunque potrà decidere di comperare il singolo accessorio (con il suo eventuale controller) oppure comperare l'intero sistema (compreso il master e quindi senza ogni singolo controller).

Spero di aver reso l'idea :slight_smile:

Bruschetta:
La differenza tra una rs422 e un rs485 sta proprio nel fatto che la prima (rs422) permette un collegamento full duplex (4 fili) mentre la seconda rs485 (2 fili) permette solo una connessione hall duplex ..

Mi spieghi dove è tutta questa esigenza di avere una linea full duplex piuttosto che una half duplex ?
In tutti i casi gli slave non possono comunicare tra loro, la RS422, come la RS485, non è un bus multimaster, c'è sempre e solamente un singolo master.
Se ti serve un bus multimaster devi usare il CAN.

Uno dei motivi ad esempio e' che, in caso una persona compri l'intero sistema, non posso demandare l'interrogazione a tutti gli slave ad un master in quanto se, si blocca per qualche motivo, mi giocò l'acquario.

Un acquario di barriera ha pesci e coralli anche di svariate migliaia di euro ... Un piccolo pezzo di corallo puó costare anche 150/200 euro ... Immagina un acquario pieno ....

Ogni singolo arduino ha una serie di compiti standard ... In più al verificarsi di alcuni eventi deve poter comunicare all'arduino x di fare delle attività ...

Ti faccio un altro esempio ... Un arduino deve controllare due sensori di livello ... Uno nel l'acquario e l'altro nella vasca di rabbocco ...

In caso che il livello dell'acquario sia basso deve controllare che nella vasca di rabbocco ci sia acqua ... In caso positivo chiama l'arduino che gestisce le prese di corrente e gli comanda di dare corrente alla presa dove vi è collegata la pompa che travasa l'acqua nell'acquario mentre se anche il 2 sensore é basso deve dire all'arduino che gestisce le prese di dare corrente alla presa dove vi è collegata l'elettrovalvola in entrata dell'impianto ad osmosi ...

In tutto questo ti dico che l'arduino che gestisce le prese oltre che ricevere comandi dovrà gestire le sue funzioni primarie del tipo :
-sincronizzazioni di due o più prese (per le pompe)
-gestire orari di accensione programmati a particolari orari (es. Gestire l'accensione/spegnimento di più bulbi t5 o hqi simulando Alba e tramonto, ecc.)
-ecc. Ecc.

Capisci che demandare il tutto ad un solo arduino diventa pericoloso!

Bruschetta:
Uno dei motivi ad esempio e' che, in caso una persona compri l'intero sistema, non posso demandare l'interrogazione a tutti gli slave ad un master in quanto se, si blocca per qualche motivo, mi giocò l'acquario.

Indipendentemente dalle questioni di costi rimane il fatto che la RS422 e la RS485 sono network single master, non puoi far dialogare tra loro due slave, inoltre in caso di avaria di un Arduino avresti sempre la perdita delle funzioni controllate, ovvero il problema permane.

Hai qualche consiglio da darmi per riuscire a far parlare gli arduino tra loro ... Se risolvo il problema in caso di guasto di un arduino predo una funzionalità e non tutte :slight_smile:

Potresti tirare un'altra coppia di fili fra gli Arduino che devono comunicare tra di loro, creando quindi una seconda RS485 che serve solo queste 2 schede.

Il problema e che con alcuni moduli ci dovrebbero parlare praticamente quasi tutti ... Possibile che non ci sia una soluzione (anche non rs485/422) in cui ho una rete che sia plug and play in cui tutti parlino con tutti!

Help me!

Sull'I2C puoi avere una configurazione multimaster ma il problema è che con questo protocollo non ci fai molta strada: si parla di decine di cm, metri se hai fortuna, anche se alcuni riferiscono connessioni più lunghe questa non è comunque la regola (l'I2C è nato per far dialogare dispositivi sulla stessa scheda o comunque fra schede interconnesse).

Le soluzioni possibili sono due, I2C e CAN, per la prima non ti serve hardware aggiuntivo però ci sono dei grossi limiti sulla lunghezza delle connessioni, o meglio il limite è la capacità totale della linea che non deve superare i 400 pf e questo penalizza molto la lunghezza dei cavi e il numero di device collegabili al bus.
Il CAN bus è la soluzione ottimale, velocissimo e senza problemi di lunghezza cavi visto che possono essere anche di centinaia di metri, però non puoi gestirlo nativamente da Arduino, devi usare appositi IC che ti forniscono sia la parte trasceiver che lo strato più basso del protocollo software.
Una buona soluzione per implementare il CAN bus su Arduino, senza gravare troppo sul micro, è utilizzare l'abbinata MCP215 (CAN controller) e MCP2551 (CAN trasceiver) esistono delle shield con questi IC e relative librerie per l'utilizzo.

ma con xbee e un mash network non si potrebbe fare?
Complimenti per la promozione Leo :wink: .

BrainBooster:
ma con xbee e un mesh network non si potrebbe fare?

Volendo si.

ma con xbee e un mash network non si potrebbe fare?

Io propenderei per il CAN suggerito da astrobeed. Mi pare più economico e meno soggetto a distrubi esterni. Confesso che non conosco la sensibilità di xbee ai distrurbi, ma poichè si tratta di una applicazione abbastanza mission critical (bruschetta parlava di un valore di migliaia di euro...) eviterei di correre rischi.

Rifletterei inoltre ancora un po' sulla soluzione I2C. Dovendo controllare un acquario, quindi un sistema relativamente piccolo dove i diversi arduino saranno probabilmente posizionati molto vicini tra loro (se poi mi sbaglio, bruschetta mi correggerà...) magari la lunghezza del bus non è così critica. Inoltre esiste il P82B715 che è un I2C extender che potrebbe aiutare qualora fosse necessaria una lunghezza del bus maggiore.

vittorio68:
Rifletterei inoltre ancora un po' sulla soluzione I2C. Dovendo controllare un acquario, quindi un sistema relativamente piccolo dove i diversi arduino saranno probabilmente posizionati molto vicini

Dal punto di vista realizzazione la soluzione basata su I2C è quella più semplice ed economica, tutte le schede Arduino dispongono di questo bus e basta collegarlo con un cavo, poi c'è il discorso della I2C multimaster che se non mi ricordo male dovrebbe già esserci una libreria dedicata.
Però c'è un "piccolo" problema, la gestione I2C di Arduino non è affidabile, ovvero in caso di errori sul bus c'è il reale rischio di trovarsi con il bus bloccato e nessuno può più comunicare, peggio ancora lo sketch rimane fermo in eterno in attesa di un qualcosa che non arriverà mai, cose che avrebbe effetti disatrosi sull'acquario, è possibile risolvere però tocca scriversi delle proprie routine di gestione I2C che non siano bloccanti in caso di errore e stabilire un modo di autoripristino, ovvero c'è molto lavoro software da fare.

astrobeed:
Le soluzioni possibili sono due, I2C e CAN, per la prima non ti serve hardware aggiuntivo però ci sono dei grossi limiti sulla lunghezza delle connessioni, o meglio il limite è la capacità totale della linea che non deve superare i 400 pf e questo penalizza molto la lunghezza dei cavi e il numero di device collegabili al bus.
Il CAN bus è la soluzione ottimale, velocissimo e senza problemi di lunghezza cavi visto che possono essere anche di centinaia di metri, però non puoi gestirlo nativamente da Arduino, devi usare appositi IC che ti forniscono sia la parte trasceiver che lo strato più basso del protocollo software.
Una buona soluzione per implementare il CAN bus su Arduino, senza gravare troppo sul micro, è utilizzare l'abbinata MCP215 (CAN controller) e MCP2551 (CAN trasceiver) esistono delle shield con questi IC e relative librerie per l'utilizzo.

prima di tutto ti ringrazio per l'auto che mi stai dando ...

secondo avresti qualche link delle librerie e di qualche esempio di trasmissione? tanto a me serve solo che invi un macro comando poi il ricevente effettua tutte le operazioni ...

per adesso grazie :slight_smile:

allora ragazzi ...

i2c non è possibile in quanto l'attrezzatura tante volte si trova anche a molti metri di distanza ... vi spiego meglio ... l'acquario marino ha bisogno (solitamente) di tre vasche:

  1. Acquario
  2. Vasca tecnica (dove vengono allogiate le attrezzature)
  3. Vasca di Ripristino acqua evaporata

Molti malati (nel buon senso della parola) hanno l'Acquario al piano di sopra e la vasca tecnica al piano di sotto ...

Riguardo agli Xbee cercando in rete mi è sembrato che anche qui serve per forza un coordinatore ma in questo sistema potrebbe non esserci (dipende se uno compra tutto il sistema subito) ...

:slight_smile:

Bruschetta:
Molti malati (nel buon senso della parola) hanno l'Acquario al piano di sopra e la vasca tecnica al piano di sotto ...

ma per "piano" intendi il piano della casa oppure "livello", cioè prendendo come esempio un mobile, la vasca acquario sul ripiano superiore e la vasca tecnica sul ripiano inferiore? Se la distanza è di circa mezzo metro con l'I2C dovresti farcela.

Bruschetta:
Riguardo agli Xbee cercando in rete mi è sembrato che anche qui serve per forza un coordinatore ma in questo sistema potrebbe non esserci (dipende se uno compra tutto il sistema subito) ...

Il coordinatore è uno, ma anche più di uno, dei moduli Xbee in rete, serve per gestire le comunicazioni tra i moduli.
In pratica un mesh network Xbee è composto da almeno due moduli Xbee serie 2, uno è il coordinatore e l'altro un router, puoi inserire molti altri router e altri coordinatori nella rete, tutti i moduli Xbee possono parlare tra di loro e ricevere comunicazioni broadcast, cioè quello che viene trasmesso da uno arriva a tutti gli altri.
Per il CAN ti conviene iniziare dal topic messo in evidenza sul blog di Arduino che ti avevo linkato Arduino Forum, li trovi anche le librerie, se opti per l'utilizzo della coppia MCP2515 (controller) e MCP2551(transceiver) praticamente hai il 95% del carico di lavoro svolto dal 2515, che in realtà è un micro preprogrammato per gestire il protocollo CAN.
Come puoi vedere nella foto del topic che ti ho linkato i due IC esistono anche in formato pdip il che ti semplifica molto la loro integrazione su una tua shield se non vuoi "combattere" con gli SMD.