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!