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:
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:
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:
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:
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:
Todos esses componentes para seu experimento de comunicação serial usando dois Arduinos, você encontra em nossa loja aqui na Arduino Ômega.
- 2x Arduino Uno
- 2x Suporte para bateria 9V (Você já economiza no jumper e conector)
- 1x Push Button
- 1x Led (Compre mais de 01, para fazer vários efeitos e nos enviar as melhorias)
- 1x Resistor (Esse kit já vem com 10 resistores)
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.
Deixe uma resposta