Neste artigo, vamos explorar como configurar duas ESP32 para se comunicarem entre si utilizando comunicação serial. Este método é ideal para projetos que envolvem a troca rápida de informações, como o controle de dispositivos ou a transmissão de dados de sensores entre módulos.
O projeto foi desenvolvido para ser simples e acessível a todos os entusiastas de sistemas embarcados.
Como o próprio nome sugere, a comunicação serial acontece de forma serializada, que é outro modo de dizer “em sequência”. Dessa forma, os bits são transmitidos um após o outro até que todo o conteúdo da mensagem trafegue pelos fios.
Essa forma de comunicação é utilizada em diversos produtos IoT que usamos no dia a dia, embora não seja a mais eficiente em termos de transferência de dados.
Contrastando com a comunicação serial, temos a técnica de comunicação em paralelo. Na última, a mensagem a ser enviada é particionada e cada fio transmite um bit em paralelo. Assim, se temos 4 fios usados na comunicação paralela, a transmissão ocorre 4 vezes mais rapidamente em comparação com a comunicação serial.
Posto isso, por que aprender comunicação serial? Aqui estão algumas bons motivos:
Entendeu como é importante saber trabalhar com comunicação serial? Vamos direcionar nossos estudos a um dos protocolos mais empregados na indústria: o UART.
Pelo protocolo UART, o transmissor envia a mensagem ao receptor usando apenas um fio. Portanto, tudo que o transmissor pode fazer é alternar a tensão no fio entre alto e baixo usando um padrão conhecido pelo receptor. O receptor, por sua vez, acompanha as mudanças ocorridas no fio e as decodifica, resultando na mensagem enviada pelo transmissor.
Você deve estar se perguntando “se a transmissão de dados acontece somente em um fio, como o receptor sabe decodificar a mensagem” e a resposta para isso é: o receptor empacota os bits recebidos para formar algo que faça sentido, como um byte. Em outras palavras, o receptor e o transmissor podem estar configurados para que a fração enviada da mensagem e a reconstrução no receptor ocorram sempre em pacotes de 8 bits.
Em resumo, um protocolo nada mais é do que um conjunto de regras que regem a forma com que os dispositivos comunicam entre si.
Com a teoria fresca, vamos colocar a mão na massa!
O circuito conecta os pinos de transmissão (TX) e recepção (RX) dos dois ESP32. Veja o diagrama:
Note que às vezes o terminal (pino) vai ter a marcação Rx2 e Tx2; nos modelos que possuo (ESP32D), eles não estão referenciados dessa forma, mas assim como P16 e P17, terminais também conhecidos como GPIO16 e GPIO17. Verifique a nomenclatura do seu modelo na hora de conectar os fios.
É muito importante ficar atento ao fato de que a conexão é feita de modo cruzado. O Rx de um ESP32 conecta-se ao Tx do outro ESP32.
Isso acontece porque, no fim das contas, a transmissão dos dados segue apenas um caminho Tx -> Rx. Se usássemos apenas um cabo, somente um dos ESP32 poderia enviar, enquanto o outro ficaria limitado a apenas receber o que foi enviado.
Outro detalhe importante é o GND em comum dos ESP32. Quando a transmissão dos dados acontece, o microcontrolador alterna a tensão nos cabos entre alto e baixo; mas esse processo seria inútil se ambos os microcontroladores não tivessem uma referência comum, que é o GND.
Funcionalidade de cada pino do ESP32. Retirado de Upesy.
A referência de GND comum serve para os microcontroladores terem um mesmo valor zero, cujo qual é usado para definir o que é sinal alto e o que é sinal baixo.
Antes de começarmos, certifique-se de que você tenha o VSCode instalado com a extensão do Platformio habilitada. Caso não tenha o setup preparado, faça o passo a passo de nosso tutorial.
Você também pode optar por usar a IDE do Arduino. Como profissional, não recomendo utilizar a Arduino IDE pois ela acaba por limitar o desenvolvimento de projetos mais avançados; mas para este tutorial, a escolha é totalmente sua.
Vamos iniciar o desenvolvimento nomeando os ESP32 utilizados. Para simplificar, chame um ESP32 de “ESP32-1” e o outro de “ESP32-2”. Vamos usar uma macro para o nome, pois usaremos esta informação mais tarde.
Nesta primeira parte fazemos com que o “ESP32-1” envie a mensagem “Olá do ESP32-1” para o “ESP32-2”, que deve responder com um “Olá do ESP32-2” de volta.
Veja o código deste sistema:
#include <Arduino.h>
#define NOME_DO_ESP32 "ESP32-1"
void setup() {
Serial.begin(115200);
Serial1.begin(9600, SERIAL_8N1, 16, 17);
delay(10);
}
void loop() {
Serial.println("Enviando a mensagem");
Serial1.print("Olá do " + String(NOME_DO_ESP32));
delay(10);
while (!Serial1.available());
String mensagem = Serial1.readString();
Serial.println("Mensagem recebida: " + mensagem);
delay(5000);
}Código para a ESP32-2 (Recepção de Dados)
#include <Arduino.h>
#define NOME_DO_ESP32 "ESP32-2"
void setup() {
Serial.begin(115200);
Serial1.begin(9600, SERIAL_8N1, 16, 17);
delay(10);
}
void loop() {
if (Serial1.available()) {
String mensagem = Serial1.readString();
Serial.println("Mensagem recebida: " + mensagem);
Serial1.print("Olá do " + String(NOME_DO_ESP32));
}
}Como vimos na introdução, o protocolo serve para que os dispositivos falem um “idioma comum” durante as interações. Para que isso aconteça, deve haver um padrão no envio das mensagens.
Todo protocolo tem duas partes: a primeira diz respeito ao cabeçalho, responsável por levar informações de identificação; a segunda são os dados em si, também chamados de payload (ou carga, em Português).
Para ficar mais claro, você pode pensar em como enviamos e-mail: temos um destinatário, um assunto, nosso próprio e-mail e, por fim, o conteúdo do e-mail. Tudo exceto o conteúdo do e-mail é o cabeçalho do protocolo, sendo o conteúdo em si o payload.
Visando deixar este tutorial simples, vamos usar o seguinte padrão: tudo será feito usando o tipo String do Arduino; o cabeçalho terá 3 caracteres e o restante do pacote é payload. Vamos definir 2 códigos:
Veja como nosso projeto vai ficar:
Código para a ESP32-1 (Envio de Dados)
#include <Arduino.h>
#define NOME_DO_ESP32 "ESP32-1"
void setup() {
Serial.begin(115200);
Serial1.begin(9600, SERIAL_8N1, 16, 17);
delay(10);
}
void loop() {
Serial.println("Enviando a mensagem");
Serial1.print("LDN10");
delay(25000);
Serial1.print("LDR10");
delay(5000);
}Código para a ESP32-2 (Recepção de Dados)
#include <Arduino.h>
#define NOME_DO_ESP32 "ESP32-2"
void setup() {
Serial.begin(115200);
Serial1.begin(9600, SERIAL_8N1, 16, 17);
pinMode(2, OUTPUT);
delay(10);
}
void loop() {
if (Serial1.available()) {
String mensagem = Serial1.readString();
Serial.println("Mensagem recebida: " + mensagem);
String codigo = mensagem.substring(0, 3);
int numeroDePiscadas = mensagem.substring(3).toInt();
Serial.println("Código: " + codigo);
Serial.println("Número de piscadas: " + String(numeroDePiscadas));
if (codigo == "LDN") {
for (int iteracao = 0; iteracao < numeroDePiscadas; iteracao++) {
digitalWrite(2, HIGH);
delay(1000);
digitalWrite(2, LOW);
delay(1000);
}
}
if (codigo == "LDR") {
for (int iteracao = 0; iteracao < numeroDePiscadas; iteracao++) {
digitalWrite(2, HIGH);
delay(200);
digitalWrite(2, LOW);
delay(200);
}
}
}
}Pudemos ver que o “ESP32-2” só respondeu quando a mensagem continha o código esperado, que era ou LDR ou LDN. Embora seja um exemplo lúdico, na indústria IoT esse recurso é utilizado em todos os projetos. O motivo disso é que, uma vez lançado no mercado, qualquer pessoa com conhecimento em eletrônica consegue ver as informações que trafegam pela UART, posto que é um protocolo físico bastante conhecido. Porém, ao usarmos técnicas de criptografia e protocolos proprietários, extrair e entender os dados coletados não é tão fácil assim.
Veja o resultado finado do projeto no vídeo a seguir:
Neste artigo, aprendemos como configurar duas ESP32 para se comunicarem utilizando a interface serial. Este método é altamente eficaz para projetos de IoT e automação, onde a comunicação direta entre dispositivos é essencial.
Com este tutorial, esperamos que você consiga implementar a comunicação serial de forma simples e prática, utilizando produtos comercializados pela Eletrogate.
Um forte abraço e até a próxima.
|
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!