Go Down

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

leo72

Vediamo come potrebbe essere un codice di ricezione di uno slave (usa serialEvent):

Code: [Select]
void loop() {
... il resto del codice
}

void serialEvent() {
  byte myCommand = 0;
  boolean dataIsValid = false;
  if (Serial.read() == 0xFF) { //byte di start giusto
    if (Serial.read() == 0x00) { //accetto comandi solo dal master
      if (Serial.read() == 0x01) { //è un comando destinato a me?
        myCommand = Serial.read(); //leggo il comando
        byte lenComm = Serial.read(); //quanto è lungo il pacchetto dati?
        byte tempPack[lenComm];
        byte i = 0;
        unsigned long oldMillis = millis();
        while (lenComm && Serial.available && (millis() - oldMillis < 500) {
          tempPack[i] = Serial.read();
          i++;
          lenComm--;
        }
        if (lenComm != 0) { //se lenComm non è a 0, vuol dire che è uscito per time
          break;
        }
        byte tempCksm = Serial.read();
        if (calcolaChecksum() != tempCksm) { //non torna il checksum
          break;
        }
        switch (myCommand) {
          case 0x00:
            .....
            break;
          case 0x01: //accendo un pin
            digitalWrite(tempPack[0], HIGH); //so che in tempPack[0] c'è il numero del pin 
            break;
        }
        dataIsValid = true;
      }
    }
  }
  if (!dataIsValid) { //c'è stato un errore
    //svuoto il buffer
    while (Serial.available()) {
      byte temp = Serial.read();
    }
  }
}


Il codice NON è testato, il codice fa SCHIFO, il codice NON è ottimizzato, il codice è solo un ESEMPIO.
Non prendetelo per oro colato  :smiley-sweat: :smiley-sweat:

vittorio68

Io forse posso contribuire un po' di più perchè prossimamente dovrò sviluppare concretamente i concetti discussi sinora (e forse si era notato dal tono del mio confronto con leo72).

Purtroppo però non posso promettere tempi certi perchè dipenderà dall'evoluzione del progetto (probabilmente prima dovrò sviluppare un po' di hardware...).

leo72


Io forse posso contribuire un po' di più perchè prossimamente dovrò sviluppare concretamente i concetti discussi sinora (e forse si era notato dal tono del mio confronto con leo72).

Quale tono?  XD

vittorio68

:) :) :) volevo solo dire che avevo insistito molto su aspetti che potevano forse sembrare un po' il pelo nell'uovo

leo72


:) :) :) volevo solo dire che avevo insistito molto su aspetti che potevano forse sembrare un po' il pelo nell'uovo

Beh, ognuno tende a tirar l'acqua verso il proprio mulino.
Quindi se hai intravisto degli aspetti che, per tuo interesse, volevi approfondire, è normale che cercavi di analizzarli a fondo più di altri.

pietro78

Per motivi di tempo e lavoro chiaramente ho dovuto abbandonare questo topic che mi stava tanto a cuore...
Per il protocollo ho lasciato perdere in quanto almeno al momento per le conoscenze che ho significherebbe chiedere giorni e giorni di studio sui libri ...piuttosto ho "semplificato" il concetto di trasmissione tra due Arduino1 collegati in rs485...
Mi spiego meglio:
L'Arduino master invia dei comandi a degli arduino Slave sul bus che sono collegati solo per ricevere comandi e eseguirli senza nessun feedback al master...per il momento il master invia dei comandi tipo serial.Write(O1) ...serial.Write(O2) e lo slave confrontando il byte esegue e pilota in HIGH l'uscita pin in modalità passo-passo...


Per tutto il resto adesso è tutto fermo...spero che almeno con questo post ho riacceso qualche neurone per proseguire il progetto del "simple protocol"...
Ciao un saluto a tutti...

AMPS-N

Can Someone tell me where i can get the code example
AMPS

veseo

Perdonatemi se mi intrometto nella discussione in evidente ritardo, ma credo che ci sia un'aspetto importante da considerare. Parto da quanto ho contributo a realizzare, ovvero lavorare in peer to peer su RS485 evitando l'uso di protocolli Master/Slave.

Per applicazioni domestiche usare una comunicazione in polling a frequenze molto alte è uno spreco, mentre utilizzare un protocollo di comunicazione ad eventi offre tempi rapidi di risposta ed un minore utilizzo delle risorse. Su RS485 il problema è che mancano degli strumenti per gestire le collisoni a livello hardware, ma in casi come le applicazioni domestiche, con poco traffico si possono realizzare delle soluzioni in software.
Cercando qualche soluzione da cui partire, ho trovato uLAN come una soluzione semplice e funzionale (qui il link).

Come anticipavo, sia il protocollo che i driver per la comunicazione sono stati implementati nel progetto Souliss (opensource, basato su Arduino ed Android) dove inoltre c'è una sorta di strato di networking, per cui i dati possono viaggiare anche su Ethernet ed in wireless senza azioni nello sketch (viene gestito tutto in background). Di conseguenza si può usare un Arduino Ethernet come ponte verso SoulissApp (l'applicazione Android dal quale gestire i nodi Souliss) altri nodi sul bus RS485.
Essendoci già il protocollo (binario ed a eventi) per inviare un comando da un nodo ad un'altro, basta una riga di codice.

Per ora alcune persone nel gruppo che segue il progetto hanno realizzato una rete con 4-5 nodi su RS485 a 9600bps, ma è da verificare quale sia il numero massimo ottenibile con questa tecnica. A naso credo che si possa arrivare ad una ventina di nodi per ogni segmento, quindi si possono realizzare diversi segmenti ognuto dei quali unito attraverso una connessione Ethernet, rendendo tutti i nodi visibili tra loro.

Se avete domande sono ben felice di rispondere, se volete collaborare al progetto (adesso siamo una decina di persone attive in sviluppo e circa mille utilizzatori) meglio ancora :)

Saluti,
Dario.
Souliss - Open-source Distributed Home Automation with Arduino and Android

http://www.souliss.net
Follow at @soulissteam

@veseotech

pinox61

Ciao Dario,

sto progettando un sistema di automazione domestica basato su una architettura simile a quella da te descritta, ossia 4-5 nodi Arduino collegati tramite RS-485 e protocollo Modbus ad un Master, sempre Arduino, che opera come gateway verso Souliss. Sto pero' trovando grosse difficolta', per lo piu' dovute alla mia scarsa esperienza in materia, a trovare delle librerie Modbus per Arduino che siano affidabili e semplici da usare. Potresti suggerirmi qualcosa a riguardo?

Grazie
Pino

veseo

Ciao Pino,

librerie Modbus Slave RTU c'è ne sono in giro, non saprei consigliarti quale utilizzare perché ai tempi scrissi una libreria Modbus da zero per Souliss, volendo puoi recuperare quella scaricando al versione A4.5.1, però dovrai rimaneggiarla per utilizzarla all'esterno di Souliss.

Saluti,
Dario.
Souliss - Open-source Distributed Home Automation with Arduino and Android

http://www.souliss.net
Follow at @soulissteam

@veseotech

pinox61

OK, provo a darci uno sguardo. Grazie ancora

Go Up