Go Down

Topic: 4 Arduino Master Slave in RS485 (Read 12 times) previous topic - next topic

peppe91

Salve a tutti ragazzi, rinnovo il mio entusiasmo nel far parte di questo forum e sottopongo subito il mio problema. Sto realizzando un sistema domotico ed ho bisogno di un master che mi gestisca 3 slave connessi fra di loro tramite seriale. Ho trovato questo utilissimo articolo: http://real2electronics.blogspot.it/2009/09/arduino-and-rs485-english-version.html ma devo dirvi la verità...non c'ho capito molto... il mio master oltre ad impartire i comandi per l'accensione/spegnimento dei carichi deve anche fare una lettura dei sensori analogici...ovvero sensori gas e fumo (MQ-7 e MQ-2) sensori PIR e sensori reed per l'antifurto, temperatura ecc le letture sono richiamate esclusivamente dal master...quindi da aggiungere a quel codice mi servirebbe una sorta di: se lo slave riceve quel dato fa la lettura dei sensori e la invia al master...ma non so come fare utilizzando la tecnica dell'articolo...spero possiate aiutarmi...grazie 1000 a tutti voi...un saluto

leo72

La tecnica è abbastanza semplice.
Il tizio ha creato un protocollo di trasmissione:

Quote
Byte 1: Start Byte ( 0 hexadecimal ).
Byte 2-3: ASCII Arduino's address.
Byte 4: Byte ENQ, ACK or NAK (0x05h, 0x06h y 0x15h) .
Byte 5: ASCII Requested command.
Byte 6 y 7: ASCII Function number.
Byte 8: Sign byte (Positive 0x20h y Negative 2D)
Byte 9-12: ASCII of data bytes (0x00h-0xFFFFh)
Byte 13: Byte EOT (End of Text) (0x03h)
Byte 14-15: Checksum (addition from 2nd byte to 13th byte)

Come vedi, il dialogo avviene mediante l'invio di 16 byte.
Il 2° e 3° byte compongono l'indirizzo del dispositivo a cui sono spediti i dati.
Nel codice degli slave c'è, dopo la parte di ricezione dei dati, l'analisi dell'indirizzo. Se uno slave trova corrispondenza fra l'indirizzo del comando che ha ricevuto ed il suo indirizzo (che tu hai memorizzato nello sketch), allora sa che quel comando è destinato a lui e lo esegue.

peppe91


La tecnica è abbastanza semplice.
Il tizio ha creato un protocollo di trasmissione:

Quote
Byte 1: Start Byte ( 0 hexadecimal ).
Byte 2-3: ASCII Arduino's address.
Byte 4: Byte ENQ, ACK or NAK (0x05h, 0x06h y 0x15h) .
Byte 5: ASCII Requested command.
Byte 6 y 7: ASCII Function number.
Byte 8: Sign byte (Positive 0x20h y Negative 2D)
Byte 9-12: ASCII of data bytes (0x00h-0xFFFFh)
Byte 13: Byte EOT (End of Text) (0x03h)
Byte 14-15: Checksum (addition from 2nd byte to 13th byte)

Come vedi, il dialogo avviene mediante l'invio di 16 byte.
Il 2° e 3° byte compongono l'indirizzo del dispositivo a cui sono spediti i dati.
Nel codice degli slave c'è, dopo la parte di ricezione dei dati, l'analisi dell'indirizzo. Se uno slave trova corrispondenza fra l'indirizzo del comando che ha ricevuto ed il suo indirizzo (che tu hai memorizzato nello sketch), allora sa che quel comando è destinato a lui e lo esegue.


Grazie innanzi tutto per la risposta...per i byte 1,2,3 ci sono...non ho capito a che serve il 4 il 5 dovrebbe richiamare il comando (ad esempio digtalwrite, analogread ecc)???? giusto? il 6 e 7 non ho capito nemmeno e poi i successivi sono uguali per tutte le comunicazioni...giusto? nel codice che c'è li sul sito qual'è la parte che analizza il codice ricevuto con quello memorizzato nello sketch ed esegue l'operazione richiesta? che ovviamente è la parte che interessa a me per inserire i nuovi comandi? ed un ultima cosa....mettiamo caso che io dovessi fare la lettura di un sensore da uno slave e riportare il valore sul master...come posso fare? grazie davvero per l'aiuto...

leo72

L'utente ha creato quel protocollo.
I byte ACK, ENQ e NAQ sono solo per la gestione della comunicazione. A dir la verità, per una semplice rete di sensori, non ha molto senso. In pratica: spedisci un comando; tu lo ricevi e rispondi di averlo ricevuto e capito; il master ri-riceve la risposta. Manco dovesse autorizzare il lancio di una testata nucleare  :smiley-yell:

Puoi ridurre enormemente il tutto.
Byte di start
Byte di indirizzo (con un byte puoi indirizzare 256 dispositivi)
Byte per il comando (come sopra, con 1 byte puoi creare 256 comandi)
Dati per il comando (qui deciderai tu)
Byte di stop
Byte di checksum (una semplice somma dei byte)

Per i comandi, devi fare quel che ti serve.
Vuoi fare la lettura di un sensore?
Byte 0x00 -> mettiamo: lettura analogica
A seguire il byte del sensore/porta da leggere.

Una volta fatta la lettura, spedisci il dato sulla linea. La RS485 altro non è che un'estensione della seriale. Quindi tu devi solo fare un serial.write e spedire i dati con lo stesso protocollo.
Come indirizzo metterai quello del master. Il master vedrà che i dati sono indirizzati a lui e li leggerà.

peppe91

In effetti devo fare esattamente ciò che hai descritto...ma sai com'è...quando uno non sa come fare si affida a ciò che è già scritto...anche se poi carica un sacco di cose inutili...tra l'altro mi è molto comodo un codice più semplice...

quindi per quanto riguarda quello che mi hai detto:
"Per i comandi, devi fare quel che ti serve.
Vuoi fare la lettura di un sensore?
Byte 0x00 -> mettiamo: lettura analogica
A seguire il byte del sensore/porta da leggere."

ad esempio per la lettura devo dare(dal master):
byte di start: 0x00
byte di indirizzo: 0x30 0x31 (01)
byte di comando:
byte dati comando:
byte di stop: 0x01
byte di checksum: 0xEE

continuo a non capire i byte del comando e quello dei dati...cioè il byte del comando specifica il tipo di comando? digitalWrite, analogRead ecc...oppure specifica solo che si sta eseguendo un operazione e quale che viene poi elaborata da chi riceve il comando? oppure il byte di comando e quello dei dati formano un unica cosa ad esempio D04 (0x44 0x30 0x34) e poi bisogna specificare sullo slave?

if ((function=='D') && (function_code==0)){
             if (data_received==4){
               digitalWrite(1,HIGH);

Go Up