Modbus e elettricità

Ciao ragazzi;
Sono nuovo nel forum e dopo essermi presentato nell'apposita sezione sono già qui a chiedervi qualche dritta. In realtà ho già letto qualche discussione di ieri in relazione alla comunicazione seriale tra più arduino (mi pare si chiamasse così il thread). Comunque veniamo al sodo io avrei necessità tramite un sensore di corrente di monitorare il consumo del mio contatore energetico di casa. Dopodichè tramite un modulo xbee inviare ad un altro arduino posto in casa mia il valore letto e visualizzare su di un display il valore istantaneo e vari valori che verranno calcolati. Per fare tutto ciò utilizzerò due Arduino UNO con relativa xbee shield e modulo xbee. Quel che mi preoccupa come leggevo ieri nella discussione citata è che dovrò creare un protocollo tra i due Arduino per essere sicuro che effettivamente arriva il pacchetto contenente i dati. In poche parole dovrebbe essere l'equivalente del TCP nelle connessioni internet. Ora ho cercato come suggerito nel post informazioni sul modbus e sono riuscito a scaricare le due librerie master e slave ma purtroppo non sto capendo molto bene come funzionano. Ho provato a leggere qualche documento in inglese ma non ci capisco molto. Le domande principalmente sono: come fanno a comunicare i due Arduino? Cioè tramite quale piedino del Arduino devo collegare l'xbee? Altra informazione come faccio ad identificare univocamente in questa "rete" il dispositivo Arduino? E quelle varie informazioni di controllo come si aggiungono? Quale è la funzione che mi consente di inviare poi successivamente il pacchetto e di conseguenza leggerlo sull'altro? Invece una cosa che credo di aver chiaro è circa l'unione di più info su di un unico canale trasmissivo. Ricevo più informazioni da più sensori faccio una concatenazione di stringhe separate da uno specifico delimitatore e dopodichè le invio. Dall'altra parte avrò invece un array di char e un ciclo for che scorre l'intera stringa ricevuta e la memorizza in una posizione specifica dell'array e quando arriva al delimitatore si ferma. Giusto?

Attento, se per la trasmissione usi gli Xbee .. non ti devi preoccupare ... già loro usano un protocollo altamente affidabile (normalmente 802.15.4) quindi ...

... il modulo che legge, trasmette con Xbee la lettura, il modulo a casa riceve via Xbee e visualizza ... la trasmissione ed il controllo dei dati trasmessi è affidata agli Xbee :slight_smile:

Se proprio vuoi essere sicurissimo ... aggiungi semplicemente un CRC al pacchetto di dati che trasmetti :wink:

Guglielmo

E se per esempio mi spostassi sui moduli bluetooth... Dando un occhiata ai prezzi ho notato che non scherzano mica i moduli xbee...

... esattamente perché sono oggetti complessi ed affidabili ... XD

Con i bluetooth è come se avessi un pezzo di filo ... devi fare tutto tu, incluso il protocollo ... e non aspettarti di raggiungere le distanze che puoi raggiungere con gli Xbee !!! :roll_eyes:

Guglielmo

La distanza sono circa 5 mt. Sono troppi per i moduli bluetooth? Che intendi per fare il protocollo da me? Non ci dovrebbe pensare la libreria modbus?

A, si, se usi quella si ... :slight_smile:

5 mt. vanno bene ... fino a 9/10 mt. in buone condizioni, non hai problemi !

Guglielmo

Ok allora ricapitolando fammi vedere se ho capito bene... Io ho il modulo HC-05(modulo bluetooth) collegato ad Arduino tramite softwareserial in modo tale da lasciar libera l'hardware serial. Tramite la mia libreria MODBUSMASTER invio dati allo SLAVE il quale li riceve e li scompatta. Ma il modbus inserisce un indirizzo univoco del dispositivo Arduino... Questo lo definisco io con quale istruzione? Inoltre per inviare l'intero pacchetto userò una funzione chiamata write(id_dispositivoricevente,byte_controllo,pacchetto_dati,byte_finetrasmissione)?
Dallo slave invece avrò read(id_dispositivotrasmittente,byte_controllodaescludere,pacchetto_dati,byte_finetrasmissionedaescludere)?

Non è proprio così banale, anzi ...
... e un protocollo molto affidabile e stabile, ma proprio per questo offre svariate possibilità. Se lo vuoi usare tocca che ti metti li e prima ti studi le basi del protocollo e come funziona, poi ti devi studiare le librerie e poi ... forse riuscirai ad usarlo XD XD XD

Il fatto che mastichi male l'inglese ... introduce un bel grado di difficoltà visto che la maggior parte della documentazione è proprio in inglese ... :roll_eyes:

L'altra strada è che ti inventi un piccolo protocollo tu ... tanto se ho ben capito non ti serve una cosa multipoint con tutte le svariate possibilità del MODBUS ...
Se fai una ricerca qui sul forum se ne è parlato anche ultimamente con un utente che aveva problemi con la seriale ... :wink:

Guglielmo

Si si esatto io non ho bisogno di una cosa multipoint mi basterebbe semplicemente inviare all'Arduino i vari dati leggerli e metterli in un array quindi il funzionamento che ho descritto alla fine del mio primo post potrebbe essere giusto? Inoltre non importa identificare un dispositivo specifico giusto?

Se è un point-to-point non hai bisogno di identificare nulla ... sono solo due unità, una trasmette ed una riceve XD

Se vuoi usare i moduli BT ... ti conviene usare hli HC-05 visto che ne dovrai definire uno MASTER (quello che accetta la connessione) ed uno SLAVE (quello che si connette al master) :wink:

Per il resto ... dovrai giusto implementare un piccolo protocollo per scambiare informazioni con una certa affidabilità ...

Leggi da QUI per i successivi 5 post :wink:

Guglielmo

Quindi il trasmettitore potrebbe avere un codice così:

#include <SoftwareSerial.h>
SoftwareSerial serialeSoftware(RX, TX);
int letturaSensore = 0;
void setup() {
  serialeSoftware.begin(9600);

}

void loop() {
  while (true) {
    letturaSensore = analogRead(A0);//qui andrà specificato il piedino di trasmissione del sensore di corrente
    if ((String)serialeSoftware.read() == "0X00") {
      //errore
    } else() {
      serialeSoftware.print("0x02"); // dico che ho iniziato la trasmissione
    }
    if ((String)serialeSoftware.read() == "0X00") {
      //errore
    } else() {
      serialeSoftware.print(letturaSensore); // mando tutti i dati ecc…
    }
    if ((String)serialeSoftware.read() == "0X00") {
      //errore
    } else() {
      serialeSoftware.print("0x03"); // dico che è finita la trasmissione
    }
    if ((String)serialeSoftware.read() == "0X00") {
      //errore
    } else() {
      serialeSoftware.print("0x04") // chiudo la trasmissione
    }
  }
}

Mentre il ricevitore sarà:

#include <SoftwareSerial.h>
SoftwareSerial serialeSoftware(RX,TX);
int letturaSensore = 0;
void setup() {
  serialeSoftware.begin(9600);

}

void loop() {
  if(serialeSoftware.available()>0){
    if((String)serialeSoftware.read()=="0X02"){
      letturaSensore= softwareSerial.read();
      if((String)serialeSoftware.read()=="0X03"){
        if((String)serialeSoftware.read()=="0X04"){
          softwareSerial.close();
          } else(){
            softwareSerial.print("0X00");
            }
         } else(){
            softwareSerial.print("0X00");
            }
        } else(){
            softwareSerial.print("0X00");
            }
            }
}

... direi che lo provi e verifichi se va o se non va e poi ... chiedi quello che non capisci :wink:

Guglielmo