SUPORTE TÉCNICO
De segunda à sexta pelo e-mail:
suporte@robocore.net
CENTRAL DE ATENDIMENTO
De segunda à sexta das 8:00 às 17:30
(11) 3522-7626 / vendas@robocore.net
Retornar
ao topo

Comunicação entre Arduinos: UART



Em algumas situações é interessante configurar dois Arduinos para trocar informações entre si. Neste tutorial, iremos programar duas placas para se comunicarem entre si via protocolo serial UART na configuração Master emissor/Slave receptor. Utilizaremos a bliblioteca SoftwareSerial para realizar esta tarefa, mas a mesma também pode ser feita através da Serial em hardware.
Nesse exemplo, ao pressionar o botão conectado à placa Master, o estado do led conectado à placa Slave será alterado.
O protocolo serial assíncrono UART utiliza de dois fios (RX - Receptor e TX - Transmissor) para realizar uma comunicação full duplex ponto-a-ponto permitindo que ambos os Arduinos possam enviar e receber dados ao mesmo tempo. Para que a comunicação ocorra corretamente o baud rate (taxa de transmissão) de ambos os dispositivos deve ser o mesmo.

Para isso precisaremos de: Confira na imagem ao lado como realizar as conexões de cada BlackBoard.

Agora que você já montou todo o circuito, é necessário programar cada placa com seu código. Neste momento, é importante que você verifique se está gravando a BlackBoard correta, por isso recomendamos que conecte e programe uma placa por vez. Desta forma você não irá se confundir com as portas COM.

Código para a BlackBoard Master (conectada ao botão):

Código para a BlackBoard Slave (conectada ao LED):

Agora basta alimentar ambas as placas que tudo deve funcionar perfeitamente. Aperte o botão da BlackBoard Master e o LED conectado a placa Slave deve acender. Se você apertar novamente o mesmo deve apagar.


Para fazer comentários é necessário estar logado. Efetuar login.

Você ainda nao é cadastrado? Cadastre-se agora!


bianca22arq
date Enviado: 2021-03-22 20:22:48
// UART (Master) - Botão //

int botao;
boolean statusBotao;


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

  pinMode(botao, INPUT);
  
}

void loop() {

  botao = digitalRead(8);
  if(botao == 1){
    delay(1000);
    statusBotao =! statusBotao;
    Serial.write(statusBotao);
  }
}
// (Slave) - LED //

int led = 12;

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

  pinMode(led, OUTPUT);

}

void loop() {
  if(Serial.available()>0){
    int recebido = Serial.read();

    if(recebido == 0){
      digitalWrite(led,LOW);     
    }

    if(recebido == 1){
      digitalWrite(led,HIGH);
    }
  }
}


bianca22arq
date Enviado: 2021-03-22 20:25:35
bianca22arq
Aqui está a maneira ao qual eu programei, mas funcionou e agora não funciona mais, não sei por qual motivo, poderia me ajudar?
Carreguei o código de maneira separada para os dois arduinos, fiz a ligação no protoborard e funcionou sexta feira, hoje segundo feira fui ligar para inserir mais leds e o led ficou piscando sozinho, o botão já não respeitava mais os comandos

Giovanni5
date Enviado: 2021-03-23 07:55:03
bianca22arq
Se o projeto deixou de funcionar entre um dia e outro, é sinal que algum ponto não está exatamente como foi testado inicialmente. O código compartilhado parece estar correto, então o problema pode estar no circuito. Verifique se as conexões dos pinos RX e TX não estão invertidas, e certifique-se que o GND de ambas as placas estão interligados.

bianca22arq
date Enviado: 2021-03-19 19:11:36
Boa noite, estou tentando fazer a comunicação de forma serial em hardware, com os cabos Tx e Rx, como sou iniciante tentei ir modificando o código ilustrado, sem usar a biblioteca software serial, a função, int em vez do char, millis e time, mas não funcionou! Vocês poderiam me ajudar a entender como deveria ser a programação onde troco informações e recebo via serial em hardware, um led em um arduino e um botão em outro arduino.

Giovanni5
date Enviado: 2021-03-22 08:09:48
bianca22arq
O código foi carregado corretamente para as placas, ou a IDE retornou algum erro durante a compilação? A lógica utilizada nas condições "if" do código foram criadas para trabalhar com os valores recebidos em "char", então se você está atribuindo os valores recebidos à uma variável "int", será necessário modificar a lógica das condições considerando a tabela ASCII (https://pt.wikipedia.org/wiki/ASCII).

Giovanni5
date Enviado: 2021-03-22 08:11:41
bianca22arq
Talvez seja uma boa ideia você adicionar alguma indicação visual que a comunicação entre as duas placas está ativa (acionado o "LED_BUITIN", por exemplo), já que não é possível acompanhar a execução do código pelo monitor serial com a comunicação via Hardware de duas placas UNO.

bianca22arq
date Enviado: 2021-03-24 21:16:13
bianca22arq
Consegui fazer funcionar, era problema físico mesmo! O senhor conseguiria me auxiliar na programação agora inserindo dois LEDs e dois botões, como o programa deve se comportar sua logica.

Giovanni5
date Enviado: 2021-03-25 08:51:52
bianca22arq
Como você já conseguiu fazer o projeto funcionar usando apenas um botão e um LED, basta replicar a lógica já existente, para o segundo conjunto. Apenas leve em consideração que você terá que identificar as mensagens que são enviadas e recebidas, para acender o LED correto e de acordo com o botão pressionado. Como você está usando uma variável inteira, talvez seja uma boa ideia usar números para fazer essa identificação. Vale lembrar que, infelizmente não trabalhamos com o desenvolvimento de projetos, portanto não temos como lhe ajudar muito além destes direcionamentos.

valter74
date Enviado: 2020-11-20 18:50:41
olá, estou desenvolvendo um projeto, e gostaria de implementar mais componentes, mas me faltam entradas.
gostaria de saber se posso distribuir metade dos componentes em cada arduino.
Estou utilizando o tinkercad para testar antes de fazer a montagem fisica.
obrigado

Giovanni5
date Enviado: 2020-11-23 08:17:39
valter74
Sim, esta distribuição de portas entre placas que se comunicam serialmente é uma opção para solucionar esse problema, mas, dependendo da aplicação, pode ser um pouco complicado implementar isso. Se você está usando uma placa Arduino com poucas entradas, como uma UNO, você pode substituí-la por uma placa com mais portas, como uma placa da plataforma Arduino Mega (https://www.robocore.net/placa-arduino/blackboard-mega - por exemplo), o que deve facilitar muito a solução deste problema.

parcell
date Enviado: 2020-11-13 20:06:08
Olá, sou iniciante e gostaria de tentar esclarecer uma duvida; Tenho dois arduinos em um projeto (cada um executando algumas tarefas) e um deles está conectado a um Display Nextion, funcionando normalmente.  Eu consigo enviar do outro arduino (via serial) dados para o mesmo Display Nextion?

Francois
date Enviado: 2020-11-16 12:50:49
parcell
Não trabalhamos com esse tipo de display, mas supomos que não. Provavelmente ele aceita o controle apenas por uma porta, então só um microcontrolador deve enviar as informações para ele. O que você pode fazer então é enviar as informações usando esse Arduino como intermediário ou fazer um chaveamento da comunicação entre os Arduinos, porém essa segunda opção não é muito indicada porque é mais fácil de se perder no controle do display.

mateusuzuelli
date Enviado: 2020-09-10 09:47:34
Bom dia!

Como não possuo 2 arduinos, estou tentando fazer pelo software Thinkercad. Porém a programação não apresenta erro mas não acontece nada.
O que pode estar errado?

Giovanni5
date Enviado: 2020-09-10 10:38:14
mateusuzuelli
Talvez o circuito esteja com uma inversão na conexão dos pinos das placas, portanto tente inverter essas conexões, e observe o resultado.

nunocastemmel1
date Enviado: 2020-05-12 08:15:45
Olá,
É possível fazer essa ligação, mas usar um sensor IR no master e acender vários leds no slave?
Obrigado.

Giovanni5
date Enviado: 2020-05-12 09:47:40
nunocastemmel1
Sim, é possível, basta alterar os códigos do master e do slave desta página, para que eles executem o que você deseja.

wallace13
date Enviado: 2019-11-17 19:45:38
Olá,
Estou montando um projeto onde recebo os dados externos através de um atmega328, envio para um atmega328 responsável por  enviar os dados lidos para um banco de dados na web via ESP01.
O problema está no fato de que, para configurar o ESP01, preciso utilizar uma "porta serial" criada pelo softwareserial.h e preciso dela também para essa outra conexão. Se eu startar a Serial1 e depois startar a Serial2, a Serial1 não funciona(nesse caso, não lê os dados recebidos do outro atmega) e se startar a Serial2 e depois startar a Serial1, a comunicação com o ESP01 dá timeout.

wallace13
date Enviado: 2019-11-17 19:47:54
wallace13
A pergunta é: dá para utilizar mais de uma porta advinda da softwareserial.h ou essa é uma limitação do uno que não dá para contornar? Se sim, é possível criar uma Serial3 também? Precisava dessas portas para fazer meu projeto rodar.

Atenciosamente,
Wallace Rocha

wallace13
date Enviado: 2019-11-17 21:38:08
wallace13
Consegui resolver o problema dando uma lida na documentação da biblioteca. Para quem enfrentar o mesmo problema e se ver na necessidade de utilizar mais de uma conexão serial, segue a resposta:
O Arduino UNO não consegue ouvir mais de uma conexão serial ao mesmo tempo, portanto, você deve especificar qual porta você quer ouvir. Antes de utilizar uma conexão serial, você deve especificar qual serial você quer ouvir através do comando listen().
Um exemplo:
(...)
  Serial1.listen();
  if (Serial1.available() > 0){
    String param = leitordedados();
    Serial.println(param);
    Serial2.listen()

Francois
date Enviado: 2019-11-19 12:23:08
wallace13
Exatamente, a biblioteca de serial de software permite apenas uma porta por vez esperando os pacotes. Isso pode ser um inconveniente em alguns projetos, então você pode optar por usar outros microcontroladores com mais portas seriais de hardware (ex: BlackBoard Mega).

brunomcomin
date Enviado: 2018-10-08 15:37:40
Ah entendi...Vlw ViniDj ajudou muito cara :DD

brunomcomin
date Enviado: 2018-10-08 10:28:05
Bom dia pessoal, eu fiz o teste com as portas (2 ,3) // (RX , TX) , e não deu certo, mas quando eu mudei para as portas (10 ,11) funcionou. E até onde sei as portas (2 ,3) dos meus 2 arduinos estão funcionando. Alguém sabe dizer se isso é normal?

ViniDj
date Enviado: 2018-10-08 15:12:52
brunomcomin
Por acaso você está usando algum Arduino Mega nessa configuração?

brunomcomin
date Enviado: 2018-10-08 15:21:23
brunomcomin
Sim, estou usando dois mega 2560 da robocore.

ViniDj
date Enviado: 2018-10-08 15:27:20
brunomcomin
As placas Arduino Mega, seja a BlackBoard Mega seja a placa Arduino Mega da marca italiana, não aceitam por padrão os pinos 2 e 3 trabalharem com a biblioteca SoftwareSerial. Neste caso é recomendado justamente o uso dos pinos 10 e 11 para isso, pois esses pinos aceitam essa funcionalidade. Para saber mais acesse o link a seguir e leia o tópico sobre Limitações: https://www.arduino.cc/en/Reference/SoftwareSerial

guilhermeapk
date Enviado: 2018-04-17 21:27:10
Eu consigo enviar e ler um número inteiro ou uma string ao invés de apenas enviar e ler um cahr?

hallszombie
date Enviado: 2018-04-18 08:31:59
guilhermeapk
A uart vai enviar caracteres, mas você consegue trabalhar com inteiros e string, um exemplo simples de inteiro usando os códigos acima, é usar "int received", se você usar esta variável dessa forma o Arduino já faz a conversão do char que chega, para um inteiro com base na tabela ASCII, agora no caso das string, você deverá compor os caracteres para obter as strings. Ou seja, você apenas envia e recebe caracteres, e cabe ao desenvolvedor fazer a conversão da informação recebida para a informação desejada.