114 Comentários

Arduino – Comunicação Serial

Comunicação Serial

Continuando a serie de artigos introdutórios sobre a plataforma Arduino, neste vamos abordar a comunicação serial. Serão apresentadas as principais funções e alguns exemplos básicos que serão usados como base em nossos projetos.

Arduino Comunicação Serial

A comunicação serial (UART) na plataforma Arduino é, sem duvida, um poderoso recurso que possibilita a comunicação entre a placa e um computador ou entre a placa e outro dispositivo, como por exemplo um módulo GPS ou um módulo GSM. É através desse canal  que é realizado o upload do código para a placa.

A placa Arduino UNO possui um canal de comunicação por hardware, conforme foi exibido no artigo publicado sobre Arduino UNO. Esse canal está ligado aos pinos digitais 0 (RX) e 1 (TX). Esses mesmos pinos estão ligados ao microcontrolador ATMEGA16U2, responsável pela tradução do sinal para comunicação USB com o computador.

A figura a seguir exibe os pinos de comunicação serial na placa Arduino UNO:

Arduino - Comunicação Serial pinos
Figura 1 – Pinos para comunicação serial

Deve-se ficar atento a dispositivos conectados a esses pinos pois podem interferir no upload do seu programa. Em alguns caso é recomendável desconectar os dispositivos ou shields ligados a esses pinos antes de fazer o upload.

O sinal de comunicação na placa Arduino UNO, é um sinal TTL de 5V. Para comunicação com um computador ou outro dispositivo que não tenha o mesmo nível de tensão é necessário um conversor de nível. Existem várias opções de conversores, como por exemplo TTL/ RS232, TTL/RS485, TTL/USB, entre outros. A seguir são exibidos alguns modelos de conversores:

Arduino - Comunicação Serial shields
Figura 2 – Shields e módulos para comunicação serial

Terminal Serial

Além do recurso de upload através da comunicações serial, a IDE trás um terminal serial que auxilia no recebimento e envio de dados para a placa sem a necessidade de recorrer a uma ferramenta externa. Para acessar essa ferramenta basta clicar no ícone Serial Monitor ou acessar o menu Tools> Serial Monitor. É aberta a janela a seguir:

Arduino - Comunicação Serial Serial Monitor
Figura 3 – Terminal para comunicação serial do Arduino

A ferramenta é bem simples, contendo apenas alguns parâmetros de configuração, onde se pode definir a taxa de envio (baud rate). Possui dois campos, um onde pode ser inserido a mensagem a ser enviada e outro maior onde é exibido os caracteres enviados pela placa para o computador.

Funções da plataforma Arduino

A plataforma Arduino possui em sua biblioteca uma variedade de funções para manipulação de dados através de comunicação serial. Essas funções auxiliam o desenvolvedor em tarefas mais complexas de envio e recebimento de dados. 

Funções mais usadas com a placa Arduino UNO

Serial.begin()

É a primeira função a ser utilizada quando vai trabalhar com a comunicação serial. Ela configura a taxa de comunicação em bits por segundo (baud rate). Possui um segundo parâmetro opcional para a definição da quantidade de bits, paridade e stop bits. Se for omitido esse parâmetro o padrão será 8 bits, sem paridade e 1 stop bit.

Sintaxe:

Serial.begin(speed)

Serial.begin(speed, config)

Parâmetros:

speed: velocidade em bit por segundo (baud rate) – long

config: configura a quantidade de bits, paridade e stop bits. Os valores válidos são :

  • SERIAL_5N1

  • SERIAL_6N1

  • SERIAL_7N1

  • SERIAL_8N1 (padrão)

  • SERIAL_5N2

  • SERIAL_6N2

  • SERIAL_7N2

  • SERIAL_8N2

  • SERIAL_5E1

  • SERIAL_6E1

  • SERIAL_7E1

  • SERIAL_8E1

  • SERIAL_5E2

  • SERIAL_6E2

  • SERIAL_7E2

  • SERIAL_8E2

  • SERIAL_5O1

  • SERIAL_6O1

  • SERIAL_7O1

  • SERIAL_8O1

  • SERIAL_5O2

  • SERIAL_6O2

  • SERIAL_7O2

  • SERIAL_8O2

 Retorno

Essa função não retorna nada.

Serial.available()

Retorna a quantidades de bytes disponíveis para leitura no buffer de leitura. Essa função auxilia em loops onde a leitura dos dados só e realizada quando há dados disponível. A quantidade máxima de bytes no buffer é 64.

Sintaxe:

Serial.available();

Parâmetros:

Não passa nenhum parâmetro.

Retorno:

(int) – quantidade de bytes disponíveis para leitura

Serial.read()

Lê o byte mais recente apontado no buffer de entrada da serial.

Sintaxe:

Serial.read();

Parâmetros:

Não passa nenhum parâmetro.

Retorno:

(int) – O primeiro byte disponível no buffer da serial. Retorna -1 caso n tenha dado disponível.

Serial.print()

Escreve na serial texto em formato  ASCII. Essa função tem muitas possibilidades. Números inteiros são escritos usando um caractere ASCII para cada dígito. O mesmo ocorre para números flutuante e, por padrão, são escrito duas casas decimais. Bytes são enviados como caracteres únicos e strings e caracteres são enviados como escritos.

Vejamos alguns exemplos:

Serial.print ( 123 ); // Envia “123”

Serial.print ( 1.234567 ); // Envia “1.23”

Serial.print ( ‘N’ ); // Envia “N”.

Serial.print ( “Hello world” ); // Envia “Hello world”.

Obs.: caracteres são enviados com aspas simples e strings com aspas duplas.

Um segundo parâmetro opcional define a base numérica para formatar o valor enviado. São aceitos os seguintes parâmetros:

  • BIN – binário, base 2

  • OCT – octal, base 8

  • HEX – hexadecimal, base 16

  • DEC – decimal, base 10

Para números em ponto flutuante esse parâmetro define a quantidade de casas decimais a serem enviadas após o ponto. Exemplos:

  • Serial.print(78, BIN) envia em binário “1001110”

  • Serial.print(78, OCT) envia emr octal “116”

  • Serial.print(78, DEC) envia em  decimal “78”

  • Serial.print(78, HEX) envia em hexadecimal  “4E”

  • Serial.println(1.23456, 0) envia apenas “1”, sem casas decimais

  • Serial.println(1.23456, 2)envia “1.23”, ou seja, duas casas decimais

  • Serial.println(1.23456, 4) envia  “1.2346”, ou seja, 4 casas decimais

Sintaxe:

Serial.print(val)

Serial.print(val, format)

Parâmetros:

val:valor para ser escrito na serial – qualquer tipo de dado.

format: base numérica para tipos inteiros ou a quantidade de casas decimais para números flutuantes.

Retorno:

size_t (long): retorna a quantidade de bytes escritos

Serial.println()

Funciona praticamente igual a função Serial.print(), a única diferença é que esta função acrescenta ao fim da mensagem o caractere de retorno de carro (ASCII 13 ou ‘\r’) e o caractere de nova linha(ASCII 10 ou ‘\n’). A sintaxe, os parâmetros e o retorno são os mesmos da função Serial.print().

Serial.write()

Escreve um byte na porta serial.

Sintaxe:

 Serial.write(val)

Serial.write(str)

Serial.write(buf, len)

Parâmetros:

val: um valor para ser enviado como um único byte.

str: uma string para ser enviada como uma sequência de bytes.

buf: um array para ser enviado como uma serie de bytes.

len: o tamanho do buffer a ser enviado.

Retorno:

(byte) – Retorna a quantidade de bytes escritos na serial. A leitura desse numero é opcional.

Manipulação de dados através da comunicação serial

Exemplos:

Echo

No Sketch a seguir é exibido como receber um caractere do computador e enviar este mesmo caractere para o computador, onde será exibido o que é digitado na terminal serial.

Neste exemplo foi utilizada a função Serial.available() para verificar se há dado disponível no buffer da serial. Quando há um byte para leitura, o mesmo é lido pela função Serial.read() e armazenado na variavel byteRead. A próxima função, Serial.write(), imprime de volta o dado recebido para o computador.

Dimmer

Este exemplo demonstra como enviar dados do computador para controlar o brilho de um LED conectado a uma saída PWM. Este exemplo já vem com a plataforma e pode ser acessado em: File -> Examples -> 04.Communication -> Dimmer.

Com este exemplo pode -se  varia o brilho do LED conectado à saída PWM através de comandos enviados pelo PC. O byte recebido pela serial é atribuído a variável brightness, que na instrução a seguir é passado como parâmetro na função analogWrite(), definindo o brilho do LED. Junto com este exemplo é exibido um código em processing para variação do brilho através do clique do mouse no PC.

Liga/Desliga LED 

Este exemplo exibe como ligar e desligar um LED conectado as saída digital da Arduino UNO através de comando enviados pelo computador.

Neste exemplo o estado do LED ligado ao pino 13 é invertido sempre que o Arduino recebe o caractere ‘A’. A estrutura desse sketch permite adicionar mais saídas para serem acionadas. Este exemplo pode ser aproveitado para uma aplicação gráfica no PC para controlar cargas automação residencial, por exemplo.

Conclusão sobre comunicação serial na plataforma Arduino

Dominar a comunicação serial na plataforma Arduino é essencial para o desenvolvedor de projetos. Muitos dispositivos e módulos possuem uma interface de comunicação, seja para configuração ou para comandos. 

O uso de uma comunicação serial permite também o controle ou monitoramento de sistemas utilizando o computador ou mesmo outra placa eletrônica. É uma interface tradicional e bem conhecida e permite que ligue, de forma simples diferentes dispositivos.

A comunicação serial na plataforma Arduino aliada ao terminal da IDE, se torna uma ótima ferramenta para visualização de dados e Debug durante o processo de desenvolvimento, já que a plataforma não possui tais ferramentas de depuração.

Para aprender mais

Arduino – O documentário

Placas Arduino – trajetória até o UNO

Arduino UNO

Outros artigos da série

<< Usando as saídas PWM do ArduinoCriando suas próprias bibliotecas para Arduino >>
Licença Creative Commons Esta obra está licenciada com uma Licença Creative Commons Atribuição-CompartilhaIgual 4.0 Internacional.

Receba os melhores conteúdos sobre sistemas eletrônicos embarcados, dicas, tutoriais e promoções.

Arduino » Arduino - Comunicação Serial
Comentários:
Notificações
Notificar
guest
114 Comentários
recentes
antigos mais votados
Inline Feedbacks
View all comments
Renato
Renato
24/03/2020 19:25

Teve um programa que eu estava rodando que eu usava um float no serial.print com 4 casas decimais (n, 4), dentro de um loop onde o n aumentava linearmente. Mudei a programação para imprimir um inteiro e esqueci o formato de 4 casas lá. Os valores saltavam a cada 4. Demorei bastante pra descobrir esse lance do formato…

Rui
Rui
21/03/2020 13:09

Meu Arduino Uno ficou com LEDs TX e RX ligados (azuis).
USB deixou de comunicar.
Que posso fazer?
Obrigado

benedito garcia flores jr
benedito garcia flores jr
22/11/2019 17:33

Como instalar o “SofwareSerial” no arduino, não encontro essa informação, toda vez que um programa pede esse software, ele diz que não encontra o “arquivo SoftwareSerial.h”

benedito garcia flores jr
benedito garcia flores jr
22/11/2019 09:29

Bom dia Fabio, estou usando uma placa smt32f103c8t6 como stm32arduino, minha duvida como faço pra acessar as outras portas seriais, já no stm tenho 3 portas seriais, como estou usando a porta 1 para carregar o programa, queria usar outra para acessar outras coisas, tem como saber isso, tem alguma diga, algum artigo que possa me ajudar?

benedito garcia flores jr
benedito garcia flores jr
Reply to  Fábio Souza
22/11/2019 17:35

Obrigado
abraços

Celio
Celio
18/09/2019 22:03

Ola Tudo bem? Neste seu exemplo , como eu faria pra controlar dois leds pela serial, como identifica-los? /* echo reenvia para o computador o dado recebido pela serial */ byte byteRead; void setup() { //configura a comunicação seria com baud rate de 9600 Serial.begin(9600); } void loop() { if (Serial.available()) //verifica se tem dados diponível para leitura { byteRead = Serial.read(); //le bytwe mais recente no buffer da serial Serial.write(byteRead); //reenvia para o computador o dado recebido } } Neste exemplo foi utilizada a função Serial.available() para verificar se há dado disponível no buffer da serial. Quando há um… Leia mais »

Armaky
Armaky
20/07/2019 17:39

Show de Bola , estou fazendo um Mixe de Delphi Android * arduino para controle remoto via internet e esta matéria me foi muito útil !

RICARDO ALVES MARTINS ALVES
RICARDO ALVES MARTINS ALVES
16/07/2019 15:16

Alguém sabe dizer se existe a possibilidade de inserir as credenciais de rede (ssid, senha) via serial monitor do ESP8266? Inicio o ESP e ele fica aguardando estes dados para seguir com a conexão.

johnatan
johnatan
30/06/2019 21:28

qual o tamanho maximo do cabo usb usado nessa comunicação serial? poderia usar aqueles de 10m de impressora?

Jadder
Jadder
23/02/2019 08:32

Gente. Arduino perde feio para ESP32

Talvez você goste:

Séries



Outros da Série

Menu

WEBINAR
 
Porque o RTOS não faz o que eu quero?

Data: 28/10 às 19:30h - Apoio: Mouser Electronics
 
INSCREVA-SE AGORA »



 
close-link