A Comunicação RS485 Arduino é uma forma de permitir que você crie uma comunicação com controladores lógicos programáveis em redes industriais, transmita dados por fios em até 1200 metros com até 32 dispositivos Arduinos ou qualquer outro com suporte à RS-485, isso de modo prático e com baixo custo.
Infelizmente, muitos usuários não conhecem a estrutura de comunicação utilizando o modo de RS-485. Várias pessoas ainda adotam o meio tradicional e utilizam uma comunicação ponto a ponto, ou seja, uma comunicação em que um Arduino transmite uma informação de um ponto A para um ponto B.
O grande problema de tudo isso é a limitação! Sua comunicação está restrita entre dois pontos, você não tem capacidade de transmitir dados em longas distâncias e utilizar protocolos industriais para transmitir entre dispositivos em rede com o Arduino. Essa é a verdade e você precisa ficar atento a tudo isso.
Essa é a melhor solução para esse problema!
Módulo Max485 para Comunicação RS485 Arduino
A melhor forma de você evitar esse problema é aprender, agora mesmo, como utilizar a comunicação serial com o Circuito Integrado (CI) MAX485. Esse CHIP será capaz de te permitir realizar uma comunicação com outros dispositivos através de protocolos industriais. Entre os protocolos, podemos citar o MODBUS. Vamos entender o funcionamento desse circuito de comunicação?
Será que esse processo de comunicação é difícil? Será que você será capaz de comunicar dois ou mais Arduinos em rede? Onde podemos aplicar esse processo de comunicação?
Talvez, você está pensando que isso é difícil, mas eu te garanto: não é!
Se você está curioso e quer ter resposta para essas e outras perguntas, dê um passo à frente e vamos aprender como melhorar nossos sistemas de comunicação e abrir portas para novas aplicações/projetos.
Os seus projetos não serão os mesmos após você aprender como utilizar o chip MAX485 com o Arduino.
Módulo MAX485 para Comunicação RS485 Arduino
O módulo MAX485 é um circuito formado pelo CHIP MAX485. Veja a figura abaixo.
Esse CHIP é pequeno, mas ele é poderoso! Ele te dará a capacidade de comunicar com diversos Arduinos em rede e, até mesmo, com dispositivos industriais através de alguns protocolos de comunicação.
Você deve está com medo ou pensando que é difícil trabalhar com o circuito do chip MAX485, mas não é. Fique tranquilo! Já existe um módulo que é composto pelo chip e todo o circuito necessário para que ele funcione no seu projeto. Veja o módulo MAX485 apresentado na figura abaixo.
A estrutura desse módulo nos permite comunicar vários Arduinos em uma rede de comunicação. Você precisa aprender duas coisas: a primeira é aprender as ligações eletrônicas e a segunda é aprender a lógica de programação para enviar informações entre os vários dispositivos.
Te garanto uma coisa: Se você aprender a comunicar 2 Arduinos, você conseguirá se comunicar com 3, 4, 5 ou até 32 dispositivos!
O que é o Padrão de Comunicação RS-485?
O padrão de comunicação RS-485 é um meio físico, ou seja, é um arranjo de circuito físico por onde os dados trafegam entre os dispositivos industriais. Diversos protocolos utilizam esse padrão/meio físico para comunicação. Entre eles, destacamos o Protocolo Modbus.
Esse padrão tem uma característica muito interessante: ele é imune ao ruído/interferências eletromagnéticas. Além disso, ele é capaz de permitir várias formas de conexão entre os dispositivos. À essas formas de ligação, nós chamamos de topologia. Entre elas, nós destacamos a topologia de barramento, que é a utilizada pelo nosso projeto.
A seguir, veja como funcionam as conexões entre o Arduino e o Módulo MAX485.
Como funcionam as conexões do módulo MAX485?
Veja o circuito da Figura 3. Ele é o circuito que utilizaremos em nosso projeto. Você irá conectar um Arduino UNO aos 2 escravos da rede de comunicação.
O circuito do Arduino UNO possui dois botões. O botão A é responsável por ligar e desligar uma carga conectada no Arduino Nano. Já o botão B faz o mesmo processo; porém liga uma carga conectada no Arduino Mega.
O Arduino UNO envia essas informações para outros escravos da rede através da comunicação serial.
Para isso utilizamos o módulo RS-485. Esse módulo nos permite realizar a interligação e controle de comunicação entre os vários dispositivos em rede.
Para facilitar o seu entendimento veja como eles funcionam. Veja o módulo MAX485 apresentado na figura abaixo.
Os pinos de conexão do Módulo MAX485
Vamos, primeiramente, analisar os pinos DI, DE, RE e R0. Eles realizam o controle para transferir/receber dados entre um dispositivo e outro na rede de comunicação.
O DI e o R0 são, respectivamente, para você transferir os dados e receber os dados. Já os pinos DE e RE são utilizados para você selecionar o modo de funcionamento do módulo. Ora ele pode ser habilitado para transferir, ora para receber dados dos outros dispositivos.
Os pontos DE e RE são conectados entre si e ligados em um pino de controle digital do Arduino.
No outro lado temos os pinos VCC, A, B e GND. Esses 4 pinos são utilizados para alimentar o módulo (VCC e GND) e para transferir e receber os dados entre os dispositivos interconectados (A e B).
Pino A deve se conectar a todos os pinos A dos outros módulos. Esse mesmo processo deve ser feito para o pino B.
É através desses dois fios (A e B) que a informação percorrerá de um módulo para outro com níveis de tensão do MAX485.
Utilizar essa comunicação te traz ótimas vantagens, como:
- Redução de interferências no sinal transmitido;
- Permite a comunicação com até 32 dispositivos em rede;
- Transmite dados a uma distância de até 1200 m entre os dispositivos.
Agora, te convidamos a colocar tudo isso em prática de uma forma simples e fácil.
O projeto desenvolvido consiste em controlar o LED de cada escravo a partir de comandos enviados pelo mestre. Estamos utilizando um LED, mas você pode substituí-lo por um relé, por exemplo, e acionar outras cargas.
Faremos a programação de um jeito simples, de um modo que possa te ajudar a compreender o processo de comunicação serial e desenvolver seus primeiros projetos com esse módulo.
O projeto da programação tem duas partes importantes: a programação do mestre e a dos escravos.
A seguir apresentamos as duas lógicas de programação.
Programação do Dispositivo Mestre — Arduino UNO.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 |
const int ledPin = 13; const int EnTxPin = 2; byte estado1 = 0, cont1 = 0, estado2 = 0, cont2 = 0; void setup() { Serial.begin(9600); Serial.setTimeout(100); pinMode(ledPin, OUTPUT); pinMode(EnTxPin, OUTPUT); pinMode(5, INPUT); pinMode(7, INPUT); digitalWrite(ledPin, LOW); digitalWrite(EnTxPin, HIGH); } void loop() { byte botao1 = digitalRead(5); byte botao2 = digitalRead(7); delay(50); if(botao1 == 1 && estado1 == 0) { cont1++; if(cont1 == 1) { Serial.println("I"); } if(cont1 == 2) { Serial.println("J"); cont1 = 0; } estado1 = 1; } if(botao1 == 0 && estado1 == 1) { estado1 = 0; } //--------------------------------------------------- if(botao2 == 1 && estado2 == 0) { cont2++; if(cont2 == 1) { Serial.println("K"); } if(cont2 == 2) { Serial.println("L"); cont2 = 0; } estado2 = 1; } if(botao2 == 0 && estado2 == 1) { estado2 = 0; } } |
Na função setup fizemos a inicialização da comunicação serial, a configuração dos pinos digitais como entrada/saída digital e, por fim, colocamos o pino EnTxPin para nível lógico alto. Nesse estado o módulo fica configurado como transmissor de dados.
1 2 3 4 5 6 7 8 9 10 11 12 13 |
void setup() { Serial.begin(9600); Serial.setTimeout(100); pinMode(ledPin, OUTPUT); pinMode(EnTxPin, OUTPUT); pinMode(5, INPUT); pinMode(7, INPUT); digitalWrite(ledPin, LOW); digitalWrite(EnTxPin, HIGH); } |
Em toda a execução da lógica iremos permanecer o pino nesse estado lógico, pois o mestre funcionará apenas como transmissor de dados.
Após isso temos a função principal void loop. É nela que realizamos todo o processo de transmissão de dados para controle das placas. Veja a explicação a seguir.
Lógica de controle na função void loop – Mestre
Nas linhas 1 e 2 realizamos a leitura dos botões de controle para comandar os LEDs dos 2 escravos no projeto Comunicação RS485 Arduino. Veja a estrutura de conexão dos botões na figura abaixo.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 |
if(botao1 == 1 && estado1 == 0) { cont1++; if(cont1 == 1) { Serial.println("I"); } if(cont1 == 2) { Serial.println("J"); cont1 = 0; } estado1 = 1; } if(botao1 == 0 && estado1 == 1) { estado1 = 0; } //--------------------------------------------------- if(botao2 == 1 && estado2 == 0) { cont2++; if(cont2 == 1) { Serial.println("K"); } if(cont2 == 2) { Serial.println("L"); cont2 = 0; } estado2 = 1; } if(botao2 == 0 && estado2 == 1) { estado2 = 0; } |
Observe a lógica para o primeiro botão e veja que ela é muito simples. Nosso objetivo não foi criar uma estrutura complexa para uma mensagem de controle. Na verdade, implementamos algo simples para te ajudar a entender e criar a comunicação com as placas.
Envio de comandos com a placa do Arduino Mestre no Projeto
Comunicação RS485 Arduino
Quando você pressionar o botão 1 o Arduino mestre enviará o caractere I para acionar o LED da placa escravo 1. Essa informação chegará nas duas placas e irá ativar o LED do escravo 1, apenas. Isso acontece porque o escravo 1 é o responsável por conhecer esse comando.
Após pressionar o botão outra vez, o escravo 1 deve desligar o LED. Nesse caso o valor da contagem será igual a 2 e o escravo envia o caractere J, que é responsável por desligar o LED.
O algoritmo de controle do escravo 1 é igual para o escravo 2. A única diferença é que ao pressionar o botão 2, o mestre 2 envia o caractere K para ligar e L para desligar o LED do escravo 2. Veja a porção de código abaixo.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
if(botao2 == 1 && estado2 == 0) { cont2++; if(cont2 == 1) { Serial.println("K"); } if(cont2 == 2) { Serial.println("L"); cont2 = 0; } estado2 = 1; } |
Novamente, deixo claro para você: esses caracteres chegarão nas duas placas, mas apenas a placa 2 reconhecerá, porque sua lógica está implementada para reconhecer os caracteres K e L. As duas placas recebem esses caracteres, porque os dois módulos estão conectados em paralelo na rede de comunicação. É por isso que ocorre o efeito de recepção simultânea de caracteres nas duas placas.
Agora que você entendeu o processo de transmissão de dados para controle dos escravos, chegou a hora de entender como os escravos recebem esses dados.
Programação do Dispositivo Escravo — Arduino NANO e MEGA.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 |
const int EnTxPin = 2; char botao; void setup() { Serial.begin(9600); Serial.setTimeout(100); pinMode(EnTxPin, OUTPUT); digitalWrite(EnTxPin, LOW); pinMode(13, OUTPUT); } void loop() { if(Serial.available()) { botao = Serial.read(); if(botao == 'J') { Serial.println(botao); digitalWrite(13, LOW); } if(botao == 'I') { digitalWrite(13, HIGH); Serial.println(botao); } } delay(10); } |
Agora, vamos entender a função void loop.
A função void loop do código do Arduino escravo
Na função void loop você deve verificar quando há a disponibilidade de um dado na serial. O sistema faz a leitura e armazena o dado na variável botao. Em seguida precisamos verificar se o caractere lido é o I ou J. Caso seja o J o LED será desligado, caso contrário, o LED será ligado.
A figura abaixo mostra o LED acionado após receber o caractere para acionar o LED.
O código é relativamente simples e é o mesmo utilizado para a placa do escravo 2. A única diferença está nos caracteres de controle para ligar e desligar o LED. Para o escravo 2 utilizamos os caracteres K e L.
Veja o código abaixo.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 |
const int EnTxPin = 2; char botao; void setup() { Serial.begin(9600); Serial.setTimeout(100); pinMode(EnTxPin, OUTPUT); digitalWrite(EnTxPin, LOW); pinMode(13, OUTPUT); } void loop() { if(Serial.available()) { botao = Serial.read(); if(botao == 'L') { Serial.println(botao); digitalWrite(13, LOW); } if(botao == 'K') { digitalWrite(13, HIGH); Serial.println(botao); } } delay(10); } |
Finalmente, chegou a hora de você deixar suas dúvidas para que possamos te responder e te ajudar.
Só para contribuir. Existe um erro na ligação em ralação à programação (da primeira foto, feita no software fritzing), faltou conectar o pino 2 dos microcontroladores aos pinos DE/RE para poder habilitar/desabilitar a transmissão e a recepção. Na programação a variável “EnTxPin”, relacionada ao pino 2, faz esse controle.
Na foto da montagem prática deu para ver essa conexão.
Parabéns Diego!!!