Protocolli per non brevi distanze

ciao,
Ho deciso di rispolverare Arduino per dei progetti che mi piacerebbe intraprendere...
Il punto principale è come far dialogare vari Arduino tra una stanza è l'altra.
Fortunatamente esistono molte librerie per fare ciò, scarterei il Can bus perché richiede troppe connessioni ed un cip dedicato MCP2515 + 2551 ecc.
principalmente pensavo al RS485 per la semplicità del circuito con qualche bus già bello fatto!
Ma sono aperto a qualsiasi suggerimento.
Considerando che questa problematica è stata già affrontata da molti di Voi,
mi piacerebbe ricevere un consiglio per non inoltrarmi in strade che non portano molto lontano.
Quello che mi sconcerta è quantità di librerie per Modbus ma quale scegliere?
Esiste anche il Dmx ma da una superficiale lettura non sembra essere bidirezionale.

Grazie

Luca

l'rs485 dovrebbe essere più che sufficiente.
Però non è una "breve" distanza; per breve distanza io penso all'i2c o alla SPI che al massimo arrivano ad una decina di centimetri!
se correggi il titolo sono sicuro che avrai più aiuto.

Tra l'altro se ne è già parlato spesso, la cosa migliore IMHO è un chip da seriale rs232 livelli TTL (insomma, la seriale di arduino) in RS485; Infatti la libreria SoftwareSerial ti permette di trasformare due pin qualsiasi dell'arduino in TX/RX (ma per via dell'implementazione software puoi rivecevere a massimo 19200baud e scrivere poco più velocemente, ma di solito è più che sufficiente), e quindi creare facilmente una rete con molti collegamenti. Infice credo che i chip siffatti siano abbastanza economici (max485 CREDO vada bene, verica se i livello sono ttl o no)

I 75176 sono migliori, costano meno e sono meno sensibili alle interferenze.

lesto:
(max485 CREDO vada bene, verica se i livello sono ttl o no)

Confermo ttl!

@ leo72 i 75176 = € 0,672 i max 485 € 3,12 ottimo consiglio! :stuck_out_tongue_closed_eyes:

Grazie per la risposta ma mi chiedevo volendo usare un protocollo, ed essendocene parecchi e con molte discussioni in merito, verso quale sarebbe meglio orientarsi?

Allora, se hai bisogno di una connessione multimaster mi sembra che la CAN lo sia. Se ti basta monomaster e multislave potresti utilizzare il Modbus. Come librerie potresti utilizzare queste:
https://sites.google.com/site/jpmzometa/arduino-mbrt

Quasi sicuramente vanno adattate all'IDE di Arduino 1.x ma è una cavolata.
Non sono state implementate tutte le funzioni previste dallo standard ma dovrebbero bastare. Vedi un po' te.

Per il master ti segnalo anche questa libreria:
http://www.arduino.cc/playground/Code/ModbusMaster

Il modbus secondo me fa al caso tuo perché prevede fino a 127 slave, è standardizzato, universalmente riconosciuto e prevede anche un controllo sull'integrità dei dati mediante un controllo CRC.

EDIT: Dai un'occhiata anche qui:

Parla della I2C (chiamata anche TWI), la quale prevede il multimaster.

EDIT2: Altrimenti ancora perché non le Wifi-shield?

Janos:
EDIT2: Altrimenti ancora perché non le Wifi-shield?

PEr ora vorrei concentrarmi solo su protocolli via filo

Ma la domanda forse banale è con un monomaster:
Può uno slave fare sniffing dei dati sulla rete per vederli dal monitor seriale ?
o questo è prerogativa dell master?
Se non ho capito male esiste la filtratura dei dati che dovrebbe dipendere dall' indirizzo dello salve?

Vi ringrazio per la pazienza :slight_smile: e come si capirà la confusione nella mia testa non è poca.... :slight_smile:

Si, è possibile effettuare lo sniffing dei dati. Tutti gli slave ricevono gli stessi dati ma solo quello con quel dato indirizzo risponde. Inoltre il CRC ti permette di avere sicurezza sull'integrità dei dati ma contro alterazioni dovute da interferenze, mentre è sensibile di un eventuale attacco intenzionale.

Wikipedia:
Utile per l'individuazione di errori casuali nella trasmissione dati (a causa di interferenze, rumore di linea, distorsione), il CRC non è invece affidabile per verificare la completa correttezza dei dati contro tentativi intenzionali di manomissione. A tal fine sono utilizzati algoritmi di hash quali MD5 e SHA1, più robusti seppur computazionalmente meno efficienti.

In pratica il master invia sul bus un messaggio del tipo "slave X, funzione Y(ad esempio letti un valore), altri comandi, CRC". Solo lo slave interrogato, se ha correttamente interpretato il messaggio, risponde ma tutti hanno ricevuto lo stesso messaggio.
Per vedere come è fatto un meggaggio "frame" di una comunicazione Modbus puoi vedere qui:

Ciao,
Forse sto capendo, esempio per capire meglio il problema...
In un appartamento ho 4 o 5 sensori di temperatura questi probabilmente arduino tiny
si dovrebbero comportare da Slave Giusto?
Voglio visualizzare la temperatura su vari lcd ma questi cosa sarebbero?

Soluzione 1) il master riceve i dati se questi cambiano li ritrasmette il nuovo dato agli salve lcd?
Soluzione 2) Gli slave Lcd possono intercettare i dati temperatura e visualizzarli autonomamente.

Volendo utilizzare un protocollo tipo Modbus dovrei ragionare con la soluzione 1?

grazie

Non ho capito... :sweat_smile:

Allora, fa tutto il master, sia inviare che ricevere i dati. Quando il master invia sul bus un messaggio tutti gli slave lo ricevono ma solo quello che corrisponde a quel dato indirizzo lo elabora, tutti gli altri semplicemente lo ignorano. Sarà il master che farà un polling su tutti i sensori per sapere le varie temperature, gli slave non possono di loro iniziativa inviare dati al master e tantomeno fra di se.

Janos:
slave non possono di loro iniziativa inviare dati al master e tantomeno fra di se.

Forse ho capito il principio, Il vantaggio è non avere dati Che si scontrano collidono nel bus, perchè i vari nodi in un certo senso sono diretti dal master.

Quindi in questa ottica è preferibile l'adozione di un protocollo come Modbus.

Grazie

Luca

llluca:
scontrano nel bus

si dice collisione, se cerchi trovi tanta roba su questo problema

Parlando di modbus, monomaster non significa che gli slave non possono inviare dati al master, monomaster significa che il master e' l'unico in grado di ricevere richieste (lettura e scrittura). Le richieste possono essere di vario tipo in base al tipo di dato da gestire e all'operazione da eseguire. Con una richiesta di scrittura puoi inviare dati al master da un qualsiasi slave, mentre con una richiesta di lettura lo slave richiede dei dati al master e il master invia i dati richiesti al client che li ha richiesti (non a tutti).

Perche non modbus TCP e shield ethernet?

Grazie! (forse) ho capito! è esattamente quello che avevo in mente...

amacbr:
Perche non modbus TCP e shield ethernet?

oltre a una ovvia questione di costi vedi ethernet shield vs 75176 quali vantaggi avrei in + ?

Chiedo scusa fin da ora per la banalità della domanda ma vorrei capire alcune cose.
Analizzando l'esempio SimpleModbusSlaveExample:

modbus_configure(9600, 1, 2, TOTAL_REGS_SIZE);

9600 = velocità
1= indirizzo dispositivo da 1 a 127 (mio pensiero lo 0 = master?)
2= pin numero due (int0 o quarto pin fisico) connessi a re -de del max485 (posso usare qualsiasi digital pin?)
ma Rx e Tx sono sempre fissi o li posso modificare?

TOTAL_REGS_SIZE = array dei dati

Grazie per la pazienza
Luca

llluca:
Grazie! (forse) ho capito! è esattamente quello che avevo in mente...

amacbr:
Perche non modbus TCP e shield ethernet?

oltre a una ovvia questione di costi vedi ethernet shield vs 75176 quali vantaggi avrei in + ?

  • la diagnostica (sniffing con wireshark)
  • simulatori (sia master che slave) se ne trovano tanti in internet
  • integrazione su una eventuale rete esistente
  • l'alimentazione da poe

Ma scrivere "Protocolli per lunghe distanze" era complicato?

pablos:
Ma scrivere "Protocolli per lunghe distanze"

Ciao! Pablos quanto tempo ti ricordi...
Il titolo è stato modificato su suggerimento di lesto e la mia fantasia e pigrizia mi ha indotto ad aggiungere un semplice "non"

Ma ciaoooo :smiley: :D... scusa il tuo vecchio account non era lluca? quando lavoravi col javascript? ora ti dai ai protocolli a righe e quadretti? XD
Non dirmi che hai perso la password :slight_smile:

Ciaooooo!
no no sono sempre io :slight_smile: invece tu hai perso un numerino... (72 se non ricordo male)

pablos:
ora ti dai ai protocolli a righe e quadretti? XD

Spiegati meglio????