RS485 Alimentazione

Salve, sono in fase di sperimentazione RS485 e Modbus ma credo di avere qualche problema con l'Hardware..... cerco di spiegarmi meglio:
con lo stesso PC ho un Arduino Nano e un ESP32 collegati tramite i relativi cavi USB per la programmazione e il Debug seriale....
le due schede sono collegate tramite due moduli RS485 (A-B)....
anche lasciando l'alimentazione dei due moduli RS485 staccata, riesco a scambiare alcuni byte tra le due schede ma ho riscontrato grandi problemi nello scambio di strutture dati in particolare con valori float.....
se alimento il modulo RS485 con la scheda ESP32, la stessa va in crash continuamente.... cosa che non succede con l'Arduino Nano alimentando la sua RS485.......
ho sostituito i moduli ma la cosa persiste....
ora mi è venuto un dubbio.... ed ho la seguente domanda:

essendo le due schede attaccate allo stesso PC quindi con la massa in comune, potrebbe essere la causa del malfunzionamento hardware?
i moduli possono avere la stessa alimentazione in parallelo?
spero di essere stato esaustivo nella richiesta e che ci sia qualcuno che possa supportami in questa problematica... grazie

E se lo alimenti separatamente?

Vedere programma per capire problema

Perché farsi del male da soli?

Potresti indicare le caratteristiche dei moduli 485 che utilizzi? I transceiver 485 solitamente funzionano a 5V (o giù di li) e il modulo ESP32 è dotato di GPIO a 3,3V. Forse ci sono problemi nell'alimentazione del modulo?
Inoltre assicurati di collegare la massa in comune quando colleghi dei moduli esterni tra loro, è un'accortezza che può evitare la gran parte dei problemi.

salve Agofelix.... nel ringraziarti per la cortese disponibilità sono a precisare quanto segue:
i moduli utilizzati sono i classici convertitori RS485/TTL con MAX485 a 5V.
ribadisco che senza collegarli ad alcuna alimentazione, riesco a comunicare Hal-Duplex tra le schede Nano e ESP scambiando regolarmente byte tramite sia rs485.write() e rs485.print().... se invece scambio una struttura dati ottengo uno strano risultato....
( - 1987015280 - 0.00
ricevuti: 24 bytes - END
)
lo schema utilizzato è il seguente:

// Trasmissione:

struct mydata {
  char cmd;
  int count;
  float temp;
  char str[20];
};

mydata dato = {(byte)'x', 0, 18.0f, "prova"};

void setup(){
  
}

void loop(){
  
  digitalWrite(TX_ENABLE_PIN, HIGH);   // attivo flag Transmitt
  rs485.write((const uint8_t *)&dato, sizeof(struct mydata));
  rs485.write((byte)'\n'); delay(10);
  digitalWrite(TX_ENABLE_PIN, LOW);    // riattivo flag Receive

}

// Ricezione:


struct mydata {
  char cmd;
  int count;
  float temp;
  char str[20];
};

mydata dato;

void setup(){
  
}

void loop(){
  while (rs485.available() > 0) {           //finchè la mySerial è in trasmissione
  byte n = rs485.read();
  //  Serial.println(n); delay(10);
  if ((char)n == '\n') {
       memcpy(&dato, buff, i);
      Serial.print(dato.cmd);Serial.print(" - ");
      Serial.print(dato.count);Serial.print(" - ");
      Serial.print(dato.temp);Serial.print("\n");
      Serial.print(dato.str);Serial.print("\n");
      Serial.print("ricevuti: ");  
      Serial.print(i);  
      Serial.println(" bytes - END");  
      i = 0;
    } else {
      buff[i] = n; 
      i++;
   }
}

dove può essere l'inghippo????

cmq... non riesco a capire come i moduli convertitori possano funzionare senza alimentazione.... i led rossi presenti nei moduli sono regolarmente accesi...

.... premetto che nel progetto finale utilizzero solo Integrati sia Max485 per Nano che Max3485 per ESP...

Non vedo dove, nel ricevitore, inizializzi l'indice i
Ne dove lo resetti
Edit, visto dove lo resetti
E se i è globale siamo a posto

Inoltre cosa farai quando l'intero (secondo membro della struttura) varrà 10?

Comunque il problema è dato dalla differente dimensione in byte dei tipi tra arduino UNO ed esp32

Usa dei tipi "sicuri, ad esempio int16_t e dovrebbe andare a posto

@narciso1960: come ti indica correttamente Standardoil qui sopra, devi tenere conto del fatto che la Nano è basata su una MCU a 8 bit e che quindi, quando dichiari un "int" dichiari una variabile segnata a 16 bit (2 bytes), il ESP32 è una MCU a 32 bit e, quando dichiari un "int", dichiari una variabile segnata a 32bit (4 bytes) ... da qui il disallineamento ed il caos che ti viene fuori.

Guglielmo

ho modificato il campo count da int a byte in entrambe le strutture... ma il risultato non cambia... ottengo:

// attivata la Serial.println(n); delay(10);

32
144
65
112
114
111
118
97
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
10
  - 144 - ovf

ricevuti: 23 bytes - END

// attivata la Serial.println(n); delay(10);

con int16_t count; ottengo questo:

32
0
144
65
112
114
111
118
97
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
10
  - 16784 - ovf
a

ricevuti: 24 bytes - END

Come vedi hai spesso problemi a gestire i tipi dati

Comunque non ho altro da dirti

(SOLVED) scusate ma avevo un problema hardware.... la scheda Nano mi si era fallata....

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.