Franzininho WiFi: Comunicação Serial (UART) com Arduino

Este post faz parte da série Franzininho WiFI - Arduino

Introdução

 A comunicação serial é um processo de serializar os dados bit a bit ao longo do tempo por um canal seguro, o qual pode realizar a verificação de erros adicionando uma camada de protocolo (regras). Dentre os protocolos seriais temos : UART, SPI, OneWire e I2C há também outras categorias de protocolos seriais especiais (CAN, LIN, FlexRay) utilizados em aplicações que envolvem níveis de complexidade maior.  Nesse tipo de comunicação tem duas categorias: Síncrona e Assíncrona. 

A comunicação Síncrona emparelha sua(s) linha(s) de dados com um sinal de clock, ou seja, todos os dispositivos com essa interface serial compartilha necessariamente um clock. Com isso torna a comunicação mais rápida, em contrapartida, adiciona mais um fio ao enlace. A comunicação Assíncrona ocorre com transferência de dados sem o auxílio de um clock, contudo é necessário que o canal de comunicação esteja sempre disponível para ouvir a chegada dos bits.

Neste artigo vamos tratar sobre a Universal Asynchronous Receiver-Transmitter ou simplesmente UART, um periférico fortemente utilizado para troca de informações entre dispositivos e é uma comunicação assíncrona dada por meio de dois fios, sendo um para recepção (RX) e outro para transmissão (TX). A Franzininho WiFi possui dois controladores para a  UART configurados separadamente e com suporte a diferentes velocidades (Baud Rate), o qual é mensurado por bits por segundo (bps). 

API Serial do Arduino

Nesta sessão apresentaremos as funções usadas para configura e usar a comunicação Serial do Arduino.

begin()

Inicializa a UART e configura o Baud Rate. Caso não seja feita a chamada do método begin, o canal de comunicação não receberá e nem enviará os dados .

void begin(uint16_t baud_rate);
  • baud_rate :  velocidade da comunicação serial

print()

Imprime os dados como texto no formato ASCII. Devido a sobrecarga de métodos há outras formas de utilizar o printf, configura mais na documentação do Arduino.

size_t Serial.print(long long n, int base)
size_t Serial.print print(char c)
size_t Serial.print(const String &s)
  • n : valor númerico 
  • base: base numérica (decimal, octal, hexadecimal)
  • c : inserir caractere único
  • s: inserir um string para imprimir

Retorna a quantidade de bytes escritos.

println()

Imprime os dados como texto no formato ASCII com uma quebra de linha ‘\n’ no final do dado. Os mesmo métodos utilizados pelo print, são válidas para este método.

read()

Ler o primeiro o dado que chegou no canal serial

int Serial.read(void)

Retorna o primeiro byte da fila.

available()

Sinaliza  a quantidade de bytes que estão disponíveis no canal serial.

size_t Serial.available(void)

Retorna a quantidade de bytes armazenados no buffer. 

Materiais necessários

Os materiais utilizados nesse artigo foram:

  • Placa Franzininho WiFi
  • LED 
  • Resistor de 150 ohms 
  • Jumpers 
  • Arduino IDE 

Circuito para teste da comunicação serial com a Franzininho WiFi

No circuito proposto utilizamos os comandos para comandar um LED (GPIO 2) ligado a Franzininho WiFi, como apresentado na imagem abaixo.

Comunicação Serial com Franzininho WiFi no Arduino
Circuito para teste da Comunicação Serial com Franzininho WiFi no Arduino

Código

O projeto proposto utiliza o canal de comunicação serial para receber alguns comandos e interpretá-los, dentre os comandos e executar alguma ação com o LED ou apenas mostrar informações para o usuário. Foram utilizados três comandos, sendo:  

  • 1 – Liga o LED
  • 0 – Desliga o LED
  • H  – Mostra a lista de comandos disponíveis, funciona como um comando “help” no terminais
// Define o pino que será usado para o LED como uma constante do tipo byte.
const byte led = 2;

// Define uma variável que armazenará os dados recebidos pela porta serial.
int data_serial;

// Configuração inicial do programa.
void setup()
{
  // Inicia a comunicação serial com a velocidade de 115200 bits por segundo.
  Serial.begin(115200);

  // Imprime uma mensagem na porta serial para indicar que o programa está iniciando.
  Serial.println("Iniciando Franzininho WiFi ...");

  // Define o pino do LED como saída.
  pinMode(led, OUTPUT);
}

// Loop principal do programa.
void loop()
{
  // Verifica se há dados disponíveis na porta serial.
  if (Serial.available() > 0)
  {
	// Lê um byte da porta serial e armazena na variável data_serial.
	data_serial = Serial.read();

	// Se o byte lido for 'H', imprime uma mensagem de ajuda na porta serial.
	if (data_serial == 'H')
	{
  	Serial.println("Comando Help :");
  	Serial.println("  1 - Liga o LED");
  	Serial.println("  0 - Desliga o LED");
	}
	// Se o byte lido for '1', acende o LED.
	else if (data_serial == '1')
	{
  	digitalWrite(led, HIGH);
	}
	// Se o byte lido for '0', apaga o LED.
	else if (data_serial == '0')
	{
  	digitalWrite(led, LOW);
	}
  }
}

Simule esse exemplo no Wokwi: https://wokwi.com/projects/363108933115615233

 Explicação do Código

Nesta seção apresentaremos  cada trecho do código a fim de esclarecer o uso das funções Serial.  

Declara as variáveis, uma para selecionar o pino do LED e a outra variável para guardar os dados seriais.  

// Define o pino que será usado para o LED como uma constante do tipo byte.
const byte led = 2;

// Define uma variável que armazenará os dados recebidos pela porta serial.
int data_serial;

No void setup(), inicializamos o canal serial e configuramos para um Baud Rate de 115200, lembrando que para outras velocidades precisa ajustar o monitor serial de acordo com a velocidade selecionada. Também configuramos o LED como saída digital, como já vimos nos artigos anteriores.

// Configuração inicial do programa.
void setup()
{
  // Inicia a comunicação serial com a velocidade de 115200 bits por segundo.
  Serial.begin(115200);

  // Imprime uma mensagem na porta serial para indicar que o programa está iniciando.
  Serial.println("Iniciando Franzininho WiFi ...");

  // Define o pino do LED como saída.
  pinMode(led, OUTPUT);
}

No void loop(), se chegou algum dado no canal serial, faz a leitura no buffer do canal serial. Em seguida, verifica se o primeiro byte é um caractere ‘H’, caso seja mostra na tela as informações de comandos válidos. Caso seja o comando acionar o LED, coloca a GPIO em nível lógico alto, se caso seja o comando de desligar o LED, ou coloca a GPIO em nível lógico baixo.

// Loop principal do programa.
void loop()
{
  // Verifica se há dados disponíveis na porta serial.
  if (Serial.available() > 0)
  {
	// Lê um byte da porta serial e armazena na variável data_serial.
	data_serial = Serial.read();

	// Se o byte lido for 'H', imprime uma mensagem de ajuda na porta serial.
	if (data_serial == 'H')
	{
  	Serial.println("Comando Help :");
  	Serial.println("  1 - Liga o LED");
  	Serial.println("  0 - Desliga o LED");
	}
	// Se o byte lido for '1', acende o LED.
	else if (data_serial == '1')
	{
  	digitalWrite(led, HIGH);
	}
	// Se o byte lido for '0', apaga o LED.
	else if (data_serial == '0')
	{
  	digitalWrite(led, LOW);
	}
  }
}

Conclusão

Neste artigo, discutimos sobre a UART, um periférico versátil integrado em várias arquiteturas de microcontroladores. Ele utiliza comunicação assíncrona por um par de fios (RX e TX) e pode ser integrado para comunicação ponto a ponto ou em rede. Apesar de um protocolo simples, é amplamente utilizado em projetos de sistemas embarcados para integrar interfaces de comunicação que exigem uma camada de abstração maior.

Saiba mais

Franzininho WiFi: A placa versátil para iniciantes e desenvolvedores experientes

Como programar a Franzininho WiFi: 6 opções para você escolher!

Franzininho WiFi: Primeiros passos na Arduino IDE

Franzininho WiFI - Arduino

Franzininho WiFi: PWM (Pulse Width Modulation) com Arduino Franzininho WiFi: Servo Motor com Arduino
Licença Creative Commons Esta obra está licenciada com uma Licença Creative Commons Atribuição-CompartilhaIgual 4.0 Internacional.
Comentários:
Notificações
Notificar
0 Comentários
recentes
antigos mais votados
Inline Feedbacks
View all comments
Home » Comunicação » Franzininho WiFi: Comunicação Serial (UART) com Arduino

EM DESTAQUE

WEBINARS

VEJA TAMBÉM

JUNTE-SE HOJE À COMUNIDADE EMBARCADOS

Talvez você goste: