Magos do Arduino

Comunicação serial com o Arduino

Aprenda como utilizar comunicação serial UART com o Arduino

Magos do Arduino

O que é conexão/protocolo serial

Toda placa Arduino possui ao menos uma porta serial.

Esta conexão permite a comunicação do Arduino com um computador ou outro dispositivo utilizando o padrão UART.

UART

No Arduino Uno os pinos utilizados para comunicação serial são o 0 (RX) e 1 (TX).

A comunicação serial UART consiste em enviar dados sequenciais e em uma frequência correta.

Sempre devemos iniciar o envio de dados utilizando um bit de início e um outro bit de fim.

O Monitor Serial

O Monitor Serial é uma ferramenta essencial ao criar projetos com Arduino.

Ele pode ser usado como uma ferramenta de debug, testando conceitos ou para se comunicar diretamente com a placa Arduino.

O Arduino IDE tem a ferramenta de Monitor Serial integrada ao editor.

Arduino IDE Monitor Serial

Enviando dados através de conexões seriais

Quando queremos usar o serial para debug ou exibir informações, podemos usar o Serial.print() ou Serial.println(), sendo que o segundo inclui quebra de linha.

Podemos usar o Serial.write() para enviar dados em formato binário

Para maiores detalhes consulte:

https://docs.arduino.cc/language-reference/en/functions/communication/serial

Formatando dados com o sprintf

Simplifica como exibimos dados dinâmicos em uma String.

Para exibir valores inteiros usamos %d.

Para exibir valores float usamos o %f, ou %.4f para especificar as casas decimais.

Para exibir Strings/Textos usamos o %s.

A seguir é demonstrado como utilizar o sprintf para simplificar o código.

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

int contador = 1;
float pi = 3.1415;
char placa[] = "Arduino";

void loop() {
  // usando o print serial sem o sprintf
  Serial.print("Contador: ");
  Serial.print(contador);
  Serial.print(", texto: ");
  Serial.print(placa);
  Serial.print(", PI: ");
  Serial.println(pi);

  // usando o print serial com o sprintf
  char buffer[40];
  sprintf(buffer, "Contador: %d, texto: %s, PI: %.4f", contador, placa, pi);
  Serial.println(buffer);

  contador++;
  delay(1000);
}

Lendo dados através de conexões seriais

Existem diferentes funções para ler dados via porta serial, que varia de acordo com o tipo de dado esperado, vamos ver algumas delas:

  • read() obtém o valor sem conversão
  • parseInt() obtém o valor e o converte para int (inteiro)
  • parseFloat() obtém o valor e o converte para float
  • readString() obtém o valor como String

*Caso o valor não possa ser convertido 0 (zero) será retornado

A seguir é demonstrado como obter dados seriais de múltiplos modos.

void setup() {
  // inicia a conexão serial
  Serial.begin(9600);
}

void loop() {
  // verifica se existe dados a serem lidos na porta serial
  if (Serial.available() > 0) {
    int valor = Serial.read();
    
    //int valor = Serial.parseInt();
    
    //float valor = Serial.parseFloat();
    
    //String valor = Serial.readString();

    // imprime o valor recebido
    Serial.print("Valor recebido: ");
    Serial.println(valor);
  }
}

Conectando dois Arduinos via porta serial

Placas Arduinos possuem os pinos TX e RX para conexão serial.

No Arduino UNO, estes pinos são os pinos 0 (RX) e 1 (TX).

RX significa receptor enquanto que TX significa transmissor.

A conexão deve ser cruzada, conectando RX com TX e TX com RX.

Neste projeto comunicaremos dois Arduinos usando conexão serial (UART).

O Arduino com o papel de transmissor terá um push button conectado a ele, e quando pressionado ele enviará um comando para o Arduino receptor que mudará o status do LED contido na placa.

Para este projeto, faça o upload dos códigos contidos nos diretórios receptor e transmissior um em cada placa Arduino, sendo o transmissor o que contém o push button conectado a ele, conforme circuito abaixo.

Para a criação deste circuito serão necessários os seguintes componentes:

  • 1x Breadboard
  • 2x Placas Arduino UNO
  • 1x Push button
  • Jumpers

Circuito para a comunicação entre duas placas Arduino

Para montar o circuito, visualize na imagem a seguir como conectar os componentes entre a placa Arduino e a breadboard.

Certifique-se de utilizar o código correto para o transmissor e receptor.

Comunicação entre duas placas Arduino

Schematics da comunicação entre duas placas Arduino

A seguir temos o schematics do circuito, que detalha suas conexões e fornece detalhes mais específicos do que o circuito da imagem anterior.

Schematics comunicação entre duas placas Arduino

Código fonte para a comunicação entre duas placas Arduino

Uma vez criado o circuito, use os códigos fontes a seguir no Arduino IDE para fazer o upload deles nas placas Arduino e assim ver o resultado do circuito em funcionamento.

Transmissor (Arduino com o Push Button)

#define BTN_PIN 8

void setup() {
  pinMode(BTN_PIN, INPUT_PULLUP);

  // inicializa conexão serial, para Arduino UNO R3 use Serial
  // consulte https://docs.arduino.cc/language-reference/en/functions/communication/serial para maiores detalhes
  Serial1.begin(9600);
}

void loop() {
  int valorBtn = digitalRead(BTN_PIN);
  delay(300); // debouncing

  // caso botão pressionado informa o receptor
  if (valorBtn == LOW) {
    // para Arduino UNO R3 use Serial
    Serial1.write('1');
  }
}

Receptor (a outra placa Arduino)

void setup() {
  pinMode(LED_BUILTIN, OUTPUT);
  digitalWrite(LED_BUILTIN, LOW);

  // inicializa conexão serial
  Serial.begin(9600);
}

int estadoLed = LOW;
void loop() {
  if (Serial.available() > 0) {
    // recebe o valor pela porta serial
    char valor = Serial.read();

    if (valor == '1') {
      // inverte o estado do LED
      estadoLed = (estadoLed == HIGH) ? LOW : HIGH;
      digitalWrite(LED_BUILTIN, estadoLed);
    }
  }
}