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!


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.

Mateus2017
date Enviado: 2019-02-17 09:32:21
olá, estou tentando acionar o led com a BlackBoard (mestre) com o pic18f4550 (escravo) pela comunicação i2c, porém não estou conseguindo, poderia fazer um tutorial explicando? agradeço

Giovanni5
date Enviado: 2019-02-18 15:31:46
Mateus2017
Agradecemos a sugestão, vamos analisar a possibilidade.

Mateus2017
date Enviado: 2019-02-18 21:44:03
Mateus2017
Para a programação do PIC18F4550 queria se possível utilizar o compilador Mikro C pro pois é nele que estou usando, a inteção é fazer comunicação I2c usando arduino como (mestre) e o PIC18f4550 (escravo), a ideia seria o arduino ler o valor de entrada artavés do botão e depois manda a informação para o pic acionar uma saída para acionar o led e também fazer com que o arduino realiza a leitura de estado de uma porta do pic e dependendo dessa leitura o arduino acionasse uma saída para ligar o led, exemplo: se a entrada RA1 do pic estiver em nivel lógico alto o arduino faz essa leitura e aciona sua saida para acionar outro led.

Giovanni5
date Enviado: 2019-02-19 12:16:05
Mateus2017
Você pode tentar utilizar os códigos e algumas explicações deste site como base para o seu projeto: https://hashinireveals.wordpress.com/2014/07/26/i2c-communication-testing-with-an-arduino-master-and-a-pic-slave/ . Porém vale lembrar que a comunicação I2C sempre é iniciada pelo mestre, o escravo somente responde aos comandos enviados pelo mestre.

harbartt
date Enviado: 2019-01-09 22:53:43
Boa noite. É possível comunicar mais que dois arduinos? Pretendo interligar 5 Arduinos, sendo um master e os outros 4 slaves. Isso é possível?

Francois
date Enviado: 2019-01-10 12:44:55
harbartt
O protocolo I2C permite até 127 dispositivos escravos conectados na mesma rede, portanto você pode adicionar mais Arduinos na sua rede. Para fazer a comunicação com os vários Arduinos basta associar um endereço único para cada e fazer o mestre perguntar para o endereço desejado.

snorlax
date Enviado: 2018-11-07 06:46:13
Bom dia! Eu gostaria de comunicar dois Arduinos, porém existe uma certa distância!No caso irei realizar um teste com sistema de fibra óptica. Eu tenho que interligar o gnd dos dois? Ou posso utilizar fontes independentes para cada um? Obrigado

Francois
date Enviado: 2018-11-07 12:28:51
snorlax
Sempre que você usar dois circuitos para trocar informações (ex: Arduino com sensor, Arduino com Arduino, Arduino com computador) você deve interligar o sinal de retorno (GND) para fechar o circuito e manter a mesma tensão de referência entre eles. Você pode usar fonte independentes para cada Arduino, porém lembre de interligar o GND das duas placas.

carlosintership
date Enviado: 2018-09-17 20:08:52
Olá boa noite, como faco acrescentar mais botões no mestre e mais led's no escravo?

Francois
date Enviado: 2018-09-18 11:35:31
carlosintership
Você pode, por exemplo, enviar dois bytes, sendo o primeiro o número do botão/LED e o segundo o estado; enviar um byte para cada botão/LED ou enviar apenas um byte, só que cada bit corresponde a um botão/LED.