Como enviar e receber dados com Serial Monitor
Podemos enviar informações do Arduino para o PC (ou outros dispositivos) usando o IDE (ou outro programa de terminal serial qualquer), de modo a verificarmos se nosso programa está operando da forma esperada, e assim podermos detectar e eliminar erros de programação, ou efetuarmos qualquer outro tipo de comunicação com a máquina.
E também podemos enviar dados e comandos do PC para o Arduino, de modo a poder controlar dispositivos eletrônicos a ele conectados.
As placas de Arduino possuem ao menos uma porta serial (UART / USART), chamada de Serial. Ela realiza comunicação por meio dos pinos digitais 0 (RX) e 1 (TX), assim como via USB com o PC. Veja um detalhe da placa de um Arduino UNO mostrando esses pinos e sua identificação:
Se usarmos esses pinos com a função de TX/RX, não poderemos utilizá-los para outras funções.
Podemos usar a ferramenta de Monitor Serial presente no IDE para comunicação com a placa. Para isso, basta clicar no botão Serial Monitor na barra de ferramentas, e selecionar a taxa de transferência desejada em bauds (a mesma que será inserida no código):
Vamos trabalhar em nosso projeto com o Arduino UNO, que possui as características descritas acima. Outras placas podem possuir características diferentes, como o Arduino Mega, que possui três portas seriais adicionais, e o Arduino Due, que possui três portas seriais TTL de 3.3V a mais. Nosso projeto funcionará em qualquer uma das placas.
Vamos ver alguns exemplos de comunicação serial com o Arduino, usando a classe Serial.
A classe Serial
A classe Serial possui diversas funções para comunicação, sendo algumas delas listadas na tabela a seguir:
Função | Significado |
available() | Obtém o número de bytes disponíveis para leitura na porta serial. |
begin() | Configura a taxa de dados em bauds para transmissão serial de dados |
end() | Desabilita a comunicação serial, permitindo que os pinos TX e RX (0 e 1) sejam usados para entrada e saída geral de sinais. |
print() | Imprime dados na porta serial em formato legível por humanos (texto ASCII) |
println() | Idem a print(), porém adicionando um caractere de retorno de carro (ASCII 13) e um de nova linha (ASCII 10) no final da string. |
read() | Lê dados a partir da porta serial. |
readBytes() | Lê caracteres a partir da porta serial em um buffer até que uma determinada quantidade de caracteres tenha sido lida. |
write() | Escreve dados binários na porta serial |
Vamos a um exemplo: exibir números sequenciais no monitor serial:
Exemplo 01: Exibir números sequenciais no Monitor Serial:
Conecte o Arduino na porta USB de seu PC, abra o IDE e digite o seguinte código em um novo projeto:
/* Testando a saída serial do Arduíno Vamos escrever números na porta serial*/ void setup(){ Serial.begin(9600); //Enviar e receber dados em 9600 baud Serial.println("Gerando valores sequenciais"); } int numero = 0; void loop() { Serial.print("Valor: "); Serial.println(numero); delay(500); numero++; } |
Após digitar o código no IDE, compile-o e envie-o para execução no Arduino. Então, abra o Serial Monitor para verificar os dados sendo transmitidos do Arduino para seu PC:
Exemplo 02: Exibindo valores da 1 a 255 em vários sistemas
Neste segundo exemplo, vamos exibir os números de 1 a 255 no monitor serial nos sistemas decimal, binário e hexadecimal.
Conecte seu Arduino à porta USB, abra o IDE no PC e digite o código a seguir:
/* Exibindo valores em diferentes sistemas de numeração */ int valor = 0; void setup() { Serial.begin(9600); Serial.println("Exibindo valores em sistemas diversos"); } void loop() { for (valor = 0; valor <= 255; valor++) { Serial.print("DEC: "); Serial.print(valor); Serial.print(" HEX: "); Serial.print(valor, HEX); Serial.print(" BIN: "); Serial.println(valor, BIN); /* Se o valor for 255, não repetir mais a geração de números. Entrar nesse loop para sempre: */ if(valor == 255) { while(true) { continue; } } } } |
Após digitar o código, compile-o e envie para execução no Arduino. Veja a saída esperada:
Enviando dados do PC para o Arduino via porta serial
Queremos agora efetuar o processo inverso: enviar caracteres do PC para o Arduino, o que pode ser muito útil para, por exemplo, controlar dispositivos a partir do computador conectado a um Arduino.
Vamos criar um projeto para demonstrar o uso da função Serial.read():
Ex. 03: Controlando um LED a partir do PC
Neste projeto vamos fazer um LED piscar em uma velocidade proporcional a um valor numérico enviado a partir do PC. Crie um novo projeto no IDE e digite o código abaixo:
/* Enviando dados do PC para o Arduíno.
Vamos piscar um LED de forma proporcional ao valor recebido a partir do PC */
const int ledPin = 13; // Pino ao qual o LED será conectado
int piscando = 0; // variável para armazenar taxa de “piscagem”
void setup() {
Serial.begin(9600);
pinMode(ledPin, OUTPUT); // Pino 13 será de saída de sinais
}
void loop()
{
if (Serial.available()) { // Verificar se há caracteres disponíveis
char caractere = Serial.read(); // Armazena caractere lido
if ( isDigit(caractere) ) { // Verificar se o caractere ASCII é um dígito entre 0 e 9
piscando = (caractere – ‘0’); // Convertendo ASCII em valor numérico (0 = 48)
piscando = piscando * 100; // Escalando taxa de tempo multiplicando por 100ms
}
}
pisca(); // Chamando a função blink(), que será declarada abaixo.
}
/* Declarando a função pisca() que fará o LED piscar na taxa determinada pelo valor armazenado na variável piscando
*/
void pisca() { digitalWrite(ledPin, HIGH); delay(piscando); digitalWrite(ledPin, LOW); delay(piscando); } |
Conecte um LED ao Arduino usando uma protoboard e um resistor de aproximadamente 470 ohms conforme a ilustração abaixo mostra:
Compile e envie o código digitado ao Arduino. Logo após, abra o Serial Monitor, digite um número entre 0 e 9 e clique no botão Send para enviar o valor ao Arduino:
Observe que o LED piscará numa velocidade diferente para cada número enviado a partir do IDE. Desta forma, atingimos nosso objetivo de enviar dados a partir do PC para a placa do Arduino, controlando um dispositivo eletrônico conectado a ele.
Usando outro programa para comunicação serial com o Arduino
Podemos também acessar a porta serial usando outro programa, como o PuTTY. Para isso, abra o PuTTY (que pode ser baixado gratuitamente em http://www.putty.org/) e faça os ajustes conforme as figuras a seguir:
Em Session, clique em Serial no tipo da conexão, digite o nome da porta serial na caixa Serial line (a minha é COM 3), e a velocidade em bauds em Speed (9600 no meu caso):
Em Terminal, clique em Force On nas seções Local echo e Local line editing:
Clique no botão Open para abrir a conexão e observe as mensagens sendo enviadas do Arduino para o PuTTY ao enviarmos o programa do exemplo 02:
Há muitos outros softwares para comunicação serial disponíveis para uso com o Arduino, como o GNU Screen (http://www.gnu.org/software/screen), RealTerm (http://realterm.sourceforge.net/) e CoolTerm (http://freeware.the-meiers.org/), entre outros.
No próximo artigo vamos começar a explorar o Arduino criando um projeto bem interessante com LEDs.