Come interfacciare Arduino, esp8266 o esp32 alla seriale RS-485

Spread the love

Ciao a tutti, sto realizzando un progetto per il controllo del mio inverter e il primo problema da risolvere è interfacciare i miei microcontrollori con l’inverter.

Inverter è un ABB Aurora e ha un’interfaccia RS-485, prima proverò con Arduino ma ho intenzione di usare un esp8266.

RS-485 funziona in broadcast, quando invii un messaggio tutti i dispositivi collegati al filo lo ricevono, e quindi sono stati implementati vari protocolli per inviare un messaggio a un dispositivo specifico o a un indirizzo di broadcast. In questo articolo usiamo una normale comunicazione tra due dispositivi in modo basico.
Ma come puoi capire con un protocollo specifico, puoi controllare molti dispositivi contemporaneamente.

IC o modulo

Esistono IC e moduli studiati per questo tipo di collegamento, per Arduino è possibile utilizzare l’IC MAX485 o l’equivalente modulo, per esp8266 e ESP32 è necessario utilizzare MAX3485 che funziona a 3.3V.

MAX485

You can find the IC on AliExpress

You can find the module on AliExpress

Il MAX485 è un ricetrasmettitore a bassa potenza per la comunicazione RS-485. Contengono un driver e un ricevitore.

Funzionalità chiave

  • Il basso consumo energetico riduce al minimo la dissipazione termica, riducendo i costi del sistema
    • Corrente di riposo da 120µA a 500µA
    • Corrente di spegnimento di 0,1µA
    • Singola tensione di alimentazione 5v
  • La protezione integrata migliora la robustezza del sistema
    • Limitazione di corrente da sovraccarico
    • Arresto termico integrato
    • Ricevitore fail-safe per ingresso circuito aperto
    • Garantisce logica HIGH
MAX485 diagrams

Collegamenti Arduino UNO

Questo IC è perfetto per lavorare con Arduino o altri dispositivi logici 5v, qui lo schema di connessione:

MAX485 Arduino connection schema

La connessione è abbastanza semplice, devi connettere i Pin 5 a DE e -RE in modo da poter attivare la trasmissione e la ricezione dei dati, nello schema uso i pin 10 e 11 come RX e TX del SoftwareSerial e devi connetterli ai pins RO DI del MAX485, ed è necessario collegare 5v e GND ai pin dell’IC. Il resistore Rt (da A e B) è 120ohm, ma di solito uso 104ohm.

Arduino UNO e modulo rs458 max485: connessione
Arduino UNO e modulo rs458 max485: connessione

Quando si collega il MAX485 al dispositivo, ricordatevi che il pin A è DI+ e B è DI-.

MAX3485

You can find the IC on AliExpress

You can find the module on AliExpressAliExpress

I MAX3485 sono ricetrasmettitori a bassa potenza (3,3v) per la comunicazione RS-485. Contiene un driver e un ricevitore. Il MAX3485 trasmette fino a 10 Mbps.

I driver limitazione di corrente per sovraccarico e sono protetti dall’eccessiva dissipazione di potenza da un circuiti di spegnimento termico che riescono a mettere le uscite del driver in uno stato ad alta impedenza. L’ingresso del ricevitore ha una funzione fail-safe che garantisce un’uscita logica HIGH se entrambi gli ingressi sono a circuito aperto.

Il MAX3485 è progettato per la comunicazione half-duplex.

Funzionalità chiave

  • Funziona tramite una singola alimentazione a 3.3V
  • Interoperabile con logica a +5V
  • 8ns Max Skew
  • 2nA Modalità di spegnimento a bassa corrente
  • Intervallo di tensione di ingresso in modalità comune da -7V a + 12V
  • Permette fino a 32 ricetrasmettitori sul bus
  • Disponibili versioni Full Duplex e Half Duplex
  • Piedinatura standard industriale 75176
  • Limitazione di corrente e arresto termico per la protezione da sovraccarico del driver
MAX3485 diagram

Collegamenti esp8266

Questo IC è perfetto per lavorare con esp8266, esp32 o altri dispositivi logici 3.3v, qui lo schema di connessione:

MAX3485 and esp8266 connection schema

La connessione è abbastanza semplice, è necessario collegare i pin D0 a DE e -RE in modo da poter attivare la trasmissione e la ricezione dei dati, nello schema uso i pin D3 e D2 rispettivametne come RX e TX del software seriale e devi connetterli ai pins RO DI del MAX3485, ed è necessario collegare 3,3v e GND ai pins dell’IC. Il resistore Rt (da A e B) è 120ohm, ma di solito uso 104ohm.

esp8266 nodemcu e modulo rs458 max3485: connessione
esp8266 nodemcu e modulo rs458 max3485: connessione

Quando si collega il MAX3485 al dispositivo, ricordate che il pin A è DI + e B è DI-.

Collegamenti esp32

I collegamenti dell’esp32 sono molto simili, ma andremo ad utilizzare la Serial1 al posto della software serial.

ESP32 DOIT DevKit V1 e modulo rs458 max3485: connessione
ESP32 DOIT DevKit V1 e modulo rs458 max3485: connessione

Ed ecco il collegamento con il modulo.

ESP32 DOIT DevKit v1 e modulo rs458 max3485: connessione
ESP32 DOIT DevKit v1 e modulo rs458 max3485: connessione

Utilizzo

Quando si dispone di una scheda tecnica del dispositivo l’interconnessione risulta abbastanza semplice, si utilizza l’interfaccia di comunicazione seriale del microcontrollore per inviare e ricevere dati.

Communication from Arduino to WeMos D1 mini via RS-485 wiring
RS-485 Breadboard communication

E qui 2 semplici sketch.

Sketch

Arduino invia un messaggio “Hello World!” e attende una risposta.

#include "Arduino.h"

#include <SoftwareSerial.h>
#define RXPin        10  // Serial Receive pin
#define TXPin        11  // Serial Transmit pin

//RS485 control
#define SERIAL_COMMUNICATION_CONTROL_PIN 5 // Transmission set pin
#define RS485_TX_PIN_VALUE HIGH
#define RS485_RX_PIN_VALUE LOW

SoftwareSerial RS485Serial(RXPin, TXPin); // RX, TX

int byteSend;

void setup()  {
  Serial.begin(19200);

  pinMode(SERIAL_COMMUNICATION_CONTROL_PIN, OUTPUT);
  digitalWrite(SERIAL_COMMUNICATION_CONTROL_PIN, RS485_RX_PIN_VALUE);
  RS485Serial.begin(19200);   // set the data rate

  delay(500);

  digitalWrite(SERIAL_COMMUNICATION_CONTROL_PIN, RS485_TX_PIN_VALUE); // Now trasmit
  Serial.println("Send data!");
  RS485Serial.print("Hello world!"); // Send message
}

void loop() {
	  digitalWrite(SERIAL_COMMUNICATION_CONTROL_PIN, RS485_RX_PIN_VALUE);  // Disable RS485 Transmit

		if (RS485Serial.available()){
			Serial.println("Response available!");
			Serial.println(RS485Serial.readString());
		}

	  delay(100);
}

Lo WeMos D1 mini riceve i dati e invia un messaggio OK.

#include "Arduino.h"

#include <SoftwareSerial.h>
#define RXPin        D2  // Serial Receive pin
#define TXPin        D3  // Serial Transmit pin

//RS485 control
#define SERIAL_COMMUNICATION_CONTROL_PIN D0 // Transmission set pin
#define RS485_TX_PIN_VALUE HIGH
#define RS485_RX_PIN_VALUE LOW

SoftwareSerial RS485Serial(RXPin, TXPin); // RX, TX

int byteSend;

void setup()  {
  Serial.begin(19200);

  pinMode(SERIAL_COMMUNICATION_CONTROL_PIN, OUTPUT);
  digitalWrite(SERIAL_COMMUNICATION_CONTROL_PIN, RS485_RX_PIN_VALUE);
  RS485Serial.begin(19200);   // set the data rate
}
String dataReceived;
bool isDataReceived = false;
void loop() {
	digitalWrite(SERIAL_COMMUNICATION_CONTROL_PIN, RS485_RX_PIN_VALUE);// Init receive

	if (RS485Serial.available()){
		dataReceived = RS485Serial.readString();
		Serial.print("Data received ");
		Serial.println(dataReceived);
		isDataReceived = true;
		delay(10);
	}

	if (isDataReceived){
		delay(111);
		digitalWrite(SERIAL_COMMUNICATION_CONTROL_PIN, RS485_TX_PIN_VALUE); // Init transmit
		Serial.println("Send response!");
		RS485Serial.print("OK --> ");
		RS485Serial.println(dataReceived);
		isDataReceived = false;
	}

    delay(111);
}

Per questo sketch uso SoftwareSerial, ma puoi usare anche l’HardwareSerial senza particolari modifiche, devi solo cablare i pin corretti.

Diagramma comunicazione

Che cosa è successo nella comunicazione? Ecco il diagramma.

Communication from Arduino to WeMos D1 mini via RS-485

Video dimostrativo

Ecco il risultato del video:

Grazie


Spread the love

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *