Arduino: RS-232/RS-485 - Hardware

RS-232

A plataforma Arduino proporciona uma ótima experiência com conectividade USB já integrada. Com ela, facilmente pode-se conectar a placa a um PC e fazer o upload do programa para a placa. Além disso é possível fazer aplicações que interagem com o PC enviando e recebendo dados, conforme foi apresentado nesse artigo sobre comunicação serial.

 

Porém em algumas situações há a necessidade de fazer interface serial com dispositivos que possuem o padrão RS-232 ou RS-485. Esses padrões são muito utilizados em ambientes industriais, onde é possível fazer interface entre computadores, inversores de frequência e até mesmos CLPs ou IHM’s.

 

Para facilitar a conexão do Arduino a esses dispositivos foram desenvolvidos shields que convertem os sinais do microcontrolador em níveis compatíveis com tais padrões. Nesse artigo vamos explorar o hardware do RS-232/RS-485 Shield para Arduino.

 

Comunicação Serial

 

A comunicação serial é muito utilizada em sistemas embarcados para transferência de dados entre dispositivos, seja entre um dispositivo e um computador ou até mesmo entre periféricos na mesma placa. Um dos benefícios da comunicação serial é a utilização de poucos pinos para transferência de dados. Pode-se utilizar apenas um pino de I/O do microcontrolador, o que reduz muito, se comparado a 8 ou mais pinos em uma comunicação paralela.

 

Em uma comunicação serial os bits são transmitidos um após o outro respeitando um tempo limite para cada bit. A transferência de bits pode ser half ou full duplex. Na half duplex apenas um dispositivo envia informação por vez, enquanto o outro recebe. Já na full duplex o dois lados podem enviar e receber informações ao mesmo tempo.

 

Uma transmissão serial pode ser síncrona ou assíncrona. Na transmissão síncrona tanto o transmissor quanto o receptor utilizam o mesmo sinal de clock. O clock é gerado pelo master da comunicação e necessita de uma via para envio do mesmo.

 

Já em uma comunicação assíncrona, o sinal de clock não é enviado junto aos dados, ou seja, tanto o emissor quanto o receptor geram esse clock para envio (transmissor) e recepção da informação (receptor). Porém para que ambos os lados gerem o mesmo clock a taxa de transferência (baud rate) deve ser configurada igualmente. O sinal clock, em cada lado, pode apresentar um pequeno desvio em relação um ao outro, que mesmo assim os bits serão corretamente transmitidos e lidos. Os dados são enviados em bytes com mais 2 ou 3 bits de controle. A figura 1 exibe o envio de um byte pelo canal serial de forma assíncrona:

 

figura 1Figura 1 - Envio de byte

 

O bit de start pode ocorrer a qualquer momento iniciando a transmissão/recepção do byte. O bit de paridade é utilizado para verificação de erro no dado transmitido. O bit de stop indica o fim do dado e é necessário para que se possa iniciar uma nova transmissão. Note que quando não há dado sendo transmitido a linha permanece em nível alto.

 

A SPI e a I2C são exemplos de comunicações síncronas, já a UART (Universal Asynchronous Receiver/Transmitter), como próprio nome diz, é um exemplo de comunicação assíncrona.

 

A SPI e I2C são utilizadas para comunicação entre CIs em uma placa, para troca de dados, por exemplo, entre um microcontrolador e uma memória externa. Já a UART é muito utilizada para comunicação entre dispositivos externos à placa, como por exemplo um PC.

 

A UART proveniente do microcontrolador apresenta níveis de tensão entre 0 e VCC como foi apresentado na figura 1. Os níveis podem apresentar valores entre 0 e 1,8V, 0 e 3,3V ou 0 e 5V, conforme a tensão de alimentação do microcontrolador utilizado. Tais níveis de tensão, quando transmitidos em cabos por alguns metros, são suscetíveis a interferências externas ou queda de tensão no próprio cabo. Esse fatores acabam atrapalhando na transmissão e recepção dos dados. Para reduzir esses efeitos foram criados padrões de comunicação que definem o meio de comunicação e os sinais elétricos utilizados. O padrões mais conhecidos e utilizados para essa finalidade foram o RS-232 e RS-485. A seguir vamos entender como funcionam esses padrões e qual a aplicação de cada um.

 

 

RS-232

 

A RS-232 foi criada por volta dos anos 60 pela EIA (Electronic Industries Association). O prefixo RS vem do inglês, Recommended Standard. Trata-se de um padrão que define as características elétricas e físicas, como conexões de hardware, pinagem e nomenclatura de sinais.

 

A RS-232 é utilizada ponto a ponto, podendo trabalhar em full duplex. Cada ponto recebe um nome, um lado é chamado de DTE (Data Terminal Equipment) e o outro DCE (Data Communication Equipment). Essa nomeclatura remete à ligação entre o PC e modem, conforme exibido na figura 2:

 figura 2Figura 2 - DTE e DCE

 

Cada transmissor envia dados através da variação de tensão na linha. Uma tensão maior que 3 V é considerada o valor binário zero, enquanto uma tensão menor que - 3V é considerado o valor binário um. Entre essas tensões, o valor é indefinido. Para garantir o envio e recepção dos dados o transmissor deve operar com +/- 12V e o receptor identificar valores de +/- (3V a 15V).

 

Para converter o sinal lógico (0 e 5V) para o padrão RS-232 é utilizado um circuito conversor ou mais facilmente um CI como o caso do MAX232. A figura 3 exibe os níveis de tensões para envio de um byte através do padrão RS-232:

figura 3Figura 3 - Sinais TTL e RS-232

 

O padrão define velocidade de até 20Mbps e geralmente são utilizados alguns valores comuns: 300, 1200, 2400, 4800, 9600 e 19200 bps. Velocidades maiores são possíveis desde que utilizados bons cabos em pequenas distâncias. A RS-232 não atinge grandes distâncias de transmissão geralmente sendo utilizada em poucos metros sem que haja interferência externa.

 

O padrão define os conectores e sinais. A figura 4 exibe os conectores e sinais para ligação do padrão RS-232:

 

figura 4 - conectores rs232

Figura 4 - Conectores e sinais RS-232

 

Na maioria das aplicações utiliza-se o conector DB9 e apenas os sinais TX, RX e GND.

 

 

RS-485

 

O padrão RS-485, também criado pela EIA, é uma comunicação balanceada. Normalmente utiliza-se par trançado para ligação entre os dispositivos podendo chegar em até 10Mbps e alcançando distâncias de até 1200 m, dependendo do cabo e blindagem. Por ser uma comunicação balanceada e utilizar cabos em par trançado, apresenta uma grande imunidade a ruídos.

 

É uma comunicação multi ponto podendo conectar até 32 dispositivos na rede. O sinal TTL é convertido em um sinal diferencial e transmitido através de duas vias. Geralmente a rede é composta de um mestre e os demais são escravos. A figura 5 exibe um exemplo de ligação típica da rede RS-485:

RS-232

Figura 5 - Ligação rede RS-485


A RS-485 não define conector padrão, dessa forma pode-se utilizar variados tipos de conectores ou até mesmo o DB9 utilizado na RS-232.

 

 

Hardware

 

O shield utilizado nesse artigo apresenta ambos os padrões RS-232 e RS-485 com fácil conexão ao Arduino. Facilmente pode-se converter a UART para um desses padrões. O shield apresenta um conector DB9 (fêmea) para conexão com dispositivos com padrão RS-232. Para comunicação RS-485 está disponível um borne. Além disso possui uma área para prototipagem. A figura 6 exibe estes detalhes da placa.

 

RS-232

Figura 6 - Conexões e área de prototipagem.

 

Com este shield é possível trabalhar com UART por hardware ou através da biblioteca softserial. Além disso é possível escolher entre o padrão RS232 ou RS485. A seleção é feita através das chaves exibidas na figura 7.

 RS-232

Figura 7 - Chaves de seleção

 

O circuito é composto basicamente por 2 CI's, responsáveis pela conversão entre o TTL e os padrões RS232 e RS485. Antes de explorarmos estes CIs vamos verificar quais pinos do Arduino estão sendo utilizados e como é feita a seleção dos modos de operações através das chaves de seleção. A figura 8 exibe a pinagem dos conectores headers do shield.

  RS-232

Figura 8 - Ligações do Shield aos pinos do Arduino

 

Note que este shield é compatível com a REV3 do Arduino UNO. São utilizados apenas 5 pinos do Arduino para conexão com o shield além dos pinos de alimentação: 5V e GND. Dessa forma é possível conectar shields ou módulos para utilizar os outros pinos.

 

O circuito de seleção é apresentado na Figura 9 a seguir:

 

RS-232

Figura 9 - Circuito para seleção de modos de operação

 

Como se pode observar é possível trabalhar em 4 modos diferentes, através da seleção das chaves:

  • UART para RS-232;
  • UART para RS-485;
  • SoftSerial para RS-232;
  • SoftSerial para RS-485.

 

O circuito também apresenta dois LEDs para indicação de status das linhas TX e RX. A figura 10 exibe o circuito de acionamento desses LEDs. Note que são acionados através de transistores MOSFET, FDN340P:

 RS-232

Figura 10 - LEDs de status

 

O circuito para conversão do sinal TTL no padrão RS-232 é apresentado na figura 11 a seguir:

 

RS-232

Figura 11 - circuito conversor TTL para RS-232

 

O CI responsável para conversão entre os padrões é o SP3232EA. Este CI é pino a pino compatível com o famoso MAX3232. Este CI faz a inversão dos sinais TTL, no pino de transmissão a tensão é convertida para  aproximadamente +10V /-10 V que estão dentro dos níveis estabelecidos pelo padrão RS-232. No pino de recepção que recebe o padrão RS-232, a tensão é convertida para 0 e 5V para leitura do microcontrolador.

 

O circuito para conversão do sinal TTL no padrão RS485 é apresentado na figura 12 a seguir:

 RS-232

Figura 12 - circuito conversor TTL para RS485

 

O circuito é baseado no MAX481CSA, responsável por converter o sinal TTL em um sinal diferencial. Note que o circuito possui jumpers para ligar os resistores de pull-up e pull-down além de jumper para ligar resistor de terminação de linha. Também é possível selecionar o controle da transmissão para automático ou manual através do jumpers SJ1. Esse jumper já vem selecionado para o modo automático.

 

Confira na figura 13 um resumo de todas as funcionalidades do shield RS232/RS485:

 

RS-232

Figura 13 - Resumo de recursos do shield

 

 

Saiba mais

 

Arduino - Primeiros Passos

Comunicação SPI

Comunicação Serial com Microcontroladores: USART, I2C, SPI e Outros

 

 

 

Referências

 

RS232/RS485 Shield para Arduino

Tutorial Sparkfun - Serial Communication

Biblioteca softserial

http://www.mouser.com/ds/2/149/FDN340P-103694.pdf

SP3232EA

MAX3232

NEWSLETTER

Receba os melhores conteúdos sobre sistemas eletrônicos embarcados, dicas, tutoriais e promoções.

Obrigado! Sua inscrição foi um sucesso.

Ops, algo deu errado. Por favor tente novamente.

Licença Creative Commons Esta obra está licenciada com uma Licença Creative Commons Atribuição-CompartilhaIgual 4.0 Internacional.

Fábio Souza
Engenheiro com experiência no desenvolvimento de projetos eletrônicos embarcados. Hoje é diretor de operações do portal Embarcados, onde trabalha para levar conteúdos de eletrônica, sistemas embarcados e IoT para o Brasil. Também atua no ensino eletrônica e programação pelo Brasil. É entusiastas do movimento maker, da cultura DIY e do compartilhamento de conhecimento, publica diversos artigos sobre eletrônica e projetos open hardware, como o projeto Franzininho Participou da residência hacker 2018 no Redbull Basement. Quando não está ministrando palestras, cursos ou workshops, dedica seu tempo “escovando bits” ou projetando placas eletrônicas.

37
Deixe um comentário

avatar
 
20 Comment threads
17 Thread replies
6 Followers
 
Most reacted comment
Hottest comment thread
11 Comment authors
Luiz Fernando Souza SoftovLucas FrancoGerson SenaRUBENS.BFábio Souza Recent comment authors
  Notificações  
recentes antigos mais votados
Notificar
Luiz Fernando Souza Softov
Visitante
Luiz Fernando Souza Softov

Estou trabalhando em um projeto com RS485 no Arduino Nano e Mega2560, para uma rede de múltiplos dispositivos.

Com possibilidade de envio de comandos para leitura de valores ou alteração dos pinos.

Bem como envio de script, tudo em binário, sendo possível por exemplo enviar um lote de comandos.

set digital 5 output low
delay 5000
set digital 5 output high
delay 1000
set digital 6 output low
delay 5000
set digital 6 output high

Futuramente teremos uma documentação melhor.

https://github.com/BrByte/brb_arduino_rs485

Gerson Sena
Visitante
Gerson Sena

Muito bom! Obrigado por compartilhar. Saberia dizer se tem uma shield ou módulo que faça o inverso? Me permita converter um sinal oriundo de RS232/ 485 para UART do Arduino (ou similar)?

Lucas Franco
Visitante
Lucas Franco

Também estou a procura, você conseguiu encontrar algo?

Gerson Sena
Visitante
Gerson Sena

Não encontrei, mas também deixei de procurar... acabou que o projeto não foi adiante.

RUBENS.B
Visitante
RUBENS.B

Quero agradecer aos representantes do site Embarcados e a você Fábio S. Sou estudante de Automação Industrial e o artigo acima me ajudou e muito, esclareceu muitas dúvidas. Continuem esse ótimo trabalho!

Cristiano Vieira
Visitante
Cristiano Vieira

Ola,
Estou com um projeto para indicação de novo vagas livres em um supermercado e gostaria de ver capacidade de um arduino em receber dados em RS 232 de um sensor e retornar com uma sinalização por leds verdes ou vermelhos de acordo com a resposta sensor, quantos sensores consigo em uma placa?
Obrigado.

Uederson Ferreira Ramos de Oliveira
Visitante
Uederson Ferreira Ramos de Oliveira

Muito bom conteúdo!
Estava procurando mais informações sobre RS232 e encontrei esse artigo.
Saberia me informar algum outro conteúdo onde alguém tenha implementado um sistema básico para transferência simples, usando componentes discretos?
Você tem algum curso que ministre a respeito disso?
Obrigado, meu amigo!

Chinnon Santos
Visitante

Esse artigo é perfeito, parabéns ao autor... tenho uma dúvida sobre o uso de modulo simples de TTL para RS-485, esse que usa o chip MAX485 e é bem menor que o apresentado aqui, no caso para uso somente da comunicação RS-485 seria melhor utilizar ele no lugar dessa que possui tanto a RS-232 e RS-485? ou essa que possui ambas as comunicações é mais robusta e confiável do que a que possui somente a RS-485?

Fabio_Souza_Embarcados
Visitante
Fabio_Souza_Embarcados

Chinnon, você pode usar apenas o MAX485, ou seja, só o circuito para a RS-485.

Chinnon Santos
Visitante

Obrigado pela explanação Fabio, nota 10...

Fabio_Souza_Embarcados
Visitante
Fabio_Souza_Embarcados

Disponha!

Fabio_Souza_Embarcados
Visitante
Fabio_Souza_Embarcados

Algo assim:comment image

Chinnon Santos
Visitante

Rapaz, que puta artigo, muito bom, bem detalhado e com diversos links de referência... Uma dúvida que tenho é sobre qual a melhor escolha entre UART ou Softserial? pelo que eu entendi a Softserial utiliza uma biblioteca para traduzir a comunicação é a UART é nativa do chip, mas se a UART é nativa, como obter os dados transmitidos pela porta RS-485? talvez minha pergunta seja amadora, mas sou iniciante na utilização de Arduino com equipamentos de comunicação serial, principalmente sensores...

Frederik Vagner Paiva
Visitante
Frederik Vagner Paiva

Quais pinos eu utilizo com este shield para usar o RS232? Eu já tentei vários, porém eu só recebo lixo ou texto em branco. PS: eu já testei a velocidade.

Fabio_Souza_Embarcados
Visitante
Fabio_Souza_Embarcados

Vai depender das configurações das chaves, conforme apresentado no texto. Se tiver selecionado comunicação por hardware, você utilizará os pinos D0 e D1. Caso sela selecionado comunicação por software você utilizará os pinos D2 e D3. Além disso deve-se verificar a ligação do cabo no conector DB9.

Abraços

Frederik Vagner Paiva
Visitante
Frederik Vagner Paiva

Segui as suas recomendações. Selecionei RS232 no shield, depois o Softserial. A única coisa que recebo é texto branco, nada útil.
Essas configuraçãoes permitem o uso do RS232 simultâneo com o USB?
PS: mesmo sem o USB, ainda so recebo lixo
PS2: no meu computador, eu espero uma conexão tipo 9600 8N1

Fabio_Souza_Embarcados
Visitante
Fabio_Souza_Embarcados

Certo, usando a softSerial você não terá conflito com a USB. A configuração está certa.
Compartilhe o seu código para eu testar aqui.

Abraços

Frederik Vagner Paiva
Visitante
Frederik Vagner Paiva

#include "Arduino.h"
#include "SoftwareSerial.h"
SoftwareSerial mySerial(2, 3);

void setup()
{
Serial.begin(57600);

Serial.println("Goodnight moon!");

mySerial.begin(9600);
mySerial.println("Hello, world?");
}

void loop()
{
Serial.println("Hello from USB");
mySerial.print("Hello from RS232n");
}

Um código bem básico. O shield está aclopado ao Arduino Uno Rev3 como o cabo encaixado no máximo possível. Eu recebo corretamente pelo USB, mas não pelo RS232

Frederik Vagner Paiva
Visitante
Frederik Vagner Paiva

Ao que tudo indica, o meu shield está defeituoso. Eu já tentei mudar SoftwareSerial.h por AltSoftSerial.h, mas nada. Se você puder me dizer se tudo funcionou com você, seria ótimo.

Mas agradeço a sua ajuda que você me deu.

Fabio_Souza_Embarcados
Visitante
Fabio_Souza_Embarcados

Aqui tudo funcionou, todos os modos estão funcionando. teste a ligação da RS232. Abraços

Frederik Vagner Paiva
Visitante
Frederik Vagner Paiva

De alguma forma consegui colocar para funcionar. O Arduino não envia nada pela RS232, mas recebe, porém a taxa de erro é muito alta, quase 70%. Eu testei dois cabos diferentes e dois shields diferentes. Tanto o software do computador quanto no Arduino estão configurados como 9600 8N1. Desconheço a causa do erro.

Fabio_Souza_Embarcados
Visitante
Fabio_Souza_Embarcados

Nos meus testes, funcionou perfeitamente. talvez você esteja com problema na placa ou então com erro na ligação do cabo da RS232. Abraços

trackback

[…] Arduino: RS-232/RS-485 - Hardware […]

Leonam Antunes
Visitante
Leonam Antunes

Olá Boa noite, Onde eu encontro esse shield pra vender ?

Fabio_Souza_Embarcados
Visitante
Fabio_Souza_Embarcados

Boa noite Leonam, conforme descrito no artigo, este shield foi fornecido pela loja FilipeFlop. Acredito que eles ainda o tenham em estoque.

Abraços