Arquivo da tag: Comunicação de Dados

Comunicação entre PC e Arduino com Redes RS-485

E aí, pessoal, tudo certo? Vamos realizar a comunicação entre um PC e um Arduino utilizando redes RS-485. Teremos um PC ligado na rede RS-485 através de um conversor USB/RS-485. O PC vai enviar mensagens através da rede para o Arduino. O Arduino estará conectado na rede através de um módulo RS-485/TTL. A Figura 1 apresenta a arquitetura da aplicação.

Figura 1. Arquitetura da aplicação

Aula no YouTube

Este tutorial tem um vídeo com a aula completa no meu canal do YouTube.

https://www.youtube.com/watch?v=uyfrKrxShYA

Objetivos da prática

  • Compreender conceitos de RS-485 e da sua aplicação prática;
  • Desenvolver uma aplicação simples onde o PC envia alguns comandos através da rede e o Arduino responde a esses comandos. Dependendo de qual comando for enviado através do software de terminal, o Arduino vai acionar o seu LED embutido, que é aquele LED que fica na placa, para indicar que a comunicação está funcionando;
  • Montar o circuito, apresentando detalhes e cuidados necessários para a rede funcionar corretamente;
  • Realizar a programação do Arduino;
  • Utilizar o software Termite como programa de terminal para enviar e receber os dados no PC.

Descrição da aplicação

Nesta aplicação, o PC envia um caractere pelo software terminal. Cada caractere é um comando. Se o caractere for ‘a’, vamos ligar o LED embutido do Arduino. Se o caractere for ‘b’, vamos desligar o LED. O Arduino vai responder a cada comando com uma frase: “LED ligado” ou “LED desligado”, respectivamente. Desta forma a gente sabe que a rede está funcional e o Arduino está respondendo às requisições feitas pelo PC.

De certa forma, estamos implementando um protocolo do tipo mestre-escravo, onde o computador é o mestre, enviando uma requisição (um comando), e o escravo (o Arduino) responde a esse comando.

Redes RS-485: características, topologia, módulos e conversores

O RS-485 é um padrão de meio físico usado para comunicações entre dispositivos embarcados e em automação industrial. Muitos CLPs, inversores de frequência, e módulos de entradas e saídas possuem essa porta disponível. Ele também é utilizado em alguns sistemas supervisórios para coletar dados do CLP, e é amplamente empregado nos protocolos Modbus e Profibus DP. Além disso, o RS-485 pode ser encontrado em aplicações de circuito fechado de TV e em protocolos de iluminação profissional.

As principais características do RS-485 incluem a comunicação serial, onde todos os bits das mensagens são enviados sequencialmente a uma taxa de comunicação padrão entre todos os dispositivos. A comunicação é half-duplex, o que significa que apenas um dispositivo pode enviar dados de cada vez, ou seja, não podem existir dois dispositivos transmitindo ao mesmo tempo.

É possível montar um barramento que pode ter até 1.200 metros de comprimento, em taxas de comunicação menores que 100 kbps. A rede permite até 32 dispositivos conectados ao barramento. Os dispositivos usam os sinais A e B para a comunicação, e o SG, que é a referência, ou terra de sinal. A ideia é ligar todos os fios A entre si, todos os fios B entre si, e todos os SGs entre si. A Figura 2 apresenta as conexões típicas em cada dispositivo em uma topologia barramento.

Figura 2. Barramento RS-485 e terminais de ligação dos dispositivos

Além disso, o RS-485 oferece imunidade a ruído e baixo custo de componentes. Isso torna os equipamentos mais acessíveis, já que a eletrônica necessária para fazer a comunicação funcionar é relativamente simples, exigindo poucos componentes eletrônicos. Conheça os cursos de Redes RS-485 disponíveis na Udemy.

RS-485: Topologia da rede

A topologia recomendada na rede RS-485 é a Daisy Chain, onde as emendas dos fios A e B são feitas diretamente nos terminais de ligação. Normalmente, os dispositivos possuem terminais parafusáveis, e utilizamos terminais tubulares para fazer a conexão. Nós descascamos os fios que contém o par trançado, e abrimos o cabo apenas onde for necessário fazer as emendas. A configuração básica da rede é mostrada na Figura 3.

Figura 3. Resistores de terminação e bias e conexões elétricas

Além disso, são necessários alguns resistores para o correto funcionamento da rede. Normalmente, colocam-se dois resistores de terminação (120 Ω) entre os fios A e B, nos dispositivos que estão nas extremidades da rede. Dois resistores de bias (normalmente 470 Ω) são conectados a uma fonte de 5 V e ligados aos sinais A e B, conforme a Figura 3. Os resistores de Bias ajudam a estabilizar a tensão nos sinais A e B, o que reduz a probabilidade de falhas de comunicação. Em muitos casos, esses resistores já estão integrados nos equipamentos, então precisamos dar uma conferida na real necessidade.

Módulo RS-485/TTL

O módulo RS-485 para TTL utiliza o chip MAX485. Ele é um transceiver, ou seja, um chip com a função de transmissor e receptor. Ele converte os níveis de tensão TTL, que são os níveis utilizados nos pinos do Arduino, onde as tensões são de 0 V para o bit 0 e 5 V (ou 3,3V, dependendo do microcontrolador) para o bit 1, para os níveis específicos que a RS-485 utiliza. A Figura 4 apresenta o módulo.

Figura 4. Módulo RS-485 para TTL

Além disso, esse módulo possui pinos de controle que são utilizados para gerenciar se estamos transmitindo ou recebendo dados. Como a comunicação RS-485 é half-duplex, normalmente o sistema fica em modo de recepção e só ativa a transmissão quando precisa enviar alguma informação.

O módulo também já vem com um resistor de terminação de 120 Ω soldado na placa e geralmente possui resistores de Bias com valores de 10 kΩ ou 20 kΩ. No entanto, esses valores não são os mais adequados. Como mencionei anteriormente, o valor recomendado para os resistores de Bias é em torno de 470 Ω para garantir uma melhor estabilidade e funcionamento da rede.

As conexões são apresentadas abaixo, na Tabela 1.

Pino do arduino unopino do módulo RS-485/ttl
5 VVCC
GND ou 0 VGND ou 0 V
TXDI
RXRO
2DE e |RE
Tabela 1. Conexões entre Arduino Uno e Módulo RS-485/TTL

Conversor USB/RS-485

O conversor USB/RS-485 apresentado na Figura 5 permite conectar o computador à rede RS-485. Alguns conversores são de baixo custo, embora a qualidade e confiabilidade possam deixar a desejar. Dentro do conversor, podemos encontrar o chip MAX485 e um conversor de USB/Serial UART, que geralmente é o chip CH340. Esses conversores já vêm com os resistores de bias soldados na placa, além de uma espera para o resistor de terminação.

Quando conectamos o conversor USB ao computador, ele aparecerá no Gerenciador de Dispositivos do Windows como uma porta COM.

Figura 5. Circuito interno de um conversor USB para RS-485

Como expliquei anteriormente, seriam necessários apenas dois resistores de bias na rede. Portanto, é importante estarmos cientes de que estes módulos podem adicionar resistores de bias na rede, o que pode influenciar ou até causar falhas na comunicação. Precisamos ficar atentos a esses detalhes. No meu conversor, eu soldei um resistor de 120 Ω para garantir que hajam dois resistores de terminação da rede montada.

Circuito elétrico

Para realizar essa prática, precisamos montar o circuito da Figura 6. Vamos conectar os pinos conforme a Tabela 1.

Figura 6. Conexões elétricas

Os pinos de controle de direção do transceiver são o |RE e o DE. Quando colocamos |RE em nível LOW, ativamos o modo de recepção. Por outro lado, ao colocar o pino DE em nível HIGH, ativamos o modo de transmissão, podendo enviar dados pela rede. Normalmente, deixamos ambos pinos em nível LOW, mantendo o modo de recepção, e só ativamos a transmissão quando precisamos enviar algo (similar a um walkie-talkie).

Adicionalmente coloquei dois resistores de bias: um resistor de 470 Ω entre o VCC e o A e outro resistor de 470 Ωentre o GND e o B, para garantir que a comunicação funcione corretamente. É possível que a comunicação funcione sem esses resistores, mas é bom testar. No meu caso, estes resistores externos foram necessários.

Outro cuidado importante: alguns módulos TTL/RS-485 podem causar falhas na programação do Arduino, pois o Arduino é programado através dos pinos TX e RX. Talvez será necessário desconectar os fios do RO e do DI para conseguir programar o Arduino.

Materiais e preparação

Para a prática, vamos precisar dos seguintes materiais:

  • PC;
  • Arduino Uno;
  • Cabo USB (para conectar o Arduino ao PC);
  • Conversor USB/RS-485;
  • Módulo RS-485/TTL;
  • Resistores de 470 Ω (dois) e 120 Ω (dois);
  • Jumpers: macho-macho e macho-fêmea;
  • Protoboard (opcional, mas recomendada para facilitar as conexões).

Programas e Drivers

  • Baixe e instale o Arduino IDE 2.X.X do site da Arduino;
  • Instale o Termite através do link fornecido ou pesquisando “Termite Serial Download” no Google;
  • Abra o Gerenciador de Dispositivos do Windows para visualizar as portas que serão utilizadas (conforme Figura 7);
  • Conecte o Arduino Uno e verifique se ele aparece na lista. Por exemplo, pode aparecer como “Arduino Uno” na porta COMxx;
  • Conecte o conversor USB/RS-485 e veja se aparece como COMxx;
  • O instalador do Arduino IDE normalmente instala os drivers necessários para as placas Arduino;
  • Para o conversor USB/RS-485, pode ser que o Windows não reconheça o dispositivo automaticamente. Nesse caso, você precisará baixar o driver do site do fabricante ou do site onde comprou o dispositivo. Certifique-se de procurar o driver específico para o chip do conversor USB que está sendo utilizado.
Figura 7. Portas COM dos dispositivos Arduino Uno (COM7) e conversor USB/RS-485 CH340 (COM 8)

Programação do Arduino

Você tem acesso ao código-fonte desta prática no link abaixo.

Comunicação com Arduino usando Módulo RS-485 (.zip)

Download

Enviar link de download para: / Send download link to:

Para fazer o download deste arquivo, inscreva-se em nossa newsletter e fique por dentro de novidades e conteúdos exclusivos! Seu apoio é fundamental para que possamos continuar oferecendo material de qualidade. Muito obrigado por contribuir com a manutenção do nosso blog!

To download this file, sign up for our newsletter and stay up to date with news and exclusive content! Your support is essential for us to continue offering quality material. Thank you very much for contributing to the maintenance of our blog!

No código de exemplo, a primeira coisa que fazemos é definir o pino de controle do módulo conversor RS-485. Vamos definir o pino 2 como RS485_ENABLE.

No setup(), configuramos a porta serial para 9600 bps (bits por segundo) com a configuração 8-N-1 (8 bits de dados, Nenhum bit de paridade, 1 bit de parada). Também configuramos o pino do LED embutido (pino 13) como saída e o pino RS485_ENABLE como saída, já colocando o pino RS485_ENABLE em nível LOW para ativar o modo de recepção.

No loop() (laço principal) checamos se o Arduino recebeu algum byte pela serial — ou seja, se no terminal enviarmos um caractere — vamos testar se chegou alguma coisa. A função Serial.available() retorna quantos bytes chegaram pela serial e ainda não foram lidos. Chamamos a função Serial.read() e guardamos o caractere recebido em uma variável do tipo char chamada c.

Utilizamos um switch para testar qual é o conteúdo do caractere recebido. Se for o caractere 'a', vamos ligar o LED e enviar uma resposta para o terminal. O procedimento para enviar a resposta na rede RS-485 utilizando o módulo RS-485/TTL é o seguinte:

  • Habilitar o modo de transmissão: Damos um digitalWrite() para colocar o RS485_ENABLE em nível lógico alto;
  • Enviar a mensagem: Usamos Serial.println() para enviar a mensagem “LED ligado”. Coloquei um \n para dar uma linha nova e facilitar a visualização das mensagens no terminal;
  • Aguardar o envio: Chamamos Serial.flush(), que aguarda até que todos os caracteres sejam enviados pela serial (aguarda esvaziar o buffer de transmissão);
  • Voltar ao modo de recepção: Em seguida, usamos digitalWrite() para colocar o módulo em modo de recepção novamente.

Se o caractere recebido for ‘b’, fazemos o mesmo procedimento: desligamos o LED, habilitamos o modo de transmissão, enviamos a mensagem “LED desligado”, aguardamos o buffer de transmissão esvaziar com Serial.flush(), e voltamos para o modo de recepção.

Se recebermos outro valor de caractere, simplesmente o descartamos. O loop então retorna ao início, testando se há outro caractere e repetindo o processo de checagem.

Se você quiser adicionar outras funcionalidades, como piscar o LED ou realizar outras ações, basta criar novos casos no switch e implementar a lógica necessária para controlar as saídas ou ler entradas e enviar as respostas para o terminal.

Compreendido o código, podemos compilar e programar o Arduino. As luzes do TX e RX vão piscar no Arduino, indicando que ele está sendo programado. Observe se não houveram problemas durante a programação. Neste caso, remova a conexão de TX e RX com o módulo RS-485/TTL e tente novamente.

Testes no Termite

Agora podemos ir para o Termite, o software onde realizaremos a comunicação. A primeira coisa que vamos fazer é acessar as configurações, clicando em Settings para configurar as comunicações. As configurações são apresentadas na Figura 8.

Figura 8. Configuração das comunicações no Termite.

No menu de configurações, eu vou selecionar o número da porta COM onde está o CH340 (no meu caso, COM8). Vou definir a taxa de comunicação para 9600, com a configuração 8-N-1 (8 bits de dados, nenhum bit de paridade, 1 bit de parada).

Deixarei a opção Append nothing, para que, ao enviar os caracteres ‘a’ ou ‘b’, não seja enviado nenhum caractere extra, como uma nova linha. Vou ativar o Local echo para que possamos ver no terminal os caracteres que estamos enviando. Após configurar tudo, pressione OK. Agora, na parte inferior da janela, posso enviar os caracteres, conforme testes apresentados na Figura 9.

Figura 9. Testes de comunicação no Termite. Enviar os caracteres com comandos no campo inferior.

Quando eu enviar o caractere ‘a’, vocês verão que o LED no Arduino vai ligar. O TX (possivelmente) vai piscar, indicando que houve comunicação. Na janela do Termite, aparecerá a mensagem “LED ligado”, confirmando que o Arduino está recebendo e respondendo adequadamente. Ao enviar o caractere ‘b’, o LED vai desligar, o TX (possivelmente) vai ficar ligado por um tempo, e na janela do Termite, aparecerá a mensagem “LED desligado”, indicando que a comunicação funcionou corretamente. O LED embutido (L) é apresentado na Figura 10.

Figura 10. Led embutido (pino 13) ativo.

Exercícios adicionais

Seguem alguns exercícios para você adicionar novos comandos para leituras de entradas e escrita de saídas:

  • Colocar um potenciômetro em uma entrada analógica e fazer a leitura do valor. Enviar um caractere pelo terminal e receber como resposta o valor atual do potenciômetro.
  • Adicionar um sensor de temperatura, como o LM35, e configurar o Arduino para enviar o valor da temperatura lida quando receber um caractere específico.
  • Utilizar botões para simular comandos de acionamento, onde o Arduino responde com mensagens como “botão acionado” ou “botão desativado” ao pressionar os botões.
  • Acionar saídas como motores de passo ou servo motores e controlá-los a partir de comandos enviados pelo terminal.
  • Conectar um display LCD para exibir mensagens ou valores, controlados pelos caracteres enviados pelo terminal.
  • Criar comandos para fazer o LED piscar. Por exemplo, ao enviar os caracteres ‘1’, ‘2’, ‘3’, etc., o LED pode piscar um número correspondente de vezes.

Essas práticas permitem explorar diferentes dispositivos e expandir o controle do Arduino pela rede RS485.

    Saiba +

    Conheça os cursos que ofereço na Udemy. Existe um curso específico de Redes RS-485 que elaborei especialmente para domínio desta rede e de comunicações com este tipo de rede.

    Referências principais

    1. Bailey, D. and Wright, E. (2003) Practical scada for industry. London: Elsevier.
    2. Boyer, S.A. (2010) SCADA: Supervisory Control and Data Acquisition. Research Triangle Park, NC: International Society of Automation.
    3. Galloway, B. and Hancke, G.P. (2013) ‘Introduction to industrial control networks’, IEEE Communications Surveys & Tutorials, 15(2), pp. 860–880. doi:10.1109/surv.2012.071812.00124.
    4. Tanenbaum, A.S. and Wetherall, D.J. (2011) Redes de Computadores. São Paulo: Pearson Prentice Hall.
    5. Arduino. Serial – Arduino Reference. Disponível em: <https://www.arduino.cc/reference/tr/language/functions/communication/serial/>. Acesso em: 22 out. 2024.
    6. ‌WIKIPEDIA CONTRIBUTORS. RS-485. Disponível em: <https://en.wikipedia.org/wiki/RS-485>.