Pages: [1] 2   Go Down
Author Topic: Comunicazione tra diversi arduino  (Read 2241 times)
0 Members and 1 Guest are viewing this topic.
0
Offline Offline
Full Member
***
Karma: 0
Posts: 111
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Ciao a tutti!

Volevo chiedervi qualche consiglio su cosa utilizzare per mettere in comunicazione più arduino tra di loro.
Nello specifico ho:
- 1 arduino 2009 con ethernet shield
- diversi arduino NANO (ver 3.0)
Il fatto che il 2009 abbia l'ethernet shield montata credo limiti l'utilizzo di altre tecnologie (se non vado errato)
Il fatto che gli altri siano arduino NANO limita l'installazione fisica di altre shield e quindi altre limitazioni.

Il range d'azione di comunicazione dovrebbe essere di diversi metri, all'interno della stessa casa tra sale diverse, quindi parliami di distanze che variano tra i 10 - 30 metri.
Non ho limitazioni nell'utilizzare cablaggio per metterli in comunicazione, se questo può aiutare.

Ho letto qualcosa su I2C, ma mi pare che abbia limitazioni di distanza.

Scopo? Ancora non è chiaro smiley smiley Potrebbe essere per rilevare dati di temperature o azionare qualcosa, ma nulla di più.

Cosa mi consigliate? Esperienze?

GRAZIE!

Simone

PS x moderatore: non sapevo se fosse una questione più hardware o software, a seconda dei consigli, quindi ho postato qui smiley spostate se necessario ovviamente, sorry!
Logged

Offline Offline
Full Member
***
Karma: 4
Posts: 219
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

ti conviene andare su collegamento rs-485 utilizzando la seriale e chip del tipo MAX485 ...sullo stesso bus puoi collegare fino a 255 periferiche ...
ad ogni arduino nano (che a riposo deve stare in ricezione) assegni un indirizzo univoco, poi, tramite protocollo che può essere anche proprietario, con l'arduino master trasmetti sulla linea:
indirizzo nano, porta, valore, checksum.....           una volta che il nano ha decodificato il suo pacchetto ed eseguito il compito, riinvia un ok o i valori che desideri al master....

con questo tipo di connessione se opportunamente bilanciata puoi coprire distanze dell'ordine di centinaia di metri.

chiaramente questa è una descrizione introduttiva... che dovrebbe essere approfondita.
ciao
« Last Edit: August 20, 2012, 04:44:12 am by cyclone » Logged

0
Offline Offline
Full Member
***
Karma: 0
Posts: 111
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

ti conviene andare su collegamento rs-485 utilizzando chip del tipo MAX485 ...sullo stesso bus puoi collegare fino a 255 periferiche ...
ad ogni arduino nano assegni un indirizzo univoco, poi, tramite protocollo che può essere anche proprietario, con l'arduino master trasmetti sulla linea:
indirizzo nano, porta, valore, checksum.....           una volta che il nano ha decodificato il suo pacchetto ed eseguito il compito, riinvia un ok o i valori che desideri al master....

con questo tipo di connessione se opportunamente bilanciata puoi coprire distanze dell'ordine di centinaia di metri.

chiaramente questa è una descrizione introduttiva... che dovrebbe essere approfondita.
ciao

Direi che mi hai dato tutte le informazioni necessarie per iniziare qualche ricerca! Spero ci sia (ma sicuramente) qualche libreria senza dover sviluppare tutto il protocollo di comunicazione.

Grazie!

Simone
Logged

Offline Offline
Full Member
***
Karma: 4
Posts: 219
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

il max485 ha la possibilità di trasmettere e ricevere sullo stesso doppino (pin A e B), quindi hai necessità di configurarlo attraverso l'abilitazione di 2 pin... in TX se devi trasmettere, in RX se devi ricevere. Tutti i MAX485 connessi ai nano di default devono stare in ricezione se vuoi realizzare una architettura Master ->  multi-slave.

Chiaramente l'ideale sarebbe la connessione CAN .. per motivi che non sto qui a elencarti ..   ma per la tua applicazione rs485 va più che bene.
Logged

0
Offline Offline
Full Member
***
Karma: 0
Posts: 111
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

il max485 ha la possibilità di trasmettere e ricevere sullo stesso doppino (pin A e B), quindi hai necessità di configurarlo attraverso l'abilitazione di 2 pin... in TX se devi trasmettere, in RX se devi ricevere. Tutti i MAX485 connessi ai nano di default devono stare in ricezione se vuoi realizzare una architettura Master ->  multi-slave.

Chiaramente l'ideale sarebbe la connessione CAN .. per motivi che non sto qui a elencarti ..   ma per la tua applicazione rs485 va più che bene.

Stavo iniziando a vedere. Bhe, sembra discretamente complesso, ma interessante.
La modalità MASTER/SLAVE permette solo al master ad iniziare la comunicazione, giusto? Ma questo non esclude che lo slave possa rispondere al master sul comando inviato dal master o è monodirezionale?
Multimaster non credo serva, anche se sarebbe migliore a prescindere. In tal caso credo che serva la connessione CAN. Restando in Master Slave mi pare che quindi utilizzerei comunicazione in MODBUS. Corretto?
Logged

Offline Offline
Full Member
***
Karma: 4
Posts: 219
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

dopo che il master invia il comando si mette in ascolto per un lasso di tempo (es.10msec dipende dal baud rate impostato)entro il quale lo slave dopo aver ricevuto ed eseguito il comando deve trasmettere al master i parametri richiesti.
non è necessario utilizzare MODbus se non hai periferiche industriali (commerciali) potresti anche fare di meglio con un protocollo proprietario e magari criptarlo se ad esempio vuoi trasmettere qualcosa via etere o devi portare la connessione fuori dell'abitazione (tipo controllo sirena antifurto).
Logged

0
Offline Offline
Full Member
***
Karma: 0
Posts: 111
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset


Se non erro, riassumendo, con il con MAX485 andiamo ad identificare un Layer1 della struttura, quindi il fisico. Dove passano i dati.
Col Modbus andiamo a specificare il protocollo di comunicazione, quindi parliamo di Layer2. Confermato che il Layer1 indicato via MAX485 sia un buon metodo sul fisico, hai qualche alternativa pratica di librerie per la trasmissione dei dati da consigliarmi, che si adattino alla struttura fisica indicata?
Su playground ho poche idee ben confuse tra le varianti del modbus le quali fra l'altro non ho ben capito se sono utilizzabili qui o meno. Ho trovato questo link http://real2electronics.blogspot.it/2009/09/arduino-and-rs485-english-version.html. Potrebbe fare al caso mio, ma andrebbe riscritta la parte di ACK visto che non contiene risposte. M'immagino uno scenario dove il master richiede l'esecuzione di un comando (ACK Slave sufficiente) o polla delle informazioni (esempio stato del comando precedentemente eseguito o semplicemente per sapere lo stato di un sensore)

Simone
Logged

Offline Offline
Full Member
***
Karma: 4
Posts: 219
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

considerando che sul protocollo modbus abbiamo due varianti ..la ascii e la rtu , sei tu che devi scegliere quale sia la più consona.
in ogni caso con il prot mod certamente puoi leggere e scrivere sia sulle porte (COIL) e sui registri di uno slave... quindi devi organizzare il tutto secondo gli standard usati nei PLC.

ma per non complicarti la vita puoi adottare un formato ascii creando una stringa del tipo "address,comando,porta,valore,checksum"  che il master trasmetterà sulla linea.
il nodo ricevente eseguirà  uno split se l'indirizzo è il suo, un checksum della stringa, per poi passare alla estrapolazione dei vari campi..... e così via.

L'ideale sarebbe quello di configurare la usart a 9 bit  MCPM- Multi Processor Communication Mode, sfruttando la possibilità di implementare su layer basso il riconoscimento dell'indirizzo presente sulla linea seriale senza stare li ad esaminare via int o poll tutte le stringhe presenti sul bus.
« Last Edit: August 20, 2012, 06:04:34 am by cyclone » Logged

Provincia di Milano
Offline Offline
Newbie
*
Karma: 0
Posts: 28
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

l' rs485 con protocollo di comuniazione propietario ha un senso: gli integrati per fare il livello fisico non è un problema ed il protocollo di comunicazione propietario è di facile impelementazione.
 
Il modbus penso che sia decisamente piu complesso da gestire con l'ardware in tuo possesso.
Se proprio vuoi uno standard open per il protocollo di comunicazione, tanto vale buttarsi sul canbus, almeno in questo caso è multi master.

Se non hai distanze impossibili, puoi sempre collegarli con i2c: un paio di metri con i2c classico, una 40-ina di metri con con i2c extenders.
Logged

0
Offline Offline
Full Member
***
Karma: 0
Posts: 111
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

l' rs485 con protocollo di comuniazione propietario ha un senso: gli integrati per fare il livello fisico non è un problema ed il protocollo di comunicazione propietario è di facile impelementazione.
Intendi quindi sviluppare il proprio linguaggio come (credo) è stato fatto nel link indicato precedentemente?
http://real2electronics.blogspot.it/2009/09/arduino-and-rs485-english-version.html

Il modbus penso che sia decisamente piu complesso da gestire con l'ardware in tuo possesso.
Era per avere qualcosa che fosse già pacchettizzato in una libreria, ma se diviene più complicato che altro, allora non ho nulla in contrario a cambiare lungaggio.

Se proprio vuoi uno standard open per il protocollo di comunicazione, tanto vale buttarsi sul canbus, almeno in questo caso è multi master.
Non l'ho ancora visto, solo letto come alternativa. Resta sempre utilizzato lo stesso layer1, quindi via max485?

Se non hai distanze impossibili, puoi sempre collegarli con i2c: un paio di metri con i2c classico, una 40-ina di metri con con i2c extenders.
La distanza potrebbe diventare un problema. Non sapevo dell'esistenza degli extenters (e quante altre cose ignoro!).... potrebbe diventare quindi altra alternativa. In caso di I2C, non vado più ad utilizzare il MAX485 giusto?

eh, abbiate pazienza smiley-wink

Grazie, Simone
Logged

Provincia di Milano
Offline Offline
Newbie
*
Karma: 0
Posts: 28
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

canbus, modbus,  ecc sono degli standard di comunicazione che coprono i primi 2/3 layer dello standard iso: Open Systems Interconnection
In realtà, quasi tutti da un punto di vista fisico si basano sul rs485 perchè è praticamente immune al rumore e copre molte distanze, per poi differire nei protocolli di trasferimento dei dati.

Devi considerare che supportare il protocollo can, modbus, o qualsiasi altro standard che ti aggrada, dal punto di vista di arduino oltre ai vari transceiver (per il can c'è un apposito shield ) per ogni protocollo, devi caricare anche le librerie nello schacht arduino... che possono essere onerosi dal punto di vista delle risorse usate!

Dal mio punto di vista, se devo fare una fatica per importare un protocollo nel sistema che sto progettando, sono più orientato al can in quanto è multimaster.

Se invece il progetto è molto semplice, posso pensare di implementare un protocollo di comunicazione propietario come descritto
qualche post prima di me da cyclone, in cui un arduino fa da master e fa polling su tutti gli altri dispositivi.


I2c è un altro protocollo  per straferire informazione che è completamente diverso da rs485 nel seguente link puoi avere una breve introduzione dei vari protocolli con arduino: Comparison of transfer protocols
Logged

0
Offline Offline
Full Member
***
Karma: 0
Posts: 111
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset


giusto, non ho preso molto in considerazione la memoria disponibile all'arduino e il peso delle librerie più o meno complesse. Credo che tenterò dunque la strada utilizzando i max485 e un protocollo simile a quello indicato nel mio link. Vedremo che ne esce fuori.

Grazie della panoramica e dei link che non esiterò a leggermi con calma.

Simone
Logged

0
Offline Offline
Full Member
***
Karma: 0
Posts: 111
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset


Ciao a tutti!

Vi ridisturbo con qualche altro piccolo dubbio.
Se volessi utilizzare questo transceiver per comunicare con altri arduino: nRF24L01... potrei implementare ANCHE il MAX485 per parlare con altri arduino via cavo? Esempio il master comunica con alcuni slave via radio, con altri via cavo. Il msg viene spedito a tutti e solo lo slave con l'address corretto tratterà il messaggio.
Se non posso, consigli?

Inoltre, se l'arduino master ha installato anche la shield ethernet, la quale utilizza i pin 11, 12, 13 se non erro, posso collegarci il transceiver nRF24L01? Sembra che necessiterebbe dei stessi pin...
Se non va, consigli? smiley

Grazie delle informazioni come al solito!

Simone


Logged

Provincia di Milano
Offline Offline
Newbie
*
Karma: 0
Posts: 28
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

per essere fattibile forse lo è, ma ti complicheresti la vita ... e di molto!

dovresti fare un bus spi tra arduino, Nrf24L01 e il MAX485, come illustrato nel seguente link:
http://tronixstuff.wordpress.com/2011/05/13/tutorial-arduino-and-the-spi-bus/


Logged

0
Offline Offline
Full Member
***
Karma: 0
Posts: 111
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset


Sembra parecchio complicato per le mie possibilità...
Alternative?
Vorrei far comunicare questi arduino e non vorrei far perdere al master il modulo Ethernet che già sto usando. L'utilizzo del transceiver radio mi permetterebbe di restare sul wireless, ma se non ho capito male va in conflitto con lo shield Ethernet.

Ma se facessi così:

Master con Ethernet shield comunica via max485 con un arduino nano. L'arduino nano monta poi in aggiunta il modulo radio e parla con gli altri arduino nano via radio.
All'arrivo di una richiesta web, parla via max485 all'arduino nano. La funzione client di listening via rs485 riceve la richiesta. Se è per se la tratta e risponde. Se non lo è, all'interno della funzione di client rs485 esegue una chiamata come master via radio e parla via con gli altri arduino.
Fattibile o sto scrivendo molte cavolate? :-)

Grazie!!

Simone
Logged

Pages: [1] 2   Go Up
Jump to: