Comunicação serial usando dois Arduinos

Fala pessoal, tudo bem com vocês! Alguém ai sabe quem é o responsável pela comunicação serial nas placas Arduino UNO? Pois se não sabe, hoje conhecerá o responsável por ser reconhecido automaticamente pelo computador ao conectar o cabo USB e vamos desvendar um segredo que muitos não perceberam. O projeto de hoje será uma exemplo de comunicação serial usando dois Arduinos!

Observe a imagem abaixo:

Arduino Uno com destaque no chip USB

Esse “chip USB” é o Atmega 16U2, ele está conectado diretamente com o conector USB do Arduino, ou seja, é o primeiro a receber os dados ou código vindos do computador sendo tratado e enviado para o microcontrolador Atmega 328P já conhecido nosso. Essa comunicação, saindo do computador pela porta COM, chegando no Atmega 16U2 e indo para o Atmega 328P é uma comunicação do tipo serial Rx/Tx, a mesma que conhecemos nos pinos 0 e 1 respectivamente do Arduino ao qual conectamos o módulo Bluetooth por exemplo, observe o esquemático da placa Arduino Uno.

Agora vamos destacar a parte que nos interessa, a comunicação serial:

Circuito Serial do Arduino UNO

Agora vem o segredo, qual dos leitores aqui presente já tentou carregar um código do computador para o Arduino com um módulo Bluetooth instalado nas portas 0 (Rx) e 1 (Tx) do Arduino e deu erro, sendo necessário desconectar o módulo Bluetooth, passar o código e só após reconectá-lo?

O “problema” está nessas linhas verde e amarela, observe que elas vêm desde o conector USB, passando pelo Atmega 16U2 e chegando no Atmega 328P, porém ao fechar o circuito nos pinos Rx e Tx do Atmega 328P existe um nó expandindo para o pino do conector, caso você esteja transferindo um código e um módulo Bluetooth esteja conectado haverá uma colisão de dados nesse nó pois o microcontrolador estará constantemente consultando o módulo Bluetooth, ou seja, esperando dados dele.

Em nosso projeto do Veículo controlado por App mencionamos este detalhe, ao alertamos aos leitores para fazer o upload do código para o Arduino com a conexão do bluetooth desconectada, e após o upload conectá-lo novamente.

As mesmas portas Rx e Tx que estabelece a conexão com a porta USB através do Atmega 16U2, também conecta diretamente com um módulo Bluetooth ou com outro Arduino que é o assunto de nosso artigo, porém, agora que você já conhece o princípio de funcionamento deve atentar para desconectar as portas Rx’s e Tx’s dos Arduinos no momento de passar o código e outro detalhe é interligar os GND’s dos dois Arduinos conforme imagem abaixo:

Arduinos conectados no mesmo referencial

Isso é necessário para garantir que as duas placas estejam no mesmo potencial de referência.

O nosso projeto consiste em interconectar 02 Arduinos Uno’s através de comunicação serial, este tipo de ligação precisa de atenção, pois ela é feita de forma cruzada, ou seja o Tx do Arduino 01 liga no Rx do Arduino 02 e o Rx do Arduino 01 liga no Tx do Arduino 02, ou seja:

Rx1 -> Tx2

Tx1 -> Rx2, conforme figura abaixo:

Ligação serial entre dois Arduinos
Assista o vídeo deste tutorial no Youtube!

Com os Arduino’s conectados serialmente, instalamos um botão no Arduino 01 e um Led no Arduino 02, para que quando o Arduino 01 recebesse o evento de aperto do botão, enviasse um dado para o Arduino 02 que iria ligar ou desligar o Led, parece um projeto bobo, mas é o princípio de muitas soluções onde o processamento de uma placa é limitado, podemos definir que a placa 01, por exemplo, monitore o ambiente capturando os dados dos sensores, enquanto a placa 02 realiza os cálculos necessários, observa como ficou simples a ligação do circuito:

Circuito Final

Todos esses componentes para seu experimento de comunicação serial usando dois Arduinos, você encontra em nossa loja aqui na Arduino Ômega.

Com esse material você tem pouco investimento e muito aprendizado, pode acreditar.

Agora que já temos todo o hardware vamos conhecer o software? Primeiro o código do Arduino 01, que tem o botão instalado nele com a função de enviar os dados.

bool status_led = 0;
byte button = 12;

void setup() {
  Serial.begin(115200);
  pinMode(button, INPUT_PULLUP);
}

void loop() {
  bool status_button = digitalRead(button);
  if(!status_button){
    status_led = !status_led;
    if(status_led) Serial.write('1');
    else Serial.write('0');
    delay(300);
  }
}

Linha 01 – Inicio a variável responsável por ligar/desligar o led com o estado 0, led desligado.

Linha 02 – Defino a variável button como conectada na porta 12 do Arduino.

Linha 05 – Inicializo a comunicação Serial com uma taxa de transmissão de 115200 bauds, lembra que o padrão é 9600?

Linha 06 – Defino o pino 12 do Arduino como entrada setada em PullUp.

Linha 10 – Leio o estado do botão.

Linha 11 – Se o botão for pressionado entre na condicional indo para a linha 12.

Linha 12 – Inverte a variável do estado do Led, se estava desligado (0) agora irá ligar (1).

Linha 13 – Se a variável status_led for 1, o Arduino irá enviar o caracter ‘1’.

Linha 14 – Senão irá enviar via serial o caracter ‘0’.

Linha 15 – Aguarda 300 milissegundos para evitar duplo clique no botão.

O código do receptor é bem parecido, vamos a ele:

byte led = 3;

void setup() {
  Serial.begin(115200);
  pinMode(led, OUTPUT);
}

void loop() {
  if(Serial.available()){
    char data_received = Serial.read();
    if(data_received == '1')      digitalWrite(led, HIGH);
    else if(data_received =='0')  digitalWrite(led, LOW); 
  }
}

Linha 01 – Declara o pino 03 do Arduino a variável led.

Linha 04 – Inicializo a comunicação Serial com uma taxa de transmissão de 115200 bauds, lembra que o padrão é 9600?

Linha 06 – Defino o pino 03 do Arduino como saída.

Linha 09 – Verifica se existe uma solicitação de comunicação entre as portas seriais.

Linha 10 – Se houver uma solicitação, ler os dados na porta serial e grava na variável data_received.

Linha 11 – Se a variável data_received for 1, o Arduino irá ligar o Led.

Linha 12 – Senão irá desligar o Led.

E é isso pessoal, finalizamos o nosso exemplo de comunicação serial usando dois Arduinos. Gostou? Comenta aqui ou na rede social do Arduino ômega do que você vem aprendendo com a gente. Qualquer dúvida estamos a disposição.

Sobre Sandro Mesquita 19 artigos
Prof. Sandro Mesquita, Msc. Eng de Software, CREA - 44680 .

Seja o primeiro a comentar

Deixe uma resposta

O seu endereço de email não será publicado.


*