ÍNDICE DE CONTEÚDO
- Franzininho WiFi: Display 7 Segmentos TM1637
- Franzininho WiFi: Primeiros passos na Arduino IDE
- Franzininho WiFi: Explorando as GPIOs com Arduino
- Franzininho WiFi: Leitura de entradas analógicas com Arduino
- Franzininho WiFi: PWM (Pulse Width Modulation) com Arduino
- Franzininho WiFi: Comunicação Serial (UART) com Arduino
- Franzininho WiFi: Servo Motor com Arduino
- Franzininho WiFi: Web Server
- Franzininho WiFi: Display OLED
- Franzininho WiFi: Sensor de temperatura e umidade DHT22
- Franzininho WiFi: Sensor de temperatura DS18B20
- Franzininho WiFi: Display LCD 16×2 com comunicação I2C
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.
Seminário Linux Embarcado 2024: Evento Presencial em São Paulo
Participe do Seminário Linux Embarcado 2024 em São Paulo. Conhecimento técnico, palestras, workshops e oportunidade de networking com profissionais experientes.
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 .
1 |
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.
1 2 3 |
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
1 |
int Serial.read(void) |
Retorna o primeiro byte da fila.
available()
Sinaliza a quantidade de bytes que estão disponíveis no canal serial.
1 |
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.
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
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 |
// 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.
1 2 3 4 5 |
// 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.
1 2 3 4 5 6 7 8 9 10 11 12 |
// 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.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
// 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!