Come interfacciare Arduino, esp8266 o esp32 alla seriale RS-485
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
Collegamenti Arduino UNO
Questo IC è perfetto per lavorare con Arduino o altri dispositivi logici 5v, qui lo schema di connessione:
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.
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
Collegamenti esp8266
Questo IC è perfetto per lavorare con esp8266, esp32 o altri dispositivi logici 3.3v, qui lo schema di connessione:
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.
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.
Ed ecco il collegamento con il modulo.
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.
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.
Video dimostrativo
Ecco il risultato del video: