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: I2C - Parte 1



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 I2C. Utilizaremos a bliblioteca Wire para realizar esta tarefa.
O protocolo serial síncrono I2C, também conhecido como TWI, utiliza de dois fios (SDA: Dados; SCL: Clock) para realizar uma comunicação half duplex, ou seja, é possível trasmitir e receber informações, mas não ao mesmo tempo, apenas um sentido por vez. Forma-se um barramento endereçável onde cada componente na rede possui um endereço para ser identificado para que a informação possa ser designda para o destinatário correto.
Nessa primeira parte do tutorial a placa Master estará conectada ao botão e, ao pressionar este botão, o estado do led conectado à placa Slave será alterado. A placa Master trabalhará como o emissor e a placa Slave como o receptor.

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.
Até este ponto já aprendemos como fazer nossa placa Mestre enviar informações para o Slave. Na segunda parte do tutorial iremos aprender como fazer nossa placa Mestre receber informações da placa Slave. A segunda parte deste tutorial você encontra aqui.


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

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


odecamm
date Enviado: 2021-09-15 15:30:01
Estou trabalhando com o display da Nextion (comunicação RX e TX) e ele funciona muito bem com o Arduino UNO. Entretanto, mesmo seguindo as orientações do fabricante, que ensina o que deve-se alterar na biblioteca Nextion.h, ele não funciona no ESP32. Lendo a sua publicação tive a ideia de usar o Arduino UNO como uma ponte entre o display Nextion e o ESP32.  Você acha que isso é possível?

Giovanni5
date Enviado: 2021-09-15 16:05:57
odecamm
Sim, isso é possível, porém é necessário criar uma lógica para que cada mensagem enviada do ESP32 para a placa Arduino represente um controle específico do display, e vice versa. Outro ponto que vale ser lembrado é que, o ESP32 e as placas Arduino mais populares (UNO, Mega, etc.) possuem tensões operacionais distintas (3,3V do ESP32 e 5V das placas Arduino). Portanto é necessário um conversor de nível lógico (https://www.robocore.net/regulador-de-tensao/conversor-de-nivel-logico - por exemplo), para compatibilizar as tensões desta comunicação.

odecamm
date Enviado: 2021-09-16 09:22:28
odecamm
Muito obrigado pela resposta. Muito bem elaborado o seu tutorial e também as linhas de comando muito bem comentadas. Parabéns!

colognesipedro
date Enviado: 2021-08-07 21:55:17
Boa noite
Não conseguir funcionar, verifiquei os códigos, as conexão, tem alguma dica ?

Giovanni5
date Enviado: 2021-08-09 08:07:45
colognesipedro
Este é um projeto bem simples, e não há muitos fatores que podem causar erros. Portanto verifique novamente o circuito montado, principalmente se não há uma inversão entre os pinos SDA e SCL entre as placas, e que o GND de ambas as placas está interligada. Além disso, certifique-se de não estar invertendo o código nas placas como "Mestre" e "Escravo".

colognesipedro
date Enviado: 2021-08-09 20:23:40
colognesipedro
Sera que pode ser a ide do Arduíno no computador?

colognesipedro
date Enviado: 2021-08-09 21:12:41
colognesipedro
Consegui era erro na ultima linha da programação do Arduíno mestre, uma pergunta é possível que o aplicativo do celular controlar o Arduíno mestre que controla o escravo, através da comunicação Bluetooth?

Giovanni5
date Enviado: 2021-08-10 08:02:16
colognesipedro
Sim, isso é possível, mas a comunicação entre o "mestre" e o "escravo" ainda será I2C e não Bluetooth. O que você pode fazer é utilizar o "mestre" para apenas retransmitir os dados recebidos pelo Bluetooth para o "escravo", ou então aproveitar o "mestre" para interpretar os comandos recebidos pelo Bluetooth, e então transmitir menos dados para o "escravo".

colognesipedro
date Enviado: 2021-08-10 19:50:49
colognesipedro
sim, obrigado. O potenciômetro analógico pode ser programado pela comunicação I2C? Normalmente.

Giovanni5
date Enviado: 2021-08-11 08:05:10
colognesipedro
Você parece estar confundindo um pouco os conceitos. O protocolo I2C não permite a gravação de códigos e o potenciômetro é apenas um componente eletrônico, então não pode ser programado. Entretanto, você pode transmitir as leituras de um potenciômetro através da comunicação I2C. De modo geral, é possível transmitir qualquer tipo de dados através da comunicação I2C.

colognesipedro
date Enviado: 2021-08-11 20:18:18
colognesipedro
Obrigado. Me ajudou muito

lipe
date Enviado: 2021-05-22 15:01:07
Queria saber se tem como fazer comunicação simultânea entre os dois e lcd tb

Giovanni5
date Enviado: 2021-05-24 08:13:16
lipe
Sim, é possível, desde que os 3 dispositivos tenham endereços I2C diferentes. Vale lembrar que, o controle principal do LCD terá que ser feito pelo "Mestre" ou pelo "Escravo".

kurten
date Enviado: 2021-03-07 21:34:37
montei tudinho e nao funciona....alguem tem alguma dica ?
ja montei e desmontei umas 5 vezes

Giovanni5
date Enviado: 2021-03-08 08:47:40
kurten
Verifique se a conexão dos pinos SDA e SCL não estão invertidas, e que essas conexões não estão com um mau contato. Além disso, certifique-se de estar carregando o código "Master" ou "Slave" para a respectiva placa que operará nesta função.

kurten
date Enviado: 2021-03-08 14:52:35
kurten
ja fiz isso e continuo apertando o botao e o led nao acende....fiz tudo direitinho....

kurten
date Enviado: 2021-03-08 14:56:09
kurten
consegui ! acredita que o resistor do led estava com problemas ?
obrigado.

weverspn
date Enviado: 2020-05-18 18:44:19
Boa noite, nesse protocolo I2C existe a possibilidade de enviar vários sinais de tipo inteiro ao mesmo tempo ?
Exemplo: Escrever nas variaveis X=10; Y=20, Z=30. E no arduino slave ler as 3 variaveis a mesmo tempo?

Giovanni5
date Enviado: 2020-05-19 08:27:12
weverspn
Sim, é possível, basta utilizar mais de uma função "Wire.write", uma para cada variável que você deseja enviar para a outra placa da comunicação.

weverspn
date Enviado: 2020-06-03 14:16:10
weverspn
Entendi, nesse caso teria que adicionar mais dois SlaveAdress?
Ou apenas com esse único slave Adress eu consigo no arduino slave ler as 3 variaveis ao mesmo tempo ?

X=10;
Y=20;
Z=30;
        Wire.beginTransmission(slaveAdress);
        Wire.write(X); // 
        Wire.write(Y); //
        Wire.write(Z); //
        Wire.endTransmission(); // encerra a transmissão

Desta forma, o arduino slave não iria ler o valor 10 depois 20 e depois 30 no mesmo canal 0x08? 

Giovanni5
date Enviado: 2020-06-03 15:23:26
weverspn
Com apenas um endereço de "slave" você é capaz de enviar as três variáveis para a outra placa, e como você mencionou, as três serão enviadas ao mesmo tempo. Entretanto, caso elas sejam sempre enviadas na mesma ordem, você pode armazená-las em sequência e em três novas variáveis distintas, conforme são recebidas, por exemplo, X2=X, Y2=Y e Z2=Z. Outra opção é utilizar um contador que é implementado conforme as mensagens são recebidas, deste modo a mensagem salva na variável um, a mensagem dois executa uma função, e assim por diante.

Giovanni5
date Enviado: 2020-06-03 15:27:06
weverspn
Para a segunda opção, é possível utilizar o primeiro byte do cabeçalho da comunicação, para definir qual o tipo de mensagem que será enviada. Além disso, vale lembrar que a função "write()" é usada para enviar mensagens de até 8 bits (de 0 a 255), portanto será necessário quebrar a mensagem, caso ela seja maior do que este valor.

Mateus2017
date Enviado: 2020-03-05 16:50:20
Boa tarde! queria saber se eu posso fazer ao contrário, por exemplo acionar o botão a uma entrada do Slave e mandar essa informação para o mestre? estou tentando fazer isso com o Raspberry pi como Mestre e o Arduino como Slave. Obrigado pela atenção

Giovanni5
date Enviado: 2020-03-06 08:20:31
Mateus2017
Sim, é possível fazer com que o Slave seja um mensageiro de informações, inclusive esta aplicação é uma referência da própria Arduino (https://www.arduino.cc/en/Tutorial/MasterReader). Mas vale lembrar que, de toda forma o Master da comunicação deve fazer uma requesição de informação, para que a mensagem seja enviada.

Moracimelo
date Enviado: 2019-08-23 07:55:05
Bom dia, eu gostaria mesmo era interligar dois Arduinos, como no exemplo do I2C, via ethernet.  Ou seja, enviar um comando remoto para outro arduino via ethernet.  Como faço?

Giovanni5
date Enviado: 2019-08-23 11:02:41
Moracimelo
Infelizmente não temos nenhum tutorial sobre como realizar essa comunicação através do shield Ethernet, porém, a princípio, essa comunicação é possível. Talvez seja melhor você estudar a possibilidade de outros métodos de comunicação, como, por exemplo, RS232,entre outras. Você pode também, pesquisar sobre como estabelecer conexão "Ad Hoc" entre dois dispositivos.

tiagoarrudadacruz
date Enviado: 2019-08-14 12:57:32
Boa tarde, 
Estou em um projeto que preciso conectar uns 5 instrumentos de medição, todos eles tem interface rs232, pensei em conectar todos em um único arduino, ou migrar todos para um HUB USB e conectar ele ao arduino, essas soluções são viáveis?

Giovanni5
date Enviado: 2019-08-14 16:08:55
tiagoarrudadacruz
Essa questão irá depender muito do seu projeto final, já que, dependendo de como você distribuir os instrumentos, ou seja, sua topologia na rede, é possível que seja necessária a criação de um protocolo para  interpretar as mensagens enviadas ao mesmo tempo. Talvez apenas a multiplexação dos sinais dos instrumentos possa ajudar a interpretar os sinais em um ponto único, a placa Arduino.

super.adm.lucius
date Enviado: 2019-03-13 14:46:19
Boa!

Tem algum tutorial para implementar uma interface de comunicação com sensores (exemplo: Sensor Ultrassonico HC-SR04, módulo do sensor de desvio de obstáculos, módulo de temperatura e sensor de umidade, etc...) por meio do protocolo I2C ?

Teria um outro módulo para o controle de outro Arduino por meio de I2C?

Grato pela atenção.

Francois
date Enviado: 2019-03-13 19:20:51
super.adm.lucius
Não temos nenhum tutorial para esse tipo de aplicação, mas o dessa página é a base para esse tipo de projeto. Você pode alterá-lo para transmitir mais dados e/ou adicionar outros Arduinos no mesmo barramento I2C.

Você encontra na categoria Comunicação (https://www.robocore.net/tutoriais/comunicacao/) outras opções de transmissão de dados entre Arduinos. Ainda existem outras formas, mas requerem outros componentes (por exemplo por Ethernet, RS232, infravermelho, USB, entre outros).

esteoclelg
date Enviado: 2019-03-09 02:36:55
Olá é possivél usar comunicação rx_tx ou i2c para fazer um projeto envolvendo o sensor de distância?
Ex: Escravo passando as informações do sensor para o Master!

ViniDj
date Enviado: 2019-03-11 13:28:17
esteoclelg
Dependendo do sensor de distância ele possui essas formas de comunicação. O URM37, por exemplo, possui RxTx para leitura, porém são sensores com valor bem maior que o HC-SR04, por exemplo (cerca de 10 vezes a mais o preço). Sugiro pesquisar por como fazer sua própria interface para poder usar os sensores mais simples com a leitura dessa forma.