alcuni chiarimenti con RS485

Vorrei provare a integrare un impianto di Domotica con alcuni Arduino collegati in RS485. Avrei un Master collegato con USB al computer (già acceso 24/24) e una schedina RS485 collegata ad ogni Arduino. I dati dei vari Arduino dovranno arrivare al pc che li elaborerà/comanderà.

Lato Hardware: 1) E' meglio usare come Master una Mega che ha 4 seriali Hardware invece che altri Arduino con la seriale software? Risulta più stabile/pulita la connessione con RS485 e pc?

2) Avrò il mio bus che scorre lungo la casa su cavo Cat5e: i vari Arduino-RS485-nodi a quanta distanza max posso piazzarli dal bus per evitare riflessioni e altri disturbi?

3) Come fili del bus, avrò bisogno di A e B e poi pensavo di farci girare un 12V per alimentare i vari Arduino e altri relè locali: Quindi col 12V+GND, 4 fili in tutto. Come minimo assoluto potrei usarne 3: A+B+GND +ali 12V locale con GND collegata al GND del bus? Oppure è possibile avere il GND separato in alcune unità, permettendo di usare solo 2 fili A+B e alimentazione locale?

4) Usando la 485, mi pareva di aver letto che non potrò più usare la I2C per collegare eventualmente un LCD all'Arduino locale? Volendo collegare in futuro un display, come lo potrei collegare? Idem anche qui, usare la Mega per sfruttare sia la Rs485 che la I2C?

Lato Software: 5) per evitare interferenze tra chi riceve e trasmette, magari è meglio se non uso un master, ma una configurazione Rolling-master con la libreria modbus qui. Così, anche, tutti gli Arduino sanno cosa viene comunicato da tutti gli altri, potendo anche interagire senza un diretto comando del pc. Qualcuno ha provato il rolling-master?

Scusate le molte domande tutte insieme... se qualcuno vuole rispondere anche solo ad alcune, grazie. Ciao

Intanto ti consiglio di guardare la libreria PJON, scritta da un utente di questo forum, che sicuramnete è adatta al tuo scopo ed è piuttosto semplice da usare, manutenuta ed affidabile.

Per il resto, se hai VERAMENTE necessità di più seriali (... ma ricorda che con la 485 puoi fare un unico BUS con vari devices connessi ad una sola seriale), allora passa alla MEGA ... idem se pensi di aggiungere funzionalità, data la maggiore memoria a disposizione.

Ti consiglio poi QUESTA lettura ... ;)

Guglielmo

1) Usare una Mega, se non ci sono vincoli di costi e dimensioni, conviene sempre sia per le 4 UART hardware sia per la maggiore quantità di memoria ram/flash disponibile, nel caso specifico se usi la Mega non devi scollegare la seriale per poter programmare la scheda, assolutamente sconsigliato usare la seriale software con la RS485.

2) La RS485 permette una connessione fino a 1km con velocità a 19200 bps, fino a 10 mt puoi lavorare a 10 Mbps compatibilmente con il transceiver e il cavo utilizzato, diciamo che in ambito indoor con cavi fino a 50 mt lavori senza problemi ad almeno 57600 bps, se il cavo è buono anche a >115200 bps.

3) La RS485 non richiede GND, è una linea differenziale e lavora in base alla differenza di potenziale tra A e B e non tra questi e GND, se devi portare il 12V ti servono altri due fili, di idoneo diametro in base alla corrente necessaria, per GND e +12V.

4) la I2C non ha nulla a che vedere con le UART, sono device indipendenti a livello hardware nel micro, puoi tranquillamente collegare un display I2C alla Mega.

5) La RS485 è un bus master/slave, ovvero hai un master che interroga periodicamente i vari slave per ottenere dati o fornire comandi, usare il protocollo modbus è un'ottima scelta, lascia perdere il rolling master perché è una complicazione inutile salvo rari casi in cui è indispensabile. Ti rammento che la RS485 non ha modo di rilevare collisioni sul bus, a differenza della I2C che può farlo, pertanto sebbene da un punto di vista teorico è possibile avere più master la cosa è molto complessa, e critica, da gestire lato software.

Nota finale il cavo CAT5E non è l'ideale per la RS485, sebbene sono quattro doppini intrecciati sono pensati per i segnali ethernet e non per quelli RS485, l'intrecciatura del doppino non è ottimizzata per i 100 MHz della lan e non per i segnali, a frequenza nettamente minore, della 485. In tutti i casi i cavo UTP va sicuramente meglio di un normale cavo per impianto elettrico, unico limite è la corrente massima che regge, non deve essere maggiore di 1A, questo vale solo per l'uso come linea di alimentazione, non a caso il POE usa una tensione di 48V allo scopo di ridurre la corrente che scorre nei cavi UTP. Altro dettaglio, la RS485 oltre a non richiedere il GND non gradisce che siano in comune tra device diversi con alimentazioni diverse, questo perché i vari GND in realtà si trovano sempre a potenziali, rispetto a terra, diversi, e la cosa può creare non pochi problemi. Se si usa un cavo RS485 con schermo questo va collegato solo al GND del Master, poi è possibile collegare in network anche i vari GND ma va fatto tramite apposite resistenze per disaccoppiarli tra loro.

Solo un'appunto ... dici che vuoi usare un cavo cat5e e poi anche dei fili per l'alimentazione ... e' inutile, se nel cavo cat5e fai passare solo la RS485, ti restano ben 3 doppini (6 fili) da poter sfruttare per portare l'alimentazione al dispositivo (consiglio di usare uno dei fili di ciascun doppino per la massa e l'altro per il +V, cosi hai tutti i cavetti intrecciati che, "in teoria", dovrebbero beccarsi meno disturbi possibile ... ma comunque lato utilizzatore almeno un paio di condensatori ed un'induttanzina ci vanno) ... considerando che teoricamente quei fili potrebbero reggere 1A, se ne usi 3 per polo, ci puoi alimentare carichi fino al paio di Ampere con una ridotta caduta (oppure sfruttarli per mandare un 12V che poi ridurrai localmente con un normale regolatore dove servono i 5V) ... ;)

Grazie mille!
@gpb01 Guarderò con calma la libreria consigliata.
L’altro link l’avevo già letto, però non mi chiariva il problema 2).

@astrobeed
La velocità di trasmissione non è importante: dovrò trasferire pochi byte per aggiornare le variabili dei vari sensori.
Quel che chiedevo nella 2) era la distanza max DAL bus: cioè mi devo collegare con i miei nodi-branch Arduino al bus -che non ha problemi di lunghezza, dato che può arrivare anche a 1,2Km e oltre (il mio sarà sui 100m credo), ovviamente alle estremità metterò le terminazioni- su A e B.
A quanti metri posso collegare i vari singoli Arduino DAL bus: meno sono meglio è, ma al max, quanto circa? 2-3m, 5-10m?

  1. Sì, basterebbero A+B, ma ho letto non ricordo dove che per avere buoni risultati è bene avere anche un collegamento GND comune. Del resto uno dei vantaggi ad esempio della 1-wire è quello di poter usare solo due fili (anche se migliora con i 5V aggiuntivi dell’eventuale terzo filo): se fosse sempre così anche per la RS485, non sarebbe sempre meglio usare la 485 che è oggettivamente migliore? Parlo comunque da inesperto di RS485.
    La 1-wire ce l’ho attualmente nell’impianto con circa 120m di cavi (non in configurazione bus) e funziona bene, a parte qualche problemino di lettura saltuario di certi sensori di temperatura lontani.
    PS: Avevo trovato questo articolo che parla appunto di un un ulteriore 3° filo di GND necessario:

to connect the ground (of each RS485 driver) to the same reference. Now we don’t care about ground potentials

e anche qui:

The ground connection is is not written explicitly in the specifications. Instead a so called Common Voltage Range (CVR) is defined. The specification -7V to +12V for the CVR allows to design and manufacture less complex and hence low-cost circuits. Without somehow connecting the logic Ground an installation can not ensure this requirement is met on all stations. A device without such an option is possibly not conforming to RS485 specifications.

“necessario” per modo di dire, ovviamente, poi, certo, può funzionare anche con 2.
O magari per migliori risultati è possibile collegare da una parte sola un terzo filo di shield a GND (come si fa coi cavi bilanciati con apparecchi non bilanciati)?
In questo senso un cavo S-FTP sarebbe meglio di un UTP?

  1. Ok, vedrò di ripensare il tutto con 1 solo master, ma guardando il rolling-master del sito gammon non mi pareva male come possibili collisioni: ogni Arduino ha un suo slot temporale e può comunicare solo in quello mentre gli altri tacciono; al massimo si può solo perdere una comunicazione, ma non mi sembra collisioni.

Ok per i cavi non ideali cat5e, però mi tocca usare quelli perché già cablati… tra l’altro in alcune tratte dovrò condividere il cavo con anche 4 fili crimpati per collegare videocamere in POE.
Quale sigla di cavi sarebbero pensati apposta per il 485?

@Etemenanki
Forse non mi ero spiegato bene, ma intendevo proprio quello: usare i restanti fili del cat5e per portare anche i 12V, però come detto sopra in certi pezzi ne avrò già altri 4 occupati, per cui me ne resterebbero giusto giusto i 4 necessari.

franketto: A quanti metri posso collegare i vari singoli Arduino DAL bus: meno sono meglio è, ma al max, quanto circa? 2-3m, 5-10m?

Questa non l'ho capita, i vari moduli devono stare tutti sul bus, non ci sono restrizioni di distanza minima/massi, solo la lunghezza massima del bus e il numero di moduli limitato principalmente dal tipo di transceiver utilizzato.

3) Sì, basterebbero A+B, ma ho letto non ricordo dove che per avere buoni risultati è bene avere anche un collegamento GND comune

Hai interpretato male oppure hanno scritto delle cavolate, la RS485 non solo non richiede GND, ma collegarlo può causare non pochi problemi, come ti ho già detto nei rarissimi casi in cui è necessario collegare anche GND, e non perché serve per la 485, tra i vari sistemi sul bus va fatto con appositi accorgimenti tramite un network resistivo e degli scaricatori verso terra, se e come usarli dipende dal tipo di impianto, in ambito interni con tutte le utenze collegate alla stessa rete AC non servono, però rimane lo stesso l'imperativo di non collegare GND direttamente tra le varie board, se lo fai rischi non pochi problemi e possibili danni hardware dovuti alle differenze di potenziale tra i vari GND. Puoi collegare GND solo se l'alimentazione è la stessa per tutte le schede, ovvero hai un sistema di alimentazione centralizzato che viene distribuito verso tutte le schede presenti sull'impianto, però in questo caso è bene prevedere capacità e induttori di disaccoppiamento su i singoli utilizzatori per ridurre gli effetti negativi dell'immancabile "spazzatura elettrica" che viaggia su i cavi.

. Del resto uno dei vantaggi ad esempio della 1-wire è quello di poter usare solo due fili (anche se migliora con i 5V aggiuntivi dell'eventuale terzo filo):

La onewire non ha nulla a che vedere con la RS485, non è un bus differenziale.

astrobeed: Questa non l'ho capita, i vari moduli devono stare tutti sul bus, non ci sono restrizioni di distanza minima/massi, solo la lunghezza massima del bus e il numero di moduli limitato principalmente dal tipo di transceiver utilizzato.

https://en.wikipedia.org/wiki/File:BusNetwork.svg

Qui descrivono il bus come il filo che ha le due estremità con terminatori, il backbone, quello appunto può andare fino a circa 1Km:

This central cable is the backbone of the network and is known as the bus (thus the name). [...] connected to a common transmission medium which has exactly two endpoints (this is the 'bus', which is also commonly referred to as the backbone, or trunk)

Il distributed bus, invece del linear bus (dove i nodi sono esattamente sullo stesso backbone) ha appunto delle ramificazioni (branches) che si collegano al backbone:

The type of network topology in which all of the nodes of the network are connected to a common transmission medium which has more than two endpoints that are created by adding branches to the main section of the transmission medium

Queste ramificazioni le chiamano branches, drops, stubs etc Quindi ogni Arduino-Rs485 sarebbe un nodo che forma un "drop" di una certa lunghezza che si collega al backbone principale che è il bus vero e proprio. In senso largo certo tutto l'insieme è un bus distribuito.

Ovviamente minore è la distanza del nodo dal backbone meglio è, chiedevo quanto ci si poteva spingere perché il tutto posssa ancora funzionare bene: ho trovato ad esempio questo articolo che su 1000m di backbone suggeriva una massima distanza di "drop" singolo di 20m e complessiva di tutti i drop di 40m max. Ci sto dentro di sicuro ;)

Si ma stai facendo riferimento ad una descrizione generica di una rete e non a quella specifica per il bus RS485, che ha le sue regole e una di queste è che tutti i device devono essere collegati direttamente al bus senza derivazioni, salvo patch di poche decine di cm tra il bus vero e proprio e l'eventuale punto di connessione sulla scheda. Per capirci meglio, sulla RS485 non puoi avere una morfologia a stella o un mix tra questa e quella lineare, puoi usare solo quella lineare.

astrobeed: in questo caso è bene prevedere capacità e induttori di disaccoppiamento su i singoli utilizzatori per ridurre gli effetti negativi dell'immancabile "spazzatura elettrica" che viaggia su i cavi.

L'alimentazione a 12V proverrebbe da un alimentatore 12V stabilizzato. Puoi farmi qualche esempio/schema di cosa dovrei inserire tra i due fili dell'alimentazione centralizzata e l'Arduino? Qualcosa di simile ai filtri RC per i motori? Su questo sono abbastanza digiuno...

astrobeed: Per capirci meglio, sulla RS485 non puoi avere una morfologia a stella o un mix tra questa e quella lineare, puoi usare solo quella lineare.

**>franketto: **ovvero: In pratica arrivi con il cavo ad un "device" e da li riparti ... non puoi fare un punto con delle diramazioni ... Guglielmo

@astrobeed a @gpb01 Ok, le specifiche vogliono un bus lineare, al massimo pochi cm di drop. (A stella di sicuro non lo facevo.)

Però, come spesso accade, nella pratica ci si deve spingere un po' più in là del "meglio" che si dovrebbe fare. Per questo chiedevo se si poteva spingere un po' oltre le specifiche, magari non essendo più un "vero" RS485, ma se funziona lo stesso...;) Quell'articolo postato sopra dice di sì, anche abbondantemente sembra: prima o poi proverò, poi vi dirò. Del resto non è un'applicazione industriale, è una cosa hobbistica. Al massimo ritornerò sui miei passi e mi avvicinerò di più al backplane.

franketto:
Però, come spesso accade, nella pratica ci si deve spingere un po’ più in là del “meglio” che si dovrebbe fare.

No quanto affermi è un errore concettuale, che purtroppo capita spesso, nel quale non si deve cadere, le specifiche non vengono fuori dal nulla o perché un tizio le ha scritte tra un sms e l’altro. :smiley:
Le specifiche tecniche derivano da millemila test strumentali, ma anche empirici, fatti da chi crea uno standard o un componente, non attenersi alle specifiche vuol dire avere la certezza di incorrere in problemi strani che apparentemente non hanno motivo.
Come ti ho detto è lecito usare un cavo di qualche decina di cm per collegare il device al bus perché può essere un problema far arrivare il cavo al dispositivo, ma questo non vuol dire che puoi mettere dei metri di cavo e aspettarti che poi tutto funziona regolarmente.
Se è vero che la teoria deve sempre fare i conti con la pratica è anche vero l’incontrario, la pratica, l’empiricità, da sole non bastano per fare le cose nel modo giusto e affidabile.

In effetti mi stai convincendo ;) Dopotutto faccio questa modifica anche per evitare qualche errore che ho sulla 1-wire... Vorrà dire che allungherò un poco il cavo backbone, collego Arduino e poi ritornerò indietro. Inoltre bisognerà che allunghi un po' i cavi di certi sensori e qui si apre il capitolo di come rendere più stabile quei segnali: magari apro un altro 3d su quell'argomento.