Pular para o conteúdo

Jefferson Wilhelm Meyer Soares

ATV 10 — Da UART para a rede CAN

A leitura por UART

Da UART para a rede CAN: ESP32, DHT11 e o transceiver WCMCU-230

Nesta prática, dois ESP32 trocam a leitura de um DHT11, primeiro por um fio de UART e depois por uma rede CAN. A informação é a mesma nos dois casos, temperatura e umidade; o que muda é o caminho e as regras do caminho. Em vez de ver a leitura pronta na tela, vocês vão ver os bytes que chegam e descobrir, a partir deles, o que foi enviado.

Os dois ESP32 têm papéis fixos. O transmissor é o que tem o DHT11 ligado: lê a temperatura e a umidade e envia as leituras. O receptor mostra no monitor serial exatamente o que chega, byte a byte, em hexadecimal. O sensor é só o DHT11.

Cada ESP32 pode ficar ligado por USB ao seu próprio computador, ou os dois ao mesmo. Com dois computadores, o terra das placas não passa mais pelo USB, e o fio de GND entre os dois ESP32 é o que dá a referência comum para os sinais. Ele aparece em todas as montagens e nunca sai.

Material:

  • 2 ESP32 DevKit V1
  • 2 módulos transceiver CAN WCMCU-230 (SN65HVD230)
  • 1 DHT11
  • fios, protoboard e multímetro
  • o firmware, no anexo atv10-firmware.zip deste material: a pasta 10 - firmware, um só código com quatro modos de gravação, transmissor-uart, receptor-uart, transmissor-can e receptor-can, que abre no Arduino IDE ou no PlatformIO

O firmware vem pronto. Ninguém programa nesta prática: nos modos CAN, o arquivo protocolo.h guarda só a configuração da rede (identificadores, posição dos bytes, taxa e filtro), e o que se faz nele é trocar valores. O monitor serial trabalha a 115200 bps nos dois ESP32.

Com os dois ESP32 no mesmo computador, cada um aparece numa porta, /dev/ttyUSB0 e /dev/ttyUSB1 no Linux ou COM3, COM4 no Windows. A ordem depende de qual USB foi ligado primeiro e muda quando se religa uma placa. Antes de cada gravação, confira qual porta é a do ESP32 do DHT11.

Gravar pelo Arduino IDE. Instale, uma vez, o pacote de placas esp32 da Espressif (Ferramentas > Placa > Gerenciador de placas) e as bibliotecas DHT sensor library e Adafruit Unified Sensor, da Adafruit (Gerenciador de bibliotecas). Abra 10 - firmware/atv10/atv10.ino; o protocolo.h abre junto, numa aba. Escolha a placa ESP32 Dev Module e a porta do ESP32 que vai gravar. O modo de gravação é escolhido no topo do atv10.ino: deixe ativa só a linha do modo, por exemplo #define TRANSMISSOR_UART, com as outras três começando por //, e clique em Carregar. Para gravar o outro ESP32, troque a linha ativa, troque a porta e carregue de novo. O monitor serial fica em Ferramentas > Monitor serial, a 115200.

Gravar pelo PlatformIO. Abra a pasta 10 - firmware. Cada modo é um ambiente, e a linha do topo do atv10.ino não vale: pio run -e transmissor-uart -t upload --upload-port /dev/ttyUSB0 grava e pio device monitor -p /dev/ttyUSB0 abre o monitor serial.

Nos dois casos, "grave receptor-can" quer dizer gravar com o modo RECEPTOR_CAN, e o protocolo.h é um só para os dois ESP32: depois de mudar um valor nele, grave de novo cada ESP32 que o passo pede.

Na UART, o transmissor escreve a leitura como uma linha de texto e manda essa linha caractere por caractere por um fio, do pino TX2 de um ESP32 ao RX2 do outro. Cada caractere viaja como um byte, e o valor de cada byte vem da tabela ASCII: a letra A é o byte 41, o algarismo 0 é o byte 30, tudo em hexadecimal. A linha termina com um caractere de quebra de linha, e é por ele que o receptor sabe onde uma leitura acaba e a outra começa.

É uma ligação ponto a ponto: um fio de ida, um transmissor e um receptor. Não há endereço nem confirmação de recebimento.

A tabela ASCII abaixo traz os caracteres que podem aparecer nesta prática, cada um com o seu byte em hexadecimal.

Byte Caractere Byte Caractere Byte Caractere Byte Caractere
0A quebra de linha (\n) 34 4 44 D 4F O
20 espaço 35 5 45 E 50 P
25 % 36 6 46 F 51 Q
2C , 37 7 47 G 52 R
2D - 38 8 48 H 53 S
2E . 39 9 49 I 54 T
30 0 3A : 4A J 55 U
31 1 3B ; 4B K 56 V
32 2 3D = 4C L 57 W
33 3 41 A 4D M 58 X
. . 42 B 4E N 59 Y
. . 43 C . . 5A Z
Questão 1 de 20 Complete as lacunas

Resolvemos juntos. Um receptor de UART mostrou esta linha:

Recebido: 54 3D 31 39 3B 55 3D 36 35 0A

  • Texto da linha, sem a quebra de linha:
  • Temperatura (°C):
  • Umidade (%):
  • Bytes na linha, contando a quebra de linha:

Montagem por UART. À esquerda, o ESP32 transmissor; à direita, o ESP32 receptor. Os dois ESP32 ligados por USB a um PC, onde fica o monitor serial a 115200 bps. No transmissor, o DHT11 ligado ao 3V3 e ao GND do ESP32 e o pino de dados no GPIO 27. Entre os dois ESP32, um fio do GPIO 17 (TX2) do transmissor ao GPIO 16 (RX2) do receptor, com uma seta do transmissor para o receptor, e um fio de GND entre os dois.

  1. Monte a ligação da figura.
  2. Grave transmissor-uart no ESP32 do DHT11 e receptor-uart no outro.
  3. Abra o monitor serial do receptor. A cada 2 s chega uma linha de bytes. Anote três linhas e, com a tabela ASCII, descubra o texto, a temperatura e a umidade de cada uma.
Questão 2 de 20 Preencha a tabela

Três linhas no monitor serial do receptor.

Bytes que o receptor mostrou (hex)Quantidade de bytesTexto da linhaTemperatura (°C)Umidade (%)
Linha 1
Linha 2
Linha 3
  1. Desconecte o fio de dados do DHT11 e decodifique a linha que passa a chegar. Depois, reconecte o fio.
Questão 3 de 20 Preencha a tabela

Com o fio de dados do DHT11 desconectado.

Bytes que o receptor mostrou (hex)Quantidade de bytesTexto da linha
  1. Abra o monitor serial do transmissor. Ele mostra só Leitura enviada a cada envio. Tire o USB do receptor e veja o que muda no transmissor. Depois, religue o receptor.
Questão 4 de 20 Verdadeiro ou falso

Com o USB do receptor desligado, o transmissor da UART percebe que ninguém recebeu a linha.

Questão 5 de 20 Complete as lacunas

Agora é com você. Num dia frio, um receptor de UART mostrou:

Recebido: 54 3D 2D 34 3B 55 3D 39 0A

  • Temperatura (°C):
  • Umidade (%):
  • Bytes na linha, contando a quebra de linha: