Como usar a comunicação RS485 com Arduino
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!
No caso, o “Master ” dessa conexão seria o Transmissor ? e o outro o contrário ?
Oi Yago,
Não. No caso o conceito de master e slave vai se alternando. O mesmo módulo pode tanto transmitir como receber dados.
Abraço!
Adilson
Como eu rodo esse programa? seria em tempo real?
Digo, devo fazer um arquivo do transmissor e roda-lo e um arquivo do receptor e roda-lo?
Oi Gustavo,
Isso. Tempo real. Exatamente como vc falou. Um programa no transmissor, outro no receptor.
Abraço!
Adilson
Mas quando se trata de uma comunicação modbus rs485 em que se há endereços com informações, no caso de coils e holding registers, qual biblioteca uso?
Oi Jean,
Tudo bem? Nesse caso talvez vc tenha que desenvolver toda a programação. Que tipo de equipamento você pretende interligar?
Abraço!
Adilson
Ola estou tentando usar esse comunicador pra controle de fita led digital mas estou encontrando dificuldades em deixa uma como transmissor e outra como receptor. eu tenho um sistema desse funcionando porem nao consigo ver a placa totalmente pois esta com resina. eu so uso o cabo ID pra entrar com o sinal e o RO pra sair pra fita led, mas nao consigo fazer elas se comunicarem , alguem teria alguma dica pra me ajudar? obrigado desde ja!
Olá Adilson!!
Tenho em uma bancada 2 medidores de água ultrassônicos mandando informações de vazão a todo instante. Primeiro: como recebo esta informação para repassar adiante (não importa o tamanho do pacote ou como separa-los em pacotes). Segundo: como separo essas duas informações (2 medidores) para enviar pelo mesmo arduino. Imagino que devo usar 2 portas digitais para receber e 2 portas digitais para enviar. Seria isso?
Obrigado desde já.
Oi Marcelo!
Conseguiu fazer?
Abraço!
Adilson
Boa tarde, pode ser usado no Raspberryoi zero ?
Oi André,
Pode sim, sem problemas.
Abraço!
Adilson
Olá, essa lógica serve para conectar mais arduinos? Preciso conectar 4. Obrigado e grande tutorial.
Oi Ricardo,
Sim, a lógica é a mesma, eles vão compartilhar o mesmo barramento. Você só vai ter que implantar algum tipo de controle se precisar mandar mensagens individuais para cada uma das placas Arduino.
Abraço!
Adilson
Opa, muito obrigado!
Tenho outra dúvida, preciso conectar esses arduinos cada um a uma média de 30 metros de distância entre eles, eu posso esse cabo?
Grato.
Oi Ricardo,
Pode sim.
Adilson
Oi, como faço pra utilizar essa forma de comunicação entre um raspberry e o arduino?
Oi Elienai,
Sai um post sobre isso em breve. Fique ligado!:)
Abraço.
Adilson
ola, posso utilizar ele como receptor de um indicador de peso Alfa, que transmite dados por 485 ?
Oi Carlito,
Funciona sim. Claro que você tem que verificar toda a parte de protocolo de comunicação, mas se for RS485 funciona.
Abraço!
Adilson