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!


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.

Heloiso
date Enviado: 2017-05-13 21:16:36
Como incluir a Stepper  motor de passo com driver ULN2003 na Slave ?

Francois
date Enviado: 2017-05-15 12:12:16
Heloiso
Ao invés de usar o comando digitalWrite() quando o caractere desejado é recebido você deve usar as funções de motor de passo que deseja.