O uso do interface I2C para implementar a comunicação entre Arduinos é especialmente atractiva no caso dos Arduinos que apenas possuem uma porta serie de hardware como Uno e Nano, e que está afecta ao USB serial.
Este texto descreve o meu conhecimento superficial e prático do uso do interface I2C para estabelecer a comunicação entre Arduinos, em pelo menos três situações diferentes.
Tipologias de exploração do interface i2c
No que respeita a comunicação i2c entre Arduinos, ou outros microcontroladores, existem pelo menos as seguintes situações substancialmente diferentes:
- Um único master no bus i2c
- Dois ou mais masters no bus i2c
Analizei a informação disponivel na web, e efectuei uma serie de testes de forma a implementar uma solução satisfatória. Ou seja: permita altas frequencias no envio de mensagens, e seja estável.
Master único
Nesta situação existe apenas um Arduino master no bus. Todos os outros Arduinos ou outros dispositivos no bus, nomeadamente sensores, são slaves.
Regra geral o funcionamento neste tipo de ambiente é estável.
Software
Exemplo 1
- Comunicação de bytes em I2C entre Arduinos – Código teste para o Arduino Master
- Comunicações I2C entre Arduino e Raspberry Pi – Código teste para o Arduino Slave
Exemplo 2
- Comunicação de byte, int, long, double em I2C entre Arduinos – Código teste para o Arduino master
- Comunicação de byte, int, long, double em I2C entre Arduinos – Código teste para o Arduino slave
Mais que um master
Nesta situação existe mais que um Arduino master no bus. Também podem existir outros Arduinos ou dispositivos Slaves.
Se não existirem slaves, ou seja são tudo arduinos a funcionar com master, então, regra geral o funcionamento é estavel mesmo com uma grande frequência de mensagens.
Se existirem slaves, então, não é estável, sem qualquer sinalização de hardware (leia-se outro fio).
Pelas experiências que fiz, diria que se conseque um funcionamento, mais o menos, estável para frequencias muito baixas de mensagens enviadas pelos outros masters. Tão baixas que não vejo utilidade nos meus projectos.
Obs. Nunca coloquei os pullup resistors de 1.2k recomendados.
Software
Sobre a comunicação multi master entre Arduinos efectuei testes com os seguintes programas:
- Comunicação multimaster i2c entre Arduinos – Programa 1
- Comunicação multimaster i2c entre Arduinos – Programa 2
- Comunicação multimaster i2c entre Arduinos – Programa 3
Links
https://www.arduino.cc/en/Reference/Wire
https://www.hackster.io/chipmc/arduino-i2c-multi-master-approach-why-and-how-93f638
What Could Go Wrong? I2C Edition
http://forum.arduino.cc/index.php?topic=187282.0