top of page
Crescer (fundo transparente)_Negativo_pn
Você sabia que a Crescer ensina, fornece e faz soluções de automação e IoT com Arduino e ESP32?

Fale com um especialista

2.png
3.png
1.png
Foto do escritorThales Gonçalves Ferreira

Hardware de comunicação RS232, RS485 e CAN BUS

Atualizado: 6 de mar.

A comunicação entre dispositivos é fundamental para o sucesso de muitos sistemas e equipamentos. Para tornar esse processo mais eficiente e fácil, apresentamos um shield que oferece a implementação simplificada dos protocolos de comunicação RS232, RS485 e CAN BUS.


Desenvolvido com as necessidades do usuário em mente, esse shield possui todo o hardware necessário para utilizar esses três protocolos de comunicação. É possível montá-lo de acordo com o protocolo desejado ou utilizá-lo completo e selecionar o protocolo através dos jumpers na placa. Confira as imagens do shield abaixo.



O produto oferece um diferencial importante, que é a sua completa separação elétrica entre o microcontrolador e o hardware de comunicação. Isso resulta em uma maior segurança e confiabilidade do sistema.


Neste blog, vamos explorar as características do shield e aprender a utilizá-lo.



Sumário



1. Protocolos de comunicação


Antes de utilizarmos o shield, é importante compreender os diferentes protocolos de comunicação disponíveis na placa. Desta forma, poderemos ter uma compreensão mais clara do seu funcionamento e identificar qual protocolo é ideal para cada aplicação específica.


Vamos, então, explorar os protocolos de comunicação presentes na placa e entender suas particularidades.



Protocolo RS232


O RS232 é um dos protocolos de comunicação mais antigos e populares, permitindo a troca de dados entre dispositivos a médias distâncias. Ele foi amplamente utilizado para conexões com computadores, teclados, impressoras, mouses, entre outros periféricos, bem como em aplicações industriais. A velocidade máxima é de 20 kbps, mas geralmente é utilizada uma taxa de transmissão de 9600 bps.


Apesar de ter sido substituído por outros padrões em muitas aplicações, o RS232 ainda é amplamente utilizado em aplicações industriais de controle de processos e em situações que exigem conexões simples e confiáveis entre dispositivos.


Para utilizar o RS232 com o Arduino, ESP32 ou qualquer outro microcontrolador, é necessário utilizar o CI MAX232, que realiza a conversão dos níveis de tensão entre o protocolo e o microcontrolador, permitindo que o microcontrolador envie e receba dados utilizando a comunicação serial.



Protocolo RS485


Ao contrário do RS232, o RS485 permite a conexão de dispositivos em rede, permitindo a comunicação de até 32 equipamentos ao longo de um único barramento. É mais rápido, com taxas de transmissão de até 10 Mbps.


O RS485 é amplamente utilizado em aplicações industriais, como o controle de processos e a automação de edifícios, bem como em aplicações de rede, como a conexão de dispositivos em uma rede local.


Para implementar o RS485 com um microcontrolador, como o Arduino ou ESP32, é necessário utilizar o CI MAX485, que permite a conversão dos níveis de tensão e permite que o microcontrolador envie e receba dados através da comunicação serial.



Protocolo CAN


O protocolo CAN (Controller Area Network) é amplamente utilizado em veículos devido a sua eficiência e confiabilidade na comunicação de rede. Ele utiliza uma topologia de barramento que permite a conexão de vários dispositivos ao mesmo tempo, garantindo a eficiência e a confiabilidade da comunicação.


Além disso, o protocolo CAN é uma escolha atrativa para aplicações industriais, pois foi projetado para ser altamente resistente a erros e confiável, o que é crucial em aplicações onde interrupções na comunicação podem ter consequências graves.


Para utilizar esse protocolo com microcontroladores, são necessários dois circuitos integrados: o MCP2515 e o TJA1050. O MCP2515 é conectado ao microcontrolador por meio de uma interface SPI e fornece uma camada de abstração para o protocolo CAN, facilitando a implementação do protocolo pelo microcontrolador.


O TJA1050 é um transceptor CAN que é usado para transferir dados entre o MCP2515 e a rede CAN. Além disso, ele monitora o estado da rede e notifica o controlador CAN sobre qualquer erro detectado.


Em resumo, o MCP2515 e o TJA1050 trabalham em conjunto para permitir que o microcontrolador se comunique com outros dispositivos na rede CAN usando o protocolo CAN. O MCP2515 fornece uma interface simplificada para o protocolo CAN para o microcontrolador, enquanto o TJA1050 é responsável por transmitir e receber pacotes CAN na rede, garantindo a eficiência e a confiabilidade da comunicação.



2. Shield de comunicação


O nosso shield comporta todos os componentes necessários para utilizar três protocolos de comunicação. Entretanto, não é possível usar todos ao mesmo tempo. É preciso escolher um para utilizar. A seleção pode ser feita de duas maneiras: durante a montagem da placa, soldando somente os componentes necessários para o protocolo desejado ou, através dos jumpers presentes na placa, escolhendo qual protocolo deseja utilizar.



Seleção dos protocolos


A seguir estão ilustradas as configurações dos jumpers para habilitar cada protocolo:


Para usar RS232:

Para usar RS485:


Para usar CAN:


Pinout da placa


A configuração dos pinos de comunicação serial com MAX232 e MAX485 também pode ser alterada. Por padrão, o TX e o RX estão conectados aos pinos 0 e 1 do Arduino e o pino de seleção do RS485 está ligado ao pino 4. A figura a seguir apresenta as conexões padrão na placa.


Veja nas figuras a seguir algumas das ligações alternativas que podem ser feitas:

Para realizar a troca dos pinos de RX, TX e RE. Corte os pontos indicados em azul e solde os jumpers em vermelho na figura a seguir.


Alimentação do shield


O shield pode ser alimentado diretamente pelo barramento, utilizando a mesma fonte do Arduino ou CPB. Isso é possível graças ao uso do conversor de tensão B0505s, que isola a alimentação dos componentes de comunicação da do microcontrolador.


Você pode escolher entre alimentar o shield com 3,3V ou 5V. Por padrão, ele está configurado para 5V. Se desejar alterar a configuração de tensão, será necessário utilizar o jumper, cortando o ponto indicado em azul e soldando o ponto indicado em vermelho, como mostrado na figura.


Para utilizar alimentação em 5V:


Para utilizar alimentação em 3,3V:


Além disso, você também pode optar por utilizar uma fonte de energia externa para alimentar o hardware de comunicação separadamente. Nesse caso, não será necessário utilizar o conversor B0505s, e ele nem deverá estar soldado na placa.


Essa opção é interessante se você precisa de mais estabilidade ou flexibilidade na alimentação do hardware de comunicação. Alimentar separadamente também pode ser uma boa escolha se você já tiver uma fonte de energia externa disponível.



3. Utilizando shield de comunicação


A placa foi projetada em um formato compatível com os shields para Arduino, permitindo que ela seja conectada diretamente a qualquer modelo de CPB ou Arduino.


Nas figuras a seguir, é possível ver o shield conectado a uma CPB32. Essa compatibilidade ampla significa que você pode usar a placa com diferentes microcontroladores e sistemas de acordo com suas necessidades.



Utilizando para RS232


Após configurar o shield de acordo com as conexões desejadas com a ESP32, o próximo passo é conectar os dispositivos com um cabo serial DB9.


Na figura a seguir, apresentamos um exemplo dessa conexão. É importante seguir cuidadosamente as instruções para garantir que a conexão seja estabelecida corretamente e que você possa usar os dispositivos de forma eficiente.



Neste exemplo, programamos uma CPB para enviar dados e outra para receber e exibir no monitor serial. É importante verificar o programa de cada dispositivo para garantir que eles estejam configurados corretamente e possam se comunicar de forma eficiente.


A seguir, você pode ver o código de programação para cada dispositivo.



Programa do emissor


// Inclusão da biblioteca SoftwareSerial
#include <SoftwareSerial.h>

// Definição dos pinos de comunicação serial do módulo
// Pino de recepção de dados
#define Pino_RS232_RX 6
// Pino de transmissão de dados
#define Pino_RS232_TX 5

// Criação de um objeto chamado RS232Serial para comunicação serial com o módulo
SoftwareSerial RS232Serial(Pino_RS232_RX, Pino_RS232_TX);

void setup() {
  // Inicialização da comunicação serial com o módulo com baud rate de 4800
 RS232Serial.begin(4800);
}

void loop() {
  // Envia o texto "Teste Serial - " para o módulo
 RS232Serial.print("Teste RS232 - ");
  // Pausa por 500 milissegundos
  delay(500);
}


Programa do receptor


// Inclusão da biblioteca SoftwareSerial
#include <SoftwareSerial.h>

// Definição dos pinos de comunicação serial do módulo
// Pino de recepção de dados do módulo
#define Pino_RS232_RX 6
// Pino de transmissão de dados do módulo
#define Pino_RS232_TX 5

// Criação de um objeto chamado RS232Serial para comunicação serial com o módulo
SoftwareSerial RS232Serial(Pino_RS232_RX, Pino_RS232_TX);

void setup() {
  // Inicialização da comunicação serial do Arduino com baud rate de 9600
  Serial.begin(9600);
  // Inicialização da comunicação serial com o módulo com baud rate de 4800
 RS232Serial.begin(4800);
}

void loop() {
  // Verifica se existe dados disponíveis para leitura na comunicação serial com o módulo
  while (RS232Serial.available()) {
    // Recebe um caractere do módulo
    char inChar = (char)RS232Serial.read();
    // Imprime o caractere na comunicação serial do Arduino
   Serial.print(inChar);
  }
}


Utilizando para RS485


Para utilizar o protocolo RS485 com o shield, é importante realizar as configurações necessárias. Nesse exemplo, usamos a mesma topologia e conexões utilizadas para o RS232.


A seguir, você pode ver os programas utilizados no dispositivo emissor e receptor.



Programa do emissor


// Inclusão da biblioteca SoftwareSerial
#include <SoftwareSerial.h>

// Definição dos pinos de comunicação serial do módulo RS485
// Pino de recepção de dados do módulo RS485
#define Pino_RS485_RX 6
// Pino de transmissão de dados do módulo RS485
#define Pino_RS485_TX 5

// Definição do pino de controle de transmissão/recepção
// Pino de controle de transmissão/recepção do módulo RS485
#define SSerialTxControl 4
// Definição para o modo de transmissão
#define RS485Transmit HIGH
// Definição para o modo de recepção
#define RS485Receive LOW

// Criação de um objeto chamado RS485Serial para comunicação serial com o módulo RS485
SoftwareSerial RS485Serial(Pino_RS485_RX, Pino_RS485_TX);

void setup() {
  // Inicialização da comunicação serial do Arduino com baud rate de 9600
  Serial.begin(9600);
  // Definição do pino SSerialTxControl como saída
 pinMode(SSerialTxControl, OUTPUT);
  // Inicialização da comunicação serial com o módulo RS485 com baud rate de 4800
 RS485Serial.begin(4800);
  // Configuração do pino SSerialTxControl para modo de recepção
 digitalWrite(SSerialTxControl, RS485Receive);
}

void loop() {
  // Configuração do pino SSerialTxControl para modo de transmissão
 digitalWrite(SSerialTxControl, RS485Transmit);
  // Delay de 10 milissegundos
  delay(10);
  // Envio de uma string de teste para o módulo RS485
 RS485Serial.print("Teste RS485");
  // Configuração do pino SSerialTxControl para modo de recepção
 digitalWrite(SSerialTxControl, RS485Receive);
  // Delay de 500 milissegundos
  delay(500);
}


Programa do receptor


#include <SoftwareSerial.h>

// Define os pinos utilizados para comunicação serial do módulo RS485
#define Pino_RS485_RX 6
#define Pino_RS485_TX 5

// Define o pino de controle de transmissão/recepção
#define SSerialTxControl 4
#define RS485Transmit HIGH
#define RS485Receive LOW

// Instância do objeto SoftwareSerial para a comunicação RS485
SoftwareSerial RS485Serial(Pino_RS485_RX, Pino_RS485_TX);

void setup() {
  // Inicializa a comunicação serial padrão do Arduino
  Serial.begin(9600);

  // Define o pino de controle de transmissão/recepção como saída
 pinMode(SSerialTxControl, OUTPUT);

  // Inicializa a comunicação serial RS485
 RS485Serial.begin(4800);

  // Define o estado inicial do pino de controle como "recepção"
 digitalWrite(SSerialTxControl, RS485Receive);
}

void loop() {
  // Verifica se há dados disponíveis na comunicação RS485
  if (RS485Serial.available()) {
    // Enquanto houver dados disponíveis
    while (RS485Serial.available()) {
      // Recebe o próximo dado da comunicação RS485
      char inChar = (char)RS485Serial.read();
      // Imprime o dado na comunicação serial padrão
     Serial.print(inChar);
    }
  }
}


Utilizando para protocolo CAN


Para se comunicar com o protocolo CAN, não utilizamos o conector DB9. Em vez disso, utilizamos o terminal ao lado do conector de alimentação externa. Isso é mostrado na figura a seguir, que ilustra como fazer a conexão entre dois dispositivos.



A seguir os códigos utilizados como exemplo para essa comunicação:



Programa do emissor


#include <SPI.h>
#include <mcp2515.h>

//Inicializa objeto da biblioteca mcp2515, usando o pino 5 na placa ESP
MCP2515 mcp2515(5);

//Estrutura de dados para armazenar mensagem CAN
struct can_frame canMsg;

//Variável para armazenar dado da mensagem CAN
int msgData0 = 0;

void setup() {
  //Inicializa a serial para exibir mensagens
  Serial.begin(9600);

  //Inicializa comunicação SPI
  SPI.begin();

  //Reset do controlador CAN
  mcp2515.reset();

  //Configura a taxa de transferência para 500 kbps
 mcp2515.setBitrate(CAN_500KBPS, MCP_8MHZ);

  //Configura o modo normal de funcionamento do controlador CAN
 mcp2515.setNormalMode();
}

void loop() {
  //Atribui o valor "A" ao dado da mensagem CAN
  msgData0 = 'A';

  //Configura o identificador de endereço CAN como 0x035
  canMsg.can_id = 0x035;

  //Configura o tamanho da mensagem CAN como 1 byte
  canMsg.can_dlc = 1;

  //Atribui o dado à mensagem CAN
  canMsg.data[0] = msgData0;

  //Envia a mensagem CAN
 mcp2515.sendMessage(&canMsg);

  //Exibe uma mensagem no monitor serial para indicar que a mensagem foi enviada
 Serial.println("Enviado");

  delay(500);
}


Programa do receptor


#include <SPI.h>
#include <mcp2515.h>

// Cria um objeto da biblioteca mcp2515, utilizando o pino 5 na placa ESP
MCP2515 mcp2515(5);

// Estrutura de dados para armazenar a mensagem CAN
struct can_frame canMsg;

// Variável para armazenar o dado da mensagem CAN
int msgData0 = 0;

void setup() {
  // Inicializa a comunicação serial para exibir mensagens
  Serial.begin(9600);

  // Inicializa a comunicação SPI
  SPI.begin();

  // Reseta o controlador CAN
  mcp2515.reset();

  // Configura a taxa de transferência para 500 kbps
 mcp2515.setBitrate(CAN_500KBPS, MCP_8MHZ);

  // Configura o modo normal de funcionamento do controlador CAN
 mcp2515.setNormalMode();
}

void loop() {
  // Verifica se há uma mensagem CAN disponível
  if (mcp2515.readMessage(&canMsg) == MCP2515::ERROR_OK) {
    // Imprime o identificador da mensagem CAN na serial
   Serial.println(canMsg.can_id);
    // Verifica se o identificador da mensagem é igual a 0x035
    if (canMsg.can_id == 0x035) {
      // Armazena o primeiro byte de dados da mensagem
      int x = canMsg.data[0];
      // Imprime o dado na serial
     Serial.println(x);
    }
  }
}


Estes são apenas alguns exemplos do que pode ser feito com nosso shield de Comunicação. A verdadeira potencialidade desse produto se mostra na possibilidade de criar redes complexas com vários dispositivos conectados, tornando a comunicação muito mais eficiente. Além disso, é importante destacar que ele pode ser utilizado em conjunto com outros equipamentos, expandindo ainda mais suas aplicações. Caso tenha gostado da versatilidade desse shield, não deixe de explorar mais sobre ele em nosso portfólio clicando aqui.


Posts recentes

Ver tudo

תגובות


ícone do whatsapp

Fale com um
especialista:

bottom of page