blog-eletrogate-logo-desktop blog-eletrogate-logo-mobile
  • Categorias
    • Voltar
    • INICIANTES
    • INTERMEDIÁRIOS
    • AVANÇADOS
    • divide
    • Automação Residencial
    • Componentes Eletrônicos
    • Impressão 3D
    • IoT
    • Modelagem 3D
    • Módulos Wifi
    • Por trás da tecnologia
    • Projetos
    • Raspberry Pi
    • Robótica
    • Sensores
    • Shields
    • Sistemas Operacionais
    • Tipos de Arduino
    • Tutoriais
  • Apostilas
  • Quem Somos
  • Seja um redator
  • Trabalhe Conosco
    • Categorias
      • Voltar
      • INICIANTES
      • INTERMEDIÁRIOS
      • AVANÇADOS
      • divide
      • Automação Residencial
      • Componentes Eletrônicos
      • Impressão 3D
      • IoT
      • Modelagem 3D
      • Módulos Wifi
      • Por trás da tecnologia
      • Projetos
      • Raspberry Pi
      • Robótica
      • Sensores
      • Shields
      • Sistemas Operacionais
      • Tipos de Arduino
      • Tutoriais
    • Apostilas
    • Quem Somos
    • Seja um redator
    • Trabalhe Conosco
Loja Eletrogate
voltar
  • Introdução
  • O que é a Comunicação Half-Duplex?
  • O que é o Padrão RS-485?
  • Módulo para RS-485
  • Materiais Necessários para o Projeto Comunicação Half-duplex com RS-485
  • Circuito
  • Código
  • Resultado e Demonstração
  • Conclusão
  • Referências
  • Sobre o Autor
Componentes Eletronicos

Comunicação Half-duplex com RS-485

Eletrogate 24 de novembro de 2022Atualizado em: 21 mar 2023

Introdução

Neste projeto, vamos construir um sistema de comunicação Half–Duplex utilizando o padrão RS-485 entre dois Arduinos. Neste sistema, ao manusear um potenciômetro no Arduino 1, o LED no Arduino 2 acende com o brilho proporcional ao nível do potenciômetro. A mesma coisa acontece no sentido inverso, entre o potenciômetro do Arduino 2 e o LED do Arduino 1. Esse projeto tem como intuído demonstrar o uso do padrão RS-485 de uma maneira rápida e fácil.


O que é a Comunicação Half-Duplex?

Half-duplex é uma forma de direção do fluxo de dados. Uma comunicação entre dois dispositivos pode acontecer de três maneiras diferentes: simplex, half-duplex ou full-duplex. Na comunicação Half-duplex, temos um dispositivo Transmissor e outro Receptor, sendo que ambos podem transmitir e receber dados, porém não simultaneamente, a transmissão tem sentido bidirecional. Durante uma transmissão half-duplex, em determinado instante um dispositivo A será transmissor e o outro B será receptor, em outro instante os papéis podem se inverter. Por exemplo, o dispositivo A transmitir dados para B:

Em seguida, o sentido da transmissão seria invertido e B transmitiria para A:

A operação de troca de sentido de transmissão entre os dispositivos é chamada de turn-around e o tempo necessário para os dispositivos chavearem entre as funções de transmissor e receptor é chamado de turn-around time.


O que é o Padrão RS-485?

O padrão RS-485 é bastante utilizado em comunicação entre dispositivos, principalmente em aplicações de aquisição e controle de dados por exemplo CLPs. Uma de suas principais vantagens é que esse padrão permite a utilização de vários dispositivos RS-485 no mesmo barramento, com isso é possível a conexão de vários nós entre si.

O RS-485 é uma interface padrão da camada física de comunicação, um método de transmissão de sinal. Esse método se realiza utilizando um cabo de dois ou três fios: um fio de dados, um fio com dados invertidos e, muitas vezes, um fio terra(GND, 0V), desta forma, transmissores e receptores podem trocar dados através de um único cabo. Tal método de transmissão oferece alta resistência à interferência do modo comum.

O padrão RS-485 define a velocidade máxima da rede em 10Mb/s e distância máxima da rede de 4000 pés, o equivalente a 1.219 metros. Esse padrão é utilizado em diferentes tipo de protocolos, como os protocolos Profibus, OPTOmux, DH-485 e do protocolo Modbus que é bastante utilizado nas indústrias, e entre outros protocolos.


Módulo para RS-485

A comunicação Half-duplex com o RS-485 entre os dois Arduinos se dá pelo uso do módulo conversor TTL para RS485 que utiliza o chip MAX485 (datasheet) que é um transceptor de baixa potência e taxa de variação limitada que trabalha em uma única fonte de alimentação de +5 V e de corrente nominal de 300 mA. O módulo pode atingir uma taxa de transmissão máxima de 2.5Mbps.

Os pinos do módulos são:

  • RO (Receive Output) – Recebe os dados pela serial
  • 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

O mesmo módulo pode ser usado tanto para transmissão como para recepção, bastando habilitar ou desabilitar os pinos RE e DE.


Materiais Necessários para o Projeto Comunicação Half-duplex com RS-485

Todos os materiais podem ser comprados em nossa loja.

  • 1x – Uno R3 + Cabo Usb para Arduino
  • 1x – Mega 2560 R3 + Cabo Usb para Arduino
  • 2x – Conversor de dados TTL para RS485
  • 2x – Potenciômetro Linear 1KΩ
  • 2x – Resistor 1K 1/4W (10 Unidades)
  • 1x – Led Alto Brilho 5mm Azul
  • 1x – Led Alto Brilho 5mm Verde
  • 2x – Protoboard 830 Pontos
  • 1x – Jumpers – Macho/Femea – 40 Unidades de 20cm

cta_cart


Circuito

Ligações no módulo RS-485


Código

No firmware desenvolvido nesse tutorial para iniciar a comunicação o Arduino A envia via RS-485 o caractere ‘I’ em seguida o valor do ADC (pino 0) ligado ao potenciômetro e por fim o caractere ‘F’. O valor será recebido no outro o Arduino B que por sua ver ler o valor e escrever no LED, fazendo assim o LED mudar de brilho e vice-versa do Arduino B para o A.

Esse é o código para o Arduino Uno

/**
 * @file Arduino_RS485_1.ino
 * Criado por: Saulo Aislan
 * @brief Firmware para receber e enviar dados via RS485 (Arduino Uno).
 * @version 1.0
 * 
 * @copyright Copyright (c) 2022
 * 
*/
#include <SoftwareSerial.h>

#define ANALOG_PIN 0      // Pino do potenciomentro
#define ENB_PIN    4      // HIGH = Transmitindo, LOW = Recebendo
#define LED_PIN    10     // Pino do LED

SoftwareSerial serialRS(2, 3); // RO, DI

/**
 * @brief setup
 */
void setup() 
{ 
  Serial.begin(9600);
  serialRS.begin(9600);
  pinMode(LED_PIN, OUTPUT);
  pinMode(ENB_PIN, OUTPUT);
  digitalWrite(LED_PIN, 0); 
  digitalWrite(ENB_PIN, HIGH); 

  Serial.println("\nComunicação Iniciada!");
} 

/**
 * @brief loop
 */
void loop() 
{   
  int analogValue = analogRead(ANALOG_PIN);           // Leitura do potenciomentro 
  int analogData = map(analogValue, 0, 1023, 0, 200); // Mapeamento do valor

  // Iniciando transmissão
  serialRS.print('I');                // Inicio do pacote de transmissão
  serialRS.print(analogData);         // Valor do potenciomento
  serialRS.print('F');                // Fim do pacote de transmissão
  serialRS.flush();  
  delay(5);   

  // Iniciando recebimento
  digitalWrite(ENB_PIN, LOW);         // Habilitar o recebimento do RS485
  if(serialRS.available() > 0)
  {
    if(serialRS.find('I'))            // Inicializando a leitura
    {
      int LedValue = 0;
      LedValue = serialRS.parseInt(); // Transforma em inteiro o valor lido
      if(serialRS.read() == 'F')      // Finalizando a leitura
      {
        ledFunc(LedValue);            
      }    
    } 
  }
  digitalWrite(ENB_PIN, HIGH);        // Habilita a transmissão do RS485
} 

/**
 * @brief Função para acender o led e aumentar ou
 * diminuir o brilho de acordo com o valor recebido
 * @params int lValue valor recebido via RS485
 */
void ledFunc(int lValue)
{
  if(lValue >= 10)
  {
    analogWrite(LED_PIN, lValue); 
  } else {
    analogWrite(LED_PIN, 0);     
  }
}

Esse é o código para o Arduino Mega

/**
 * @file Arduino_RS485_2.ino
 * Criado por: Saulo Aislan
 * @brief Firmware para receber e enviar dados via RS485 (Arduino Mega).
 * @version 1.0
 * 
 * @copyright Copyright (c) 2022
 * 
*/

#include <SoftwareSerial.h>

#define ANALOG_PIN 0      // Pino do potenciomentro
#define ENB_PIN    12     // HIGH = Transmitindo, LOW = Recebendo
#define LED_PIN    13     // Pino do LED

SoftwareSerial serialRS(10, 11); //RO, DI

/**
 * @brief setup
 */
void setup ()
{
  Serial.begin (9600);
  serialRS.begin(9600);
  pinMode(LED_PIN, OUTPUT);
  pinMode(ENB_PIN, OUTPUT);
  digitalWrite(LED_PIN, 0); 
  digitalWrite(ENB_PIN, HIGH); 

  Serial.println("\nComunicação Iniciada!");
}

/**
 * @brief loop
 */
void loop (){
  int analogValue = analogRead(ANALOG_PIN);           // Leitura do potenciomentro 
  int analogData = map(analogValue, 0, 1023, 0, 200); // Mapeamento do valor
  
  // Iniciando transmissão
  serialRS.print('I');                // Inicio do pacote de transmissão
  serialRS.print(analogData);         // Valor do potenciomento
  serialRS.print('F');                // Fim do pacote de transmissão
  serialRS.flush();  
  delay(5);   
  
  // Iniciando recebimento
  digitalWrite(ENB_PIN, LOW);         // Habilitar o recebimento do RS485
  if(serialRS.available() > 0)
  {
    if(serialRS.find('I'))            // Inicializando a leitura
    {
      int LedValue = 0;
      LedValue = serialRS.parseInt(); // Transforma em inteiro o valor lido
      if(serialRS.read() == 'F')      // Finalizando a leitura
      {
        ledFunc(LedValue);            
      }    
    } 
  }
  digitalWrite(ENB_PIN, HIGH);        // Habilita a transmissão do RS485
}

/**
 * @brief Função para acender o led e aumentar ou
 * diminuir o brilho de acordo com o valor recebido
 * @params int lValue valor recebido via RS485
 */
void ledFunc(int lValue)
{
  if(lValue >= 10)
  {
    analogWrite(LED_PIN, lValue); 
  } else {
    analogWrite(LED_PIN, 0);     
  }
}

Resultado e Demonstração

Imagem da montagem

Vídeo da montagem e demonstração

https://blog.eletrogate.com/wp-content/uploads/2022/11/RS485.mp4

Conclusão

Nesse projeto, aprendemos mais sobre comunicação entre dispositivos utilizando o padrão RS-485 e comunicação Half-duplex. Esse projeto é só um pedaço do que é a comunicação entre dispositivos, existe uma vastidão de protocolos e padrões utilizados em diversos cenários, se deseja conhecer mais continue nos seguindo para mais tutoriais e projetos interessantes. Continue acompanhando as postagens semanais do blog e não deixe de visitar nossa loja. Lá, você encontra todos os componentes necessários para desenvolver esse e muitos outros projetos! Que a força estejam com vocês e até mais!


Referências

Referências utilizadas no artigo:

  • https://www.instructables.com/RS485-Serial-Communication-Between-Arduino-Mega-an/
  • https://www.engineersgarage.com/rs485-communication-between-arduino-mega-and-arduino-pro-mini/
  • https://circuitdigest.com/microcontroller-projects/rs485-serial-communication-between-arduino-uno-and-arduino-nano
  • https://create.arduino.cc/projecthub/maurizfa-13216008-arthur-jogy-13216037-agha-maretha-13216095/modbus-rs-485-using-arduino-c055b5
  • https://pt.wikipedia.org/wiki/Duplex
  • https://www.canalti.com.br/redes-de-computadores/modos-de-transmissao-de-dados-simplex-half-duplex-full-duplex/
  • https://www.eltima.com/pt/article/rs485-communication-guide/

Sobre o Autor


Saulo Aislan

Graduando em Tecnologia em Telemática pelo IFPB – Campus de Campina Grande – PB. Tenho experiência com os microcontroladores da família Arduino, ESP8266, ESP32, STM32 e microprocessador Raspberry Pi. Tenho projetos na áreas de IoTs voltada para a indústria 4.0, agroindústria e indústria aeroespacial civil utilizando LoRa, Bluetooth, ZigBee e Wi-Fi. Atualmente estudando e desenvolvendo em FreeRTOS para sistemas em tempo real com ESP32 e LoRaWan para Smart City e compartilhando alguns projetos no blog da Eletrogate.


Eletrogate

24 de novembro de 2022 Atualizado em: 21 mar 2023

A Eletrogate é uma loja virtual de componentes eletrônicos do Brasil e possui diversos produtos relacionados à Arduino, Automação, Robótica e Eletrônica em geral.

Tenha a Metodologia Eletrogate dentro da sua Escola! Conheça nosso Programa de Robótica nas Escolas!

Sensores

Guia de Uso do Sensor de Chama com Arduino

Eletrogate1 de junho de 2023

Aprenda a usar o Sensor Infravermelho de Chama e Fogo com a placa Arduino Leonardo R3 para dar mais segurança a seus projetos.

Sensores

Guia de Uso do Sensor de Chama com Arduino

Eletrogate1 de junho de 2023

Aprenda a usar o Sensor Infravermelho de Chama e Fogo com a placa Arduino Leonardo R3 para dar mais segurança a seus projetos.

Automação Residencial

Controle de Luminosidade com LDR sem Arduino

Eletrogate25 de maio de 2023

Podemos usar um sensor LDR junto com uma placa Arduino para interpretar a variação luminosa. Mas, também podemos usar poucos componentes eletrônicos para fazer isso, sem programação.

Automação Residencial

Controle de Luminosidade com LDR sem Arduino

Eletrogate25 de maio de 2023

Podemos usar um sensor LDR junto com uma placa Arduino para interpretar a variação luminosa. Mas, também podemos usar poucos componentes eletrônicos para fazer isso, sem programação.

Módulos Wifi

Deauther com NodeMCU ESP-12E

Eletrogate18 de maio de 2023 Atualizado em: 29 maio 2023

No post de hoje, iremos aprender a fazer um deauther com o esp8266. Venha conferir!

Módulos Wifi

Deauther com NodeMCU ESP-12E

Eletrogate18 de maio de 2023 Atualizado em: 29 maio 2023

No post de hoje, iremos aprender a fazer um deauther com o esp8266. Venha conferir!

Componentes Eletronicos

Conhecendo a Pastilha Piezoelétrica

Eletrogate11 de maio de 2023

Como converter energia mecânica em energia elétrica e ainda usar o Arduino para gerenciar isso tudo.

Componentes Eletronicos

Conhecendo a Pastilha Piezoelétrica

Eletrogate11 de maio de 2023

Como converter energia mecânica em energia elétrica e ainda usar o Arduino para gerenciar isso tudo.

Eletrogate Robô

Cadastre-se e fique por
dentro de novidades!

blog-eletrogate-logo-footer

Rua Rio de Janeiro, 441 - Sala 1301
Centro - Belo Horizonte/MG
CEP 30160-041
*Não temos atendimento físico

ANWAR SLEIMAN HACHOUCHE - ME
CNPJ: 18.917.521/0001-73

Atendimento

(31) 3142-3800

contato@eletrogate.com


Seg a Sex - das 8h às 17h

Institucional

  • Apostilas
  • Quem Somos
  • Privacidade
  • Seja um Redator
  • Trabalhe Conosco

Nos acompanhe

Facebook Instagram Youtube

© ELETROGATE 2023 - Todos os direitos reservados. Termos de uso e Política de privacidade.