O 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:
- 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).
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!
