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 >>

NEWSLETTER

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

Obrigado! Sua inscrição foi um sucesso.

Ops, algo deu errado. Por favor tente novamente.

Fábio Souza
Engenheiro com experiência no desenvolvimento de projetos eletrônicos embarcados. Hoje é diretor de operações do portal Embarcados, onde trabalha para levar conteúdos de eletrônica, sistemas embarcados e IoT para o Brasil. Também atua no ensino eletrônica e programação pelo Brasil. É entusiastas do movimento maker, da cultura DIY e do compartilhamento de conhecimento, publica diversos artigos sobre eletrônica e projetos open hardware, como o projeto Franzininho Participou da residência hacker 2018 no Redbull Basement. Quando não está ministrando palestras, cursos ou workshops, dedica seu tempo “escovando bits” ou projetando placas eletrônicas.

100
Deixe um comentário

avatar
 
50 Comment threads
50 Thread replies
6 Followers
 
Most reacted comment
Hottest comment thread
40 Comment authors
HUMBERTOElvisDaniloFábio SouzaRafael Gustavo Da Cruz Recent comment authors
  Notificações  
recentes antigos mais votados
Notificar
Danilo
Visitante
Danilo

Pelo que eu entendi, a Comunicação Serial do Arduíno, no IDE, permite escolher a quantidade de dados a serem enviados em função do tempo ao microcontrolador. Quanto mais rápido, melhor, certo? Porque eu escolheria uma taxa de envio mais lenta?

Elvis
Visitante
Elvis

Os dois lados da comunicação serial precisam trabalhar na mesma velocidade para se entenderem, alguns CI's não operam nas velocidades mais altas. Por isso a possibilidade de você escolher velocidades menores.

Rafael Gustavo Da Cruz
Membro
Rafael Gustavo Da Cruz

Olá, estou tentando usar o exemplo do "Dimmer" para variar a rotação de um motor usando PWM. Meu problema é que quando eu digito o valor (de 0 a 255) 210 por exemplo e aperto "enter" ou "enviar" no monitor serial ele envia 4 sequências de bytes (1 para cada digito separadamente - 50-49-48-10 ) o ultimo sempre é 10 (que eu creio que seja o "/n" do enter da tabela ASCII). Com isso, não importa o valor que eu digite no PC o valor enviado para a variável (brightness = Serial.read(); [do exemplo]) fica sempre 10. Gostaria de poder… Leia mais »

Iago
Visitante
Iago

Fábio,

Me perdoe se eu estiver errado, mas acho que você escreveu errado aqui:

Serial.println(1.23456, 4) envia "1.234->6<-", ou seja, 4 casas decimais

clay
Visitante
clay

estou utilizando o arduino para fazer a leitura do sensor dht11. quando conecto a porta usb do arduino no notbbok para ler a resposta do sensor via IHM do arduino obtenho uma resposta bem estável exemplo 31, 31, 31, 31, 31, 31, 31, 31, 31 .... mas quando uso a HIM do arduino para verificar sua resposta no raspberry Pi está varia de forma não controlada. exemplo : temperatura 31, 31,31, 35, 29, 30, 31, 32, 31, 31, 31, 31, 28 .... qual pode ser o motivo dessa variaçao ?

Felipe Gomes de Souza Araújo
Visitante
Felipe Gomes de Souza Araújo

Olá! Com o arduino eu conseguiria acionar um botão (parecido com liga/desliga) em um software no computador ou aplicativo do Android? Pensei dessa forma: um botão físico liga/delisga conectado ao arduino, aciona o botão liga/delisga no software ou aplicativo. Obrigado.

Michel Rodini
Visitante
Michel Rodini

Oi Fábio, gostaria da sua ajuda em uma questão...

Estou usando um arduino uno para conectar um Bluetooch HC 05. Estou utilizando Tx0 e Rx0 para simplificar a configuração. No monitor serial ele responde corretamente , o problema é quando eu gravo o arduino com o programa abaixo. O bluetooch não responde. Eu esperava receber um "ok" como ocorre quando utilizo o monitor serial.

Onde estou errando ?

Obrigado

void setup(){ Serial.begin(38400); }

void loop() {

while(1)
{ Serial.println("ATrn"); delay(500);} }

Fabio_Souza_Embarcados
Visitante
Fabio_Souza_Embarcados

Como você está recebendo a informação do BT? Veja se esse exemplo te ajuda: http://www.instructables.com/id/Remotely-Control-LED-using-HC-05-Bluetooth-Arduino/

João Miranda
Visitante
João Miranda

Olá,

Agradeço qq ajuda...

Estou usando um par de RF 433 MHz pra comunicar 2 Arduinos (ProMini - Tx e R3 - Rx).

Estou usando a biblioteca VirtualWire.

O estranho é que na recepção dos dados, quando leio o buffer (Serial.print(buf[i], HEX); estou obtendo sempre números "3" intercalados com os dígitos transmitidos...

Tx; Rx
314; 333134
1020; 31303230

Alguma luz?

Fabio_Souza_Embarcados
Visitante
Fabio_Souza_Embarcados

Olá João, é possível compartilhar o código dos dois lados da comunicação?

João Miranda
Visitante
João Miranda

Essa já resolvi depois de pesquisar bastante. Tem outra: incompatibilidade de duas bibliotecas: VirtualWire.h e Servo.h (já tentei com a ServoTimer2.h e também está dando erro na compilação...) Do problema anterior, caso seja interessante deixar o histórico nesta discussão sobre comunicação serial: Transmiter: #include void setup() { Serial.begin(9600); // Setup Transmitter on pin 2: vw_set_ptt_inverted(true); vw_set_tx_pin(2);//Set Transmitter pin vw_setup(4000);//Speed of data transfer kbps } void loop() { int Raw = analogRead(A0); char msg[4]; sprintf(msg, "%i", Raw); Serial.println(msg); vw_send((uint8_t *)msg, strlen(msg));//Send the message vw_wait_tx();//Wait until hole massege is gone delay(1000); } Receiver: #include void setup() { delay(1000); Serial.begin(9600); // Setup Transmitter… Leia mais »

Tainan Reichert
Visitante
Tainan Reichert

Olá, Preciso de uma ajuda. Eu comprei uma cnc e cm ela veio o arduino montado ja com os driver para os motores de passo, e a empresa da qual eu comprei a cnc mandava apenas usar o programa ARDUINO mas nao me deu nem um passo a passo de como fazer a programação ou qual (SERIAL) USAR.

Fabio_Souza_Embarcados
Visitante
Fabio_Souza_Embarcados

Olá, passa os detalhes do produto.

Octavio Tosta
Visitante
Octavio Tosta

Onde vc comprou?? Estou procurando uma cnc com Arduíno para comprar.

Anderson Martins
Visitante
Anderson Martins

Bom dia, preciso de uma ajuda, estou fazendo um projeto com arduino, eu entendi o exemplo do LED, eu poderia fazer ao contrario? em vez de receber esse caracter 'A', eu mandar esse caracter para outro arduino acionar um led por exemplo?

Fabio_Souza_Embarcados
Visitante
Fabio_Souza_Embarcados

Olá Anderson, sim, você pode usar a função Serial.write('A'); para escrita na serial. Do outro lado você pode usar a mesma rotina de leitura.

Anderson Martins
Visitante
Anderson Martins

Obrigado por responder, saberia me dizer se é possível um PIC receber esse caracter?

Fabio_Souza_Embarcados
Visitante
Fabio_Souza_Embarcados

Sim, só garantir que a configuração da UART seja a mesma de ambos os lados. Você poderá enviar para o PIC, assim como receber informações.

Depois conte o resultado do seu projeto para nós.

Abraços

Brenda Caroline
Visitante
Brenda Caroline

Bom dia. Estou com uma dúvida para fazer um código no arduino e preciso de ajuda. Meu projeto é um guindaste que eleva um pequeno material (posicionei um sensor ultrassônico logo abaixo do mesmo) através de um motor DC. Eu gostaria, durante a execução do código, informar uma altura que seria comparada a medida do sensor. Caso não fosse a mesma, o motor seria acionado até atingir o valor esperado. Existe alguma função no arduino que recebe a informação do usuário? E eu consigo fazer isso mais de uma vez? Desde já, agradeço.

Fabio_Souza_Embarcados
Visitante
Fabio_Souza_Embarcados
HUMBERTO
Visitante
HUMBERTO

AMIGOS EU TENO UM SOFWARE QUE DESAROLHE EM VISUAL BASIC PARA CNC BASICO COM ARDUINO 1 SIM TE INTERESA EU TE ENVIO