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.
Autor: Thales Ferreira