Pages: [1]   Go Down
Author Topic: Arduino Uno + Inverter Aurora  (Read 1916 times)
0 Members and 1 Guest are viewing this topic.
0
Offline Offline
Newbie
*
Karma: 0
Posts: 16
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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




* trasmissionMessage.jpg (17.05 KB, 693x71 - viewed 34 times.)

* receivingMessage.jpg (16.57 KB, 684x63 - viewed 22 times.)
Logged

BZ (I)
Offline Offline
Brattain Member
*****
Karma: 236
Posts: 20280
+39 349 2158303
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Ciao Uwe
Logged

0
Offline Offline
Newbie
*
Karma: 0
Posts: 16
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Ciao Uwe,
dal manuale Aurora io ho quanto di seguito:
Quote
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
Logged

BZ (I)
Offline Offline
Brattain Member
*****
Karma: 236
Posts: 20280
+39 349 2158303
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged

0
Offline Offline
Newbie
*
Karma: 0
Posts: 16
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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 (22.94 KB, 305x180 - viewed 36 times.)

* collegamentiRS485InverterAurora_2.jpg (30.02 KB, 499x229 - viewed 39 times.)
Logged

MC
Offline Offline
God Member
*****
Karma: 13
Posts: 917
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Ciao Uwe,
dal manuale Aurora io ho quanto di seguito:
Quote
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. smiley-mr-green

P.s. per le indicazioni mi sono basato sullo schema che hai linkato .
« Last Edit: March 16, 2013, 03:25:24 pm by niki77 » Logged

Vi è una spiegazione scientifica a tutto.
La fede è solo quell'anello che si porta al dito dopo il matrimonio.

0
Offline Offline
Newbie
*
Karma: 0
Posts: 16
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
 



* messaggioEsempioRS485InverterAurora.jpg (62.98 KB, 794x375 - viewed 36 times.)
Logged

MC
Offline Offline
God Member
*****
Karma: 13
Posts: 917
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Vi è una spiegazione scientifica a tutto.
La fede è solo quell'anello che si porta al dito dopo il matrimonio.

BZ (I)
Offline Offline
Brattain Member
*****
Karma: 236
Posts: 20280
+39 349 2158303
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged

0
Offline Offline
Newbie
*
Karma: 0
Posts: 16
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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 (22.94 KB, 305x180 - viewed 11 times.)

* collegamentiRS485InverterAurora_2.jpg (30.02 KB, 499x229 - viewed 17 times.)
Logged

MC
Offline Offline
God Member
*****
Karma: 13
Posts: 917
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Vi è una spiegazione scientifica a tutto.
La fede è solo quell'anello che si porta al dito dopo il matrimonio.

Offline Offline
Newbie
*
Karma: 0
Posts: 1
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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.28 KB - downloaded 40 times.)
« Last Edit: March 19, 2013, 07:35:15 am by pasqualeg » Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 1
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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!!! ;-)

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

Offline Offline
Newbie
*
Karma: 0
Posts: 1
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Code:
/*
   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("<values>");
          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("<power>");
              client.print(power);
              client.print("</power>");

              client.print("<voltage1>");
              client.print(voltage1);
              client.print("</voltage1>");

              client.print("<current1>");
              client.print(current1);
              client.print("</current1>");

              client.print("<voltage2>");
              client.print(voltage2);
              client.print("</voltage2>");

              client.print("<current2>");
              client.print(current2);
              client.print("</current2>");

              client.print("<powerday>");
              client.print(powerday);
              client.print("</powerday>");

              client.print("<powertot>");
              client.print(powertot);
              client.print("</powertot>");

              client.print("<powerpeak>");
              client.print(powerpeak);
              client.print("</powerpeak>");

              client.print("<powerpeakday>");
              client.print(powerpeakday);
              client.print("</powerpeakday>");
              break;
          }
          client.println("</values>");
          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");
  }
}
Logged

Pages: [1]   Go Up
Jump to: