Pages: 1 ... 4 5 [6]   Go Down
Author Topic: 4 Arduino Master Slave in RS485  (Read 9207 times)
0 Members and 1 Guest are viewing this topic.
Global Moderator
Italy
Offline Offline
Brattain Member
*****
Karma: 313
Posts: 21624
Logic is my way
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Code:
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
Logged


Battipaglia (SA)
Offline Offline
Jr. Member
**
Karma: 0
Posts: 70
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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...).
Logged

Global Moderator
Italy
Offline Offline
Brattain Member
*****
Karma: 313
Posts: 21624
Logic is my way
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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?  smiley-lol
Logged


Battipaglia (SA)
Offline Offline
Jr. Member
**
Karma: 0
Posts: 70
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Global Moderator
Italy
Offline Offline
Brattain Member
*****
Karma: 313
Posts: 21624
Logic is my way
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

smiley smiley smiley 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.
Logged


Offline Offline
Full Member
***
Karma: 2
Posts: 105
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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...
Logged

DELHI
Offline Offline
God Member
*****
Karma: 0
Posts: 601
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

AMPS

Napoli
Offline Offline
Sr. Member
****
Karma: 5
Posts: 349
Post fata resurgo
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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 smiley

Saluti,
Dario.
Logged

Souliss - Open-source Distributed Home Automation with Arduino and Android

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

@veseotech

Pages: 1 ... 4 5 [6]   Go Up
Jump to: