Arduino uno - Serial

Buonasera,
sono alle prime armi con Arduino quindi vi prego di essere "clementi" se la mia domanda è banale.
Devo sviluppare un progetto su arduino uno. La mia scheda deve comunicare in modbus 485 con dei dispositivi remoti. Pensavo di usare la libreria modbusmaster.
Vorrei anche usare il monitor_seriale dell'IDE per passare parametri all'applicazione e per visualizzare informazioni.
Il mio dubbio è il seguente, se uso la libreria modbusmaster devo usare serial (su tx0, rx0), ma in questo modo non ho piu' a disposizione il monitor_seriale dell'IDE, che condivide la stessa seriale, corretto?
D'altro canto se utilizzo softwareserial (per portare la 485 su altri piedini del micro) non posso utilizzare la libreria modbusmaster, o mi sbaglio ?
Esiste usa soluzione alternativa oppure devo passare ad un'altra piattaforma?
Grazie

Buonasera,
essendo il tuo primo post, nel rispetto del regolamento, ti chiedo cortesemente di presentarti QUI (spiegando bene quali conoscenze hai di elettronica e di programmazione … possibilmente evitando di scrivere solo una riga di saluto) e di leggere con attenzione il su citato REGOLAMENTO … Grazie.

Guglielmo

Ho dato un'occhiata su GitHub a quella libreria (che NON conosco) ed è nata per schede con più seriali (parla espressamente di Arduino MEGA), comunque, un tentativo lo farei ...

In ModbusMaster.cpp si legge:

void ModbusMaster::begin(uint8_t slave, Stream &serial) {

ovvero, come parametro vuole lo stream che si usa come seriale. Del resto, all'interno, sempre la begin fa:

_serial = &serial;

e poi, per il resto del codice usa la sua _serial.

Negli esempi, istanziata la classe, la inizializzano così:

ModbusMaster node;
...
node.begin(2, Serial);

Io proverei a creare una mySerial con la SoftwareSerial e poi a passare lo Stream mySerial alla begin() ... visto mai che l'accetta e funziona ? :grin:

Ripeto, è solo un tentativo ... ma dato che non costa nulla, prima di prendere una MEGA, ... io proverei :wink:

Guglielmo

Confermo che dovrebbe funzionare, visto che sia HardwareSerial che SoftwareSerial derivano da Stream. Anche la libreria WiFiEsp fa la stessa cosa, e l'ho fatta pure io da qualche parte ;).

... Perlomeno a livello software, però se l'autore ha usato Stream e non esplicitamente HardwareSerial, mi aspetto che funzioni anche la software.

Grazie,

ho caricato la libreria e sto provando. Per iniziare ho caricato un esempio ma c'e' qualcosa che non capisco. Questo è il setup :

// instantiate ModbusMaster object
ModbusMaster node;
...
void preTransmission()
{
  digitalWrite(MAX485_RE_NEG, 1);
  digitalWrite(MAX485_DE, 1);
}

void postTransmission()
{
  digitalWrite(MAX485_RE_NEG, 0);
  digitalWrite(MAX485_DE, 0);
}

...
void setup()
{
...
// Modbus communication runs at 115200 baud
  Serial.begin(115200);

  // Modbus slave ID 1
  node.begin(1, Serial);
  // Callbacks allow us to configure the RS485 transceiver correctly
  node.preTransmission(preTransmission);
  node.postTransmission(postTransmission);

}

E questo è il loop :

  // Read 16 registers starting at 0x3100)
  result = node.readInputRegisters(0x3100, 16);
  if (result == node.ku8MBSuccess)
  {
    Serial.print("Vbatt: ");
    ...
  }

Da questo esempio sia il "node" che i messaggi per il terminale vanno su Serial. Questo vuol dire che se connetto il mio dispositivo sul TX0 RX0, questo riceve sia le richieste modbus che i messaggi destinati al terminale ??

Anzi per la precisione, dato che si tratta di una 485 i messaggi al terminale non dovrebbero essere inviati su TX0 RX0 in quanto la 485 viene abilitata in trasmissione solo da "node. Mentre i messaggi modbus vanno sia sulla 485 che sul terminale.
Pero l'applicazione riceve in ingresso sia le risposte dei dispositivi sulla 485 che i messaggi dal terminale.
Se funziona cosi mi sembra un ottima soluzione.

Mi sono guardato l'esempio ...
... mi sembra che il chip che usa, un compatibile MAX485 abbia dei pin per attivare/disattivare il suo collegamento seriale (NON quello 485), e quindi, guardati bene cosa fa :

Definisce i due pin che controllano lo stato della seriale del chip:

#define MAX485_DE      3
#define MAX485_RE_NEG  2

e definisce due funzioni che la gestiscono PRIMA di ogni trasmissione e DOPO ogni trasmissione:

void preTransmission()
{
  digitalWrite(MAX485_RE_NEG, 1);
  digitalWrite(MAX485_DE, 1);
}

void postTransmission()
{
  digitalWrite(MAX485_RE_NEG, 0);
  digitalWrite(MAX485_DE, 0);
}

... quindi, se ho ben capito (ripeto è la prima volta che guaro quel codice) ... lui "collega" da SW i pin a 0 e 1 quando gli serve di trasmettere ricevere e subito dopo li "scollega" lasciando libera la seriale.

Se è così NON è affatto male, come suo dirsi ... "due piccioni con una fava"

Guglielmo

Sì, però sul terminale ti troveresti anche tutto quel che viene inviato sulla 485!

SukkoPera:
Sì, però sul terminale ti troveresti anche tutto quel che viene inviato sulla 485!

Questo SI ... :confused:

Però se leggi l'esempio ... mi sembra che è quello che fa ::slight_smile:

Guglielmo

Il terminale non è disabilitabile da software?

cinterion:
Il terminale non è disabilitabile da software?

No, i pin 0 ed 1 sono direttamente connessi al convertitore seriale <-> USB

Comunque ripeto, prova con la SoftwareSerial … dovrebbe comunque andare …

Guglielmo