Como usar a comunicação RS485 com Arduino

 

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.

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).

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

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:

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).

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:

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).

//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:

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:

//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:

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 - (1 voto)

Related posts

Dimmer com o módulo sensor de luz LDR

by Arduino e Cia
10 anos ago

Controle remoto IR com Arduino: veja como usar

by Arduino e Cia
11 anos ago

Como usar o Módulo MP3 DFPlayer Mini

by Arduino e Cia
7 anos ago
Sair da versão mobile