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!


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.

Dreadd
date Enviado: 2017-10-18 13:50:29
Ola, estou com uma dificuldade, como faço para acionar outras saídas (leds)  por botões diferentes, do master para slave, na parte do SoftwareSerial blackBoardSlave(2,3); deixaria o mesmo para todos, com a mesma taxa de bits? ou adiciona um novo SoftwareSerial e com bits diferentes?
Pois, fiz como me disseram, mas ele aciona uma saída ou todos, tentei adicionar mais seriais, mas acho que não esteja correto. Gostaria de saber o que seria necessário adicionar. Agradecido pela atenção.

Francois
date Enviado: 2017-10-18 15:32:48
Dreadd
Você não precisa declarar outra variável de serial, pois você continuará usando os mesmos pinos para a comunicação. Você precisa diferenciar os comandos enviados para cada botão, pois o código do tutorial envia sempre 0 ou 1. Você pode modificar o código para enviar (A) e (a) para o botão/LED 1, (B) e (b) para o botão/LED 2, e assim por diante. Isso significa que será necessário fazer uma verificação do estado atual (ledState) de cada par botão + LED, para em seguida enviar o caractere correspondente.

Dreadd
date Enviado: 2017-10-08 19:27:37
Ola, estou com uma dificuldade, como faço para acionar outras saídas (leds)  por botões diferentes, do master para slave,

MarceloFarias
date Enviado: 2017-10-09 10:41:49
Dreadd
Tente entender como o código funciona e perceberá que basta multiplicar algumas linhas de código já existentes para declarar, configurar e ler mais botões e enviar essa informação via serial. No slave da mesma maneira, declarar e configurar mais leds para que você possa acioná-los de acordo com os caracteres recebidos. Você precisará utilizar caracteres diferentes também, por exemplo, '2' para acender e '3' para apagar.