Arduino Uno + Inverter Aurora

Salve,

sto cercando di connettere via RS485 una scheda arduino Uno all'inverter fotovoltaico Aurora che ho installato per il mio impianto fotovoltaico a casa.
Per la connessione dei dispositivi ho usato lo schema di cui al link di seguito.

http://www.google.it/imgres?imgurl=http://dereenigne.org/wp-content/uploads/modbus.png&imgrefurl=http://dereenigne.org/tag/max485&h=1020&w=709&sz=107&tbnid=1vw70snqz-HqJM:&tbnh=90&tbnw=63&zoom=1&usg=__rDlciuXalz96qcTZQW3sPPKWOVw=&docid=oN62DW03Eq9oSM&hl=it&sa=X&ei=fqjoUMjiAemr4ASxlYC4BA&ved=0CDcQ9QEwAA&dur=4797

Quindi collego il GRD di arduino al GRD dell'inverter, i pin TX e RX di Arduino alle corrispondenti uscite dell'inverter e il PIN 2 per la trasmissione del messaggio.

Per quanto riguarda i messaggi, il formalismo accettato dall'inverter Aurora è quello delle immagini in allegato: trasmissionMessage.jpg e receivingMessage.jpg rispettvamente di 10 byte e 8 byte

Per quanto riguarda il codice in Arduino io mi sto orientando sul seguente:

Code:

byte            RFin_bytes[9];

#define  pinTx    01
#define  pinRx    00


#include <NewSoftSerial.h>
  

void setup() 
{
   pinMode(pinTx,OUTPUT);
   pinMode(pinRx,OUTPUT);
   digitalWrite(pinTx,HIGH);
   digitalWrite(pinRx,LOW);
   pinMode(2,OUTPUT);
   Serial.begin(9600);
}

void sendMSG(byte address,byte command,byte b2,byte b3,byte b4,byte b5,byte b6,byte b7,byte crc_l,byte crc_h)
{
  Serial.write(12345);
//Generic command call 
  Serial.write(command);
  Serial.write(b2);
  Serial.write(b3);
  Serial.write(b4);
  Serial.write(b5);
  Serial.write(b6);
  Serial.write(b7);
  Serial.write(crc_l);
  Serial.write(crc_h);
  delay(100);
//After trasmission PinTx is set LOW
  digitalWrite(pinTx,LOW);
}








void loop() 
{
  delay(500);
  digitalWrite(pinTx,HIGH);    
//Inizio la trasmissione delle richiesta all'inverter Aurora
  if (pinTx==HIGH)
  {
//Invio richiesta STATO Inverter 
    pinMode(2,OUTPUT);
    sendMSG(12345,50,0,0,0,0,0,0,1,2);
    delay(50);
//Predispongo per ricezione risposta da inverter
    pinMode(2,INPUT);
    while (Serial.available()<8) {} // Wait 'till there are 9 Bytes waiting
    for(int n=0; n<8; n++)
    {
       RFin_bytes[n] = Serial.read(); // Then: Get them.  
//A questo punto si tratta di riconoscere con degli if then quale sia il msg ricevuto -- codice da definire
    }
  }  
//Invio richiesta stato Measure request DSP
    pinMode(2,OUTPUT);
    sendMSG(12345,59,0,0,0,0,0,0,1,2);
    delay(50);
    pinMode(2,INPUT);
    while (Serial.available()<8) {} // Wait 'till there are 9 Bytes waiting
    for(int n=0; n<8; n++)
    {
       RFin_bytes[n] = Serial.read(); // Then: Get them.  
//A questo punto si tratta di riconoscere con degli if then quale sia il msg ricevuto -- da definire
    }
}


Quindi come si vede avrei intenzione di lanciare il msg sul BUS RS485, attendere il ritorno dall'inverter e successivamente riconoscerne il ritorno.

Qualcuno ha indicazioni o suggerimenti a riguardo?


Grazie,
saluti

receivingMessage.jpg

La RS485 non ha ne massa ne TX e RX. Come hai fatto il collegamento tra arduino e inverter?

Ciao Uwe

Ciao Uwe,
dal manuale Aurora io ho quanto di seguito:

La porta di comunicazione RS485 rappresenta la porta di comunicazione dell’inverter. AURORA sfrutta una linea di
comunicazione RS485 HALF-DUPLEX costituita da due linee di trasmissione ricezione (+T/R e –T/R) e da una linea di riferimento
della comunicazione (RTN): tutte le tre linee devono essere cablate in accordo allo schema daisy chain (“entra-esci”). E’
consigliabile utilizzare un cavo a coppie twistate e schermato per la realizzazione della linea di comunicazione: lo schermo
deve essere collegato a terra in un solo punto (tipicamente in prossimità del sistema di monitoraggio) ed allo schermo deve
essere data continuità all’interno di ciascun elemento della catena. Fare riferimento all’appendice B.

Quindi io collegherei la massa di Arduino alla RTN dell'inverter e il Pin Tx alla +T/R e il Pin Rx alla –T/R.
In verità non ho ancora effettuato il collegamento.
Ho trovato su internet lo schema che ti riportavo con la MAX485 , ma fisicamente non li ho ancra collegati.

Se hai suggerimenti, sono ben acetti, chiaramente.

Grazie,
Gerry

Half duplex sigifica che uno trasmette e l altro ascolta e poi in un altro momento uno ascolta e l' altro trasmette. Non puó essere trassmissione nelle 2 direzioni ( Arduino al Inverter e Inverter al Arduino nello stesso momento) come lo permette la RS232.

La RS485 ha 2 fili. Quello positvo e quello negativo.

Hai messo il MAX485 rea Arduino e Inverter? Dalla descrizine del circuito non sembra.

Ciao Uwe

Ciao Uwe e grazie anzitutto.

Guarda, il circuito di collegamento verso l'inverter è quello del link di cui sotto e il max485 c'è.

http://www.google.it/imgres?imgurl=http://dereenigne.org/wp-content/uploads/modbus.png&imgrefurl=http://dereenigne.org/tag/max485&h=1020&w=709&sz=107&tbnid=1vw70snqz-HqJM:&tbnh=90&tbnw=63&zoom=1&usg=__rDlciuXalz96qcTZQW3sPPKWOVw=&docid=oN62DW03Eq9oSM&hl=it&sa=X&ei=fqjoUMjiAemr4ASxlYC4BA&ved=0CDcQ9QEwAA&dur=4797

Tu dici quindi che sto sbagliando nel collegamento.
Guarda, in allegato c'è l'immagine di quelli che sono i collegamenti RS485 esposti dal mio Inverter Aurora.
Come puoi vedere ci sono le seguenti uscite:
+T/R
-T/R
RTN
LNK

Hai suggerimenti su come collegare correttamente Arduino uno alla RS485 dell'inverter?

Grazie,
Gerry

collegamentiRS485InverterAurora.jpg

collegamentiRS485InverterAurora_2.jpg

gerrynigro:
Ciao Uwe,
dal manuale Aurora io ho quanto di seguito:

La porta di comunicazione RS485 rappresenta la porta di comunicazione dell’inverter. AURORA sfrutta una linea di
comunicazione RS485 HALF-DUPLEX costituita da due linee di trasmissione ricezione (+T/R e –T/R) e da una linea di riferimento
della comunicazione (RTN): tutte le tre linee devono essere cablate in accordo allo schema daisy chain (“entra-esci”). E’
consigliabile utilizzare un cavo a coppie twistate e schermato per la realizzazione della linea di comunicazione: lo schermo
deve essere collegato a terra in un solo punto (tipicamente in prossimità del sistema di monitoraggio) ed allo schermo deve
essere data continuità all’interno di ciascun elemento della catena. Fare riferimento all’appendice B.

Quindi io collegherei la massa di Arduino alla RTN dell'inverter e il Pin Tx alla +T/R e il Pin Rx alla –T/R.
In verità non ho ancora effettuato il collegamento.
Ho trovato su internet lo schema che ti riportavo con la MAX485 , ma fisicamente non li ho ancra collegati.

Se hai suggerimenti, sono ben acetti, chiaramente.

Grazie,
Gerry

Rtn puoi anche non collegarlo, non serve a niente.
Non mi ricordo esattamente quale sia la velocità da impostare sulla porta, ma non mi pare 9600.
Per inviare un dato tramite la 485, prima dei impostare la seriale con serial.begin , poi devi mettere a livello alto il pin 2 di Arduino, fare serial.write del messaggio che vuoi inviare e rimettere a livello basso il pin 2 di Arduino.
A questo punto devi metterti ad ascoltare cosa risponde l'inverter con serial.available e serial.read .
Ma tu sai già quali sono i comandi da inviare all'inverter per ricevere determinati valori?
Perchè se non sai cosa chiedere è inutile che tu sappia come chiederlo. :grin:

P.s. per le indicazioni mi sono basato sullo schema che hai linkato .

Ciao Uwe,
quindi tu dici che, OK per la parte circuitale di cui sotto...

http://www.google.it/imgres?imgurl=http://dereenigne.org/wp-content/uploads/modbus.png&imgrefurl=http://dereenigne.org/tag/max485&h=1020&w=709&sz=107&tbnid=1vw70snqz-HqJM:&tbnh=90&tbnw=63&zoom=1&usg=__rDlciuXalz96qcTZQW3sPPKWOVw=&docid=oN62DW03Eq9oSM&hl=it&sa=X&ei=fqjoUMjiAemr4ASxlYC4BA&ved=0CDcQ9QEwAA&dur=4797

Anziche' come pensavo io, semplicemente collegare il PIN 2 di Arduino al PIN +T/R dell'inverter e mettere HIGH il PIN2 e trasmettere con serial.write il MSG.
Poi attendere il ritorno e leggere dal canale.
I comandi credo di averli trovati.(vedi un esempio semplice della formattazione della request e dell'answer nel documento allegato).

A questo punto però mi fai sorgere un dubbio, però.
Ma se sul PIN 2 metto le info su cosa sto facendo sul bus (se sono in trasmissione o in ascolto), su quale pin/canale vado a scaricare i bye del messaggio?
Scusa ma a questo punto sono un po' confuso.

Grazie,
Gerry

Si, penso che tu sia abbastanza confuso.
Per completezza vorrei aggiungere che lo schema che hai linkato è corretto, va bene e devi rispettarlo come connessioni eletriche e che non puoi fare assolutamente a meno del max485.
Devi anche mettere una resistenza da 120ohm tra i due segnali del bus( piedini 6 e 7 del max 485).
Chiarito questo sopra esposto, non ti deve interesare quale sia o meno il pin su cui arrivano i dati e quello in cui vengono inviati, Fara tutto per te la classe serial.
L'unica differenza rispetto ad una comunicazione seriale normale è il dover abilitare la trasmissione sul bus, che in questo caso viene fatta attraverso il pin 2 di Arduino.
Giusto per completezza ti dico che i dati in trasmissione verranno passati sa Arduino al max485 attraverso il pin 1tx di Arduino, e vengono ricevuti attraverso il pin 0 ex di Arduino,ma ripeto, se rispetti il cablaggio linkato, a livello di software non ti interessa tutto ciò ,fa tutto la classe serial.

gerrynigro non Ti seguo piú.
come dice niki77 il MAX485 serve e non puoi collegare i pin di Arduino direttamente alla porta seriale del Inverter.

Sappi anche che con quel circuito postato non é piú possibile l'upload di Sketch perché il MAX495 blocca la seriale.

Per fare l' upload dei programmi devi separare il pin 0 del Arduino dal MAX485.

Ciao Uwe

Ok, grazie mille a entrambi.
E...se possibile un'ultima indicazione, please.

Considerando i morsetti che l'inverter mi rende disponibili (in allegato), io come mi riporto dalla basetta a tali morsetti?
Parto dai pin 6 e 7 del max 485?
E verso quali morsetti dell'inverter?
+T/R?
-T/R?
RTN?
LNK?

Da quello che leggo sul manuale dell'inverter, AURORA sfrutta una linea di comunicazione RS485 HALF-DUPLEX costituita da due linee di trasmissione ricezione (+T/R e –T/R) e da una linea di riferimento della comunicazione (RTN): tutte le tre linee devono essere cablate in accordo allo schema daisy chain (“entra-esci”).La morsettiera è inoltre dotata del terminale LNK che permette di dare continuità allo schermo del cavo.

Scusate, ma su questa parte sono abbastanza "debole", come si sarà capito.
Grazie anticipatamente,

collegamentiRS485InverterAurora.jpg

collegamentiRS485InverterAurora_2.jpg

Collega pin6 a ±t/r e pin7 a -t/r,rtn non serve e ricordati che se hai un solo inverter devi mettere la terminazione bus anche sull'inverter, se leggi il manuale c'e scritto.
Nel mio c'e uno switch vicino il connettore per terminare il bus.
Fondamentale: devi usare un cavo twistato , la schermatura non serve.
Io ho un PVI 3.3, non ti sto dando indicazioni a caso, vai tranquillo. :wink:

salve,

non sono (ancora) un utilizzatore di arduino, ma vorrei proporre uno schema di adattatore UART TTL - RS485, migliorato rispetto a quello presentato a inizio thread, che dovrebbe andare bene per l'amico Gerry e penso anche per altre persone che hanno bisogno di un adattatore half-duplex.
Ho inserito sullo schema un po' di note per spiegare la funzione delle varie parti dello stesso.

RS485 schema v2.pdf (12.3 KB)

Ciao,
io possidiedo un inverter aurora PVI 6000 e sono interessato anch'io a sviluppare un programmino che faccia da datalogger!
Me la cavo con la programmazione e con l'elettronica quindi se posso dare una mano... magari tutti assieme riusciamo a fare qualcosa!!! :wink:

Se serve possiedo il protocollo di comunicazione dell'inverter: AuroraCommunicationProtocol_4_2

Ciao a tutti,

questo il codice Arduino Ethernet per dialogare con un inverter Aurora utilizzando lo schema http://dereenigne.org/wp-content/uploads/modbus.png a cui va aggiunta un R=180/120ohm tra i pin 6 e 7 del MAX485.
Il codice restituisce una pagina XML all'indirizzo:192.168.1.254 con tutte le misure programmate.
Il codice si puo' modificare a vostro piacimento essendo open.
Non appena lo provate fatemi sapere se vi funziona.

Ho anche sviluppato un programma su iPhone che si interfaccia con Arduino/Aurora e che, oltre a monitorare l'impianto, fornisce informazioni sulla GridPower attuale e come l'eventuale accensione di elettrodomestici vari (forno, microonde, lavastoviglie, ....) puo' variare lo scambio sul posto (mia moglie ne e' entusiasta).

Infine, potete indicarmi un post che descrive come accedere da internet ad Arduino Ethernet con i vari setup di DynDNS etc.?

Grazie, fabio

/*
   Autora Communication Protocol

   This example code is in the public domain.

   created June 2nd, 2013
   by Fabio Morgana
   morganaf@me.com
*/

#include <Ethernet.h>
#include <SPI.h>

#define  _STATE     1
#define  _VERSION   2
#define  _POWER     3
#define  _VOLTAGE1  4
#define  _VOLTAGE2  5
#define  _CURRENT1  6
#define  _CURRENT2  7
#define  _POWERDAY  8
#define  _POWERTOT  9
#define  _POWERPEAK 10
#define  _POWERPEAKDAY  11

#define _SERIALLOG  0

#define _DELAYBETWEENCOMMAND 100
#define _DELAYBETWEENLOG     10000

// digital pin 2 has a pushbutton attached to it. Give it a name:
byte enableRS485Pin = 2;

char inBytes[8];
byte commandState[10]         = {2, 50,  0, 0, 0, 0, 0, 0, 0, 0};
byte commandVersion[10]       = {2, 58,  0, 0, 0, 0, 0, 0, 0, 0};
byte commandGridPower[10]     = {2, 59,  3, 0, 0, 0, 0, 0, 0, 0};
byte commandInput1Voltage[10] = {2, 59, 23, 0, 0, 0, 0, 0, 0, 0};
byte commandInput2Voltage[10] = {2, 59, 26, 0, 0, 0, 0, 0, 0, 0};
byte commandInput1Current[10] = {2, 59, 25, 0, 0, 0, 0, 0, 0, 0};
byte commandInput2Current[10] = {2, 59, 27, 0, 0, 0, 0, 0, 0, 0};
byte commandPowerDay[10]      = {2, 78,  0, 0, 0, 0, 0, 0, 0, 0};
byte commandPowerTotal[10]    = {2, 78,  5, 0, 0, 0, 0, 0, 0, 0};
byte commandPowerPeak[10]     = {2, 59, 34, 0, 0, 0, 0, 0, 0, 0};
byte commandPowerPeakDay[10]  = {2, 59, 35, 0, 0, 0, 0, 0, 0, 0};

float power, voltage1, current1, voltage2, current2, powerpeak, powerpeakday;
unsigned long powerday, powertot;

byte mac[] = { metter il mac address del vostro Arduino Ethernet };
IPAddress ip(192,168,1,254);
boolean incoming = 0;
EthernetServer server(80);
byte requestValue = 0;

// the setup routine runs once when you press reset:
void setup() {
  // initialize serial communication at 9600 bits per second:
  Serial.begin(19200);

  //initialize enableRS485Pin
  pinMode(enableRS485Pin, OUTPUT);
  digitalWrite(enableRS485Pin, HIGH);

  //initialize Ethernet Connection
  Ethernet.begin(mac, ip);
  server.begin();
  Serial.print("server is at ");
  Serial.println(Ethernet.localIP());
}

int numC;
void loop() {
  // listen for incoming clients
  EthernetClient client = server.available();
  if (client) {
    numC = 0;
    requestValue = 0;
    Serial.println("New client");
    // an http request ends with a blank line
    boolean currentLineIsBlank = true;
    while (client.connected()) {
      if (client.available()) {
        char c = client.read();
        Serial.write(c);
        // if you've gotten to the end of the line (received a newline
        // character) and the line is blank, the http request has ended,
        // so you can send a reply
        //reads URL string from $ to first blank space
        if(incoming && c == ' '){ 
          incoming = 0;
        }
        if(c == '

){
         incoming = 1;
       }
       
       //Checks for the URL string parameter
       if(incoming == 1){
         if (numC)
            requestValue = requestValue*10 + (c - 48);
         numC++;
       }

if (c == '\n' && currentLineIsBlank) {
         Serial.print("Start command: ");
         Serial.println(requestValue);
         delay(_DELAYBETWEENCOMMAND);
         // send a standard http response header
         client.println("HTTP/1.1 200 OK");
         client.println("Content-Type: text/xml");
         client.println("Connection: close");  // the connection will be closed after completion of the response
         client.println();
         client.println("<?xml version = \"1.0\" ?>");
         client.print("");
         switch (requestValue) {
           default:
             sendCommand(_POWER);
             delay(_DELAYBETWEENCOMMAND);
             sendCommand(_VOLTAGE1);
             delay(_DELAYBETWEENCOMMAND);
             sendCommand(_CURRENT1);
             delay(_DELAYBETWEENCOMMAND);
             sendCommand(_VOLTAGE2);
             delay(_DELAYBETWEENCOMMAND);
             sendCommand(_CURRENT2);
             delay(_DELAYBETWEENCOMMAND);
             sendCommand(_POWERDAY);
             delay(_DELAYBETWEENCOMMAND);
             sendCommand(_POWERTOT);
             delay(_DELAYBETWEENCOMMAND);
             sendCommand(_POWERPEAK);
             delay(_DELAYBETWEENCOMMAND);
             sendCommand(_POWERPEAKDAY);
             delay(_DELAYBETWEENCOMMAND);

client.print("");
             client.print(power);
             client.print("");

client.print("");
             client.print(voltage1);
             client.print("");

client.print("");
             client.print(current1);
             client.print("");

client.print("");
             client.print(voltage2);
             client.print("");

client.print("");
             client.print(current2);
             client.print("");

client.print("");
             client.print(powerday);
             client.print("");

client.print("");
             client.print(powertot);
             client.print("");

client.print("");
             client.print(powerpeak);
             client.print("");

client.print("");
             client.print(powerpeakday);
             client.print("");
             break;
         }
         client.println("");
         break;
       }
       if (c == '\n') {
         // you're starting a new line
         currentLineIsBlank = true;
       }
       else if (c != '\r') {
         // you've gotten a character on the current line
         currentLineIsBlank = false;
       }
     }
   }
   // give the web browser time to receive the data
   delay(1);
   // close the connection:
   client.stop();
   Serial.println("client disconnected");
 }
}

Sto realizzando anche io quanto descritto in questo topic. Ho difficoltà pero' nella compilazione dello sketch, in quanto mi viene restituito un errore, in effetti 'sendCommand' non è dichiarato.
Qualche info dall'autore che lo ha gentilmente postato ?
Grazie !