módulo conversor RS485 é um componente que permite a comunicação entre o Arduino e dispositivos que utilizam esse tipo de interface, muito comum em equipamentos industriais como CLP´s e CNC´s.

Comunicação RS485 com Arduino

Vamos mostrar aqui como usar o módulo RS485 com Arduino, realizando a comunicação entre duas placas Arduino Uno.

O módulo RS485 para Arduino

O módulo que vamos usar é esse da imagem abaixo, onde podemos ver os pinos de controle e comunicação serial RS232 do lado esquerdo e no lado direito os pinos de alimentação (5V e GND) e comunicação serial RS485 (pinos A e B).

Módulo - Detalhes

Para controle temos os seguintes pinos de conexão com o microcontrolador:

  • RO (Receive Output) – Recebe os dados pela serial RS232
  • RE (Receive Enable) – Habilita a recepção de dados
  • DE (Data Enable) – Habilita a transmissão de dados
  • DI (Data Input) – Envia os dados pela serial RS232

O mesmo módulo pode ser usado tanto para transmissão como para recepção, bastando habilitar ou desabilitar os pinos RE e DE.

A comunicação RS485 é capaz de cobrir grandes distâncias, tendo uma grande imunidade a ruídos quando utilizada de maneira adequada. Entre suas principais características, podemos destacar:

  • Comunicação à 2 fios
  • Comunicação a longas distâncias (até 1.200 m)
  • Possibilidade de ter até 32 nós/estações na rede RS485 em um mesmo barramento
  • Velocidade de até 35 Mbps

Para maiores informações, recomendo a leitura deste artigo.

Conexão módulo conversor RS485 e Arduino

Vamos separar o circuito aqui em 2 partes para visualizarmos melhor as conexões.

Primeiro, vamos mostrar a conexão entre os dois módulos RS485. O da esquerda será o Transmissor e o da direita o Receptor. Repare que os dois vão usar os mesmo pinos de conexão com a placa Arduino Uno: pino 11 do Arduino ligado ao DI do módulo, pino 10 ligado ao RO e pino 3 ligado ao DE/RE. (Preste atenção pois o DE e RE de cada módulo devem ser interligados).

Conexão módulos RS485

Na próxima imagem podemos ver o circuito completo, com os módulos RS485 já conectados nos Arduinos Transmissor (lado esquerdo) e Receptor (lado direito). Na parte superior observe que temos um jumper conectando o GND das duas placas.

No transmissor temos um botão conectado ao pino analógico A0. Vamos usar esse botão para enviar uma string para o receptor. Para alimentação dos módulos, utilizamos os pinos 5V e GND do receptor:

Circuito Módulos RS485 e Arduino

A nossa “linha de transmissão” são os pinos A e B do módulo. Conecte o pino A de um módulo com o A do outro e faça a mesma coisa com o B (fios verde e amarelo na imagem acima).

Você também pode usar os bornes com parafusos para essa conexão, já que para distâncias maiores o tipo de cabo utilizado vai influenciar na qualidade da comunicação.

Programa Transmissor RS485

O primeiro programa vamos carregar na placa Arduino que está com a função de TRANSMISSOR.

Neste programa,usamos a biblioteca SoftwareSerial (já embutida na IDE Arduino) para criar uma serial por software nos pinos 10 e 11 do Arduino, liberando a serial por hardware. Assim, conseguimos acompanhar pelo serial monitor o que está sendo enviado pela placa.

Usamos o led 13 onboard do Arduino para mostrar quando o dado está sendo enviado, e antes de enviar habilitamos o modo de transmissão (linha 48 do programa), então enviamos a string (linha 51) e depois desabilitamos o modo de transmissão (linha 59).

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
//Programa: Comunicação RS485 com Arduino - Transmissor
//Autor: Arduino e Cia
#include <SoftwareSerial.h>
//Pinos de comunicacao serial do modulo RS485
#define Pino_RS485_RX 10
#define Pino_RS485_TX 11
//Pino de controle transmissao/recepcao
#define SSerialTxControl 3
#define RS485Transmit HIGH
#define RS485Receive LOW
//Define led 13 para mostrar atividade na comunicacao
#define Pin13LED 13
//Cria a serial por sofware para conexao com modulo RS485
SoftwareSerial RS485Serial(Pino_RS485_RX, Pino_RS485_TX);
void setup()
{
//Inicializa a serial do Arduino
Serial.begin(9600);
Serial.println("Modulo Transmissor");
Serial.println("Pressione o botao para enviar os dados...");
pinMode(Pin13LED, OUTPUT);
pinMode(SSerialTxControl, OUTPUT);
//Inicializa a serial do modulo RS485
RS485Serial.begin(4800);
//Seta o pino A0 como entrada e habilita o pull up
pinMode(A0, INPUT_PULLUP);
}
void loop()
{
//Verifica se o botao foi pressionado
int valor = digitalRead(A0);
if (valor == 0)
{
Serial.println("Botao pressionado. Enviando dados!");
//Habilita o modulo para transmissao
digitalWrite(SSerialTxControl, RS485Transmit);
//Envia a string
RS485Serial.println("Botao acionado");
//Liga o led 13 para mostrar que ha conexao
digitalWrite(Pin13LED, HIGH);
delay(10);
digitalWrite(Pin13LED, LOW);
//Desabilita o modulo para transmissao
digitalWrite(SSerialTxControl, RS485Receive);
while (digitalRead(A0) == 0)
{
delay(50);
}
}
}
//Programa: Comunicação RS485 com Arduino - Transmissor //Autor: Arduino e Cia #include <SoftwareSerial.h> //Pinos de comunicacao serial do modulo RS485 #define Pino_RS485_RX 10 #define Pino_RS485_TX 11 //Pino de controle transmissao/recepcao #define SSerialTxControl 3 #define RS485Transmit HIGH #define RS485Receive LOW //Define led 13 para mostrar atividade na comunicacao #define Pin13LED 13 //Cria a serial por sofware para conexao com modulo RS485 SoftwareSerial RS485Serial(Pino_RS485_RX, Pino_RS485_TX); void setup() { //Inicializa a serial do Arduino Serial.begin(9600); Serial.println("Modulo Transmissor"); Serial.println("Pressione o botao para enviar os dados..."); pinMode(Pin13LED, OUTPUT); pinMode(SSerialTxControl, OUTPUT); //Inicializa a serial do modulo RS485 RS485Serial.begin(4800); //Seta o pino A0 como entrada e habilita o pull up pinMode(A0, INPUT_PULLUP); } void loop() { //Verifica se o botao foi pressionado int valor = digitalRead(A0); if (valor == 0) { Serial.println("Botao pressionado. Enviando dados!"); //Habilita o modulo para transmissao digitalWrite(SSerialTxControl, RS485Transmit); //Envia a string RS485Serial.println("Botao acionado"); //Liga o led 13 para mostrar que ha conexao digitalWrite(Pin13LED, HIGH); delay(10); digitalWrite(Pin13LED, LOW); //Desabilita o modulo para transmissao digitalWrite(SSerialTxControl, RS485Receive); while (digitalRead(A0) == 0) { delay(50); } } }
//Programa: Comunicação RS485 com Arduino - Transmissor
//Autor: Arduino e Cia

#include <SoftwareSerial.h>

//Pinos de comunicacao serial do modulo RS485
#define Pino_RS485_RX    10
#define Pino_RS485_TX    11

//Pino de controle transmissao/recepcao
#define SSerialTxControl 3

#define RS485Transmit    HIGH
#define RS485Receive     LOW

//Define led 13 para mostrar atividade na comunicacao
#define Pin13LED         13

//Cria a serial por sofware para conexao com modulo RS485
SoftwareSerial RS485Serial(Pino_RS485_RX, Pino_RS485_TX);

void setup()
{
  //Inicializa a serial do Arduino
  Serial.begin(9600);
  Serial.println("Modulo Transmissor");
  Serial.println("Pressione o botao para enviar os dados...");

  pinMode(Pin13LED, OUTPUT);
  pinMode(SSerialTxControl, OUTPUT);

  //Inicializa a serial do modulo RS485
  RS485Serial.begin(4800);

  //Seta o pino A0 como entrada e habilita o pull up
  pinMode(A0, INPUT_PULLUP);
}

void loop()
{
  //Verifica se o botao foi pressionado
  int  valor = digitalRead(A0);
  if (valor == 0)
  {
    Serial.println("Botao pressionado. Enviando dados!");
    
    //Habilita o modulo para transmissao
    digitalWrite(SSerialTxControl, RS485Transmit);

    //Envia a string
    RS485Serial.println("Botao acionado");

    //Liga o led 13 para mostrar que ha conexao
    digitalWrite(Pin13LED, HIGH);
    delay(10);
    digitalWrite(Pin13LED, LOW);

    //Desabilita o modulo para transmissao
    digitalWrite(SSerialTxControl, RS485Receive);
    while (digitalRead(A0) == 0)
    {
      delay(50);
    }
  }
}

Isso finaliza a configuração do transmissor. Acompanhe o processo pelo Serial Monitor da IDE do Arduino:

Serial Monitor Arduino Uno Receptor RS485

Vamos agora configurar o Arduino que vai servir como receptor.

Programa Receptor RS485

O programa que será carregado no receptor tem as mesmas configurações de comunicação do transmissor (RX e TX nos pinos 10 e 11 do Arduino). Temos também o acionamento do led onboard da porta 13 para indicar atividade.

A string é recebida pela serial do RS485 e vai sendo “montada” caracter a caracter e armazenada na variável inputString (linhas 52 e 53). Quando o programa recebe o valor de final de string (n), o valor de inputString é enviado para a serial:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
//Programa: Comunicação RS485 com Arduino - Receptor
//Autor: Arduino e Cia
#include <SoftwareSerial.h>
//Pinos de comunicacao serial do modulo RS485
#define Pino_RS485_RX 10
#define Pino_RS485_TX 11
//Pino de controle transmissao/recepcao
#define SSerialTxControl 3
#define RS485Transmit HIGH
#define RS485Receive LOW
//Define led 13 para mostrar atividade na comunicacao
#define Pin13LED 13
//Cria a serial por sofware para conexao com modulo RS485
SoftwareSerial RS485Serial(Pino_RS485_RX, Pino_RS485_TX);
//Armazena os dados que chegam pela serial
String inputString = "";
//Variavel de string completa
boolean stringComplete = false;
void setup()
{
//Inicializa a serial do Arduino
Serial.begin(9600);
Serial.println("Modulo Receptor");
Serial.println("Aguardando dados...");
pinMode(Pin13LED, OUTPUT);
pinMode(SSerialTxControl, OUTPUT);
//Coloca o modulo RS485 em modo de recepcao
digitalWrite(SSerialTxControl, RS485Receive);
//Inicializa a serial do modulo RS485
RS485Serial.begin(4800);
}
void loop()
{
//Recebe os dados do RS485 via porta serial
if (RS485Serial.available())
{
while (RS485Serial.available())
{
//Recebe os dados e monta a string
char inChar = (char)RS485Serial.read();
inputString += inChar;
if (inChar == 'n')
{
//Mostra no Serial Monitor a string recebida
Serial.print(inputString);
stringComplete = true;
inputString = "";
}
}
}
}
//Programa: Comunicação RS485 com Arduino - Receptor //Autor: Arduino e Cia #include <SoftwareSerial.h> //Pinos de comunicacao serial do modulo RS485 #define Pino_RS485_RX 10 #define Pino_RS485_TX 11 //Pino de controle transmissao/recepcao #define SSerialTxControl 3 #define RS485Transmit HIGH #define RS485Receive LOW //Define led 13 para mostrar atividade na comunicacao #define Pin13LED 13 //Cria a serial por sofware para conexao com modulo RS485 SoftwareSerial RS485Serial(Pino_RS485_RX, Pino_RS485_TX); //Armazena os dados que chegam pela serial String inputString = ""; //Variavel de string completa boolean stringComplete = false; void setup() { //Inicializa a serial do Arduino Serial.begin(9600); Serial.println("Modulo Receptor"); Serial.println("Aguardando dados..."); pinMode(Pin13LED, OUTPUT); pinMode(SSerialTxControl, OUTPUT); //Coloca o modulo RS485 em modo de recepcao digitalWrite(SSerialTxControl, RS485Receive); //Inicializa a serial do modulo RS485 RS485Serial.begin(4800); } void loop() { //Recebe os dados do RS485 via porta serial if (RS485Serial.available()) { while (RS485Serial.available()) { //Recebe os dados e monta a string char inChar = (char)RS485Serial.read(); inputString += inChar; if (inChar == 'n') { //Mostra no Serial Monitor a string recebida Serial.print(inputString); stringComplete = true; inputString = ""; } } } }
//Programa: Comunicação RS485 com Arduino - Receptor
//Autor: Arduino e Cia

#include <SoftwareSerial.h>

//Pinos de comunicacao serial do modulo RS485
#define Pino_RS485_RX    10
#define Pino_RS485_TX    11

//Pino de controle transmissao/recepcao
#define SSerialTxControl 3

#define RS485Transmit    HIGH
#define RS485Receive     LOW

//Define led 13 para mostrar atividade na comunicacao
#define Pin13LED         13

//Cria a serial por sofware para conexao com modulo RS485
SoftwareSerial RS485Serial(Pino_RS485_RX, Pino_RS485_TX);

//Armazena os dados que chegam pela serial
String inputString = "";
//Variavel de string completa
boolean stringComplete = false;

void setup()
{
  //Inicializa a serial do Arduino
  Serial.begin(9600);
  Serial.println("Modulo Receptor");
  Serial.println("Aguardando dados...");

  pinMode(Pin13LED, OUTPUT);
  pinMode(SSerialTxControl, OUTPUT);

  //Coloca o modulo RS485 em modo de recepcao
  digitalWrite(SSerialTxControl, RS485Receive);

  //Inicializa a serial do modulo RS485
  RS485Serial.begin(4800);
}

void loop()
{
  //Recebe os dados do RS485 via porta serial
  if (RS485Serial.available())
  {
    while (RS485Serial.available())
    {
      //Recebe os dados e monta a string
      char inChar = (char)RS485Serial.read();
      inputString += inChar;
      
      if (inChar == 'n')
      {
        //Mostra no Serial Monitor a string recebida
        Serial.print(inputString);
        stringComplete = true;
        inputString = "";
      }
    }
  }
}

Você pode abrir um segundo Serial Monitor para mostrar os dados que forem recebidos ou usar um programa de terminal simples como o Termite, mostrado na imagem abaixo:

Comunicação Serial - Receptor

Um bom exercício é você usar os exemplos acima para realizar uma comunicação bidirecional, com um módulo atuando de forma alternada entre Transmissor e Receptor, enviando dados de controle entre as placas.

Gostou? Confira outros posts usando módulos aqui mesmo no Arduino e Cia!

5/5 - (3 votos)