Pode ser prático, especialmente em projectos de automação doméstica, comunicar entre vários dispositivos. Uma das técnicas mais utilizadas é o protocolo I2C (ou TWI). O protocolo I2C é um método que permite ligar vários cartões “Master” e vários cartões “Slave” e comunicar até 128 dispositivos. Ele permite conexões assíncronas entre vários componentes para compartilhar informações através de um “barramento comum”. Tínhamos visto a comunicação através da porta Serial (chamada UART) que é usada para enviar o código para o Arduino por um computador ou para conectar dois dispositivos em particular no Bluetooth.
Equipamento
- Computador
- Arduino UNO x2 ou mais
- cabo Jumper M / M x3 vezes o número de placas
Diagrama de ligação do barramento I2C entre placas Arduino
Com o protocolo I2C, também é possível comunicar entre diferentes sistemas (sensores, ecrã LCD, Raspberry Pi, etc.). Um exemplo interessante é a comunicação entre várias placas Arduino. Para isso, temos que escrever pelo menos dois programas, um para a placa “Mistress” (Master) e outro para as placas “Slaves”.
Uma comunicação I2C é definida por um bus de dois fios (às vezes chamado TWI, Two Wire Interface) e um endereço. Os pinos usados pela comunicação I2C são normalmente fixados para cada dispositivo. Um no qual os dados são enviados (SDA Serial Data Line) e no outro o relógio de sincronização (SLC Serial Clock Line).
pinos I2C / TWI:
- Uno, Ethernet A4 (SDA), A5 (SCL)
- Mega2560 20 (SDA), 21 (SCL)
- Leonardo 2 (SDA), 3 (SCL)
- Due 20 (SDA), 21 (SCL), SDA1, SCL1
Neste exemplo usamos uma placa Arduino Uno, portanto os pinos A4 e A5.
Para que as duas placas comuniquem entre si, devem estar ligadas correctamente (A4 com A4 e A5 com A5) e não se esqueça de ligar as terras (GND) como se mostra no diagrama seguinte.
Cuidado: Se os pinos A4 e A5 estiverem ligados aos pinos de um cartão não alimentado, o código irá congelar no momento da transmissão.
Geralmente, um cartão enviará informação (Escritor) e outro a receberá (Leitor).
Código de configuração do barramento I2C
A biblioteca Wire.h permite definir facilmente a comunicação serial no barramento I2C. As funções são similares à biblioteca Serial.
- Wire.begin () inicializa o endereço do dispositivo. Function argument may be empty for master devices
- Wire.write () allows you to send bytes.
- Wire.requestFrom () handles the request receive function
- Wire.beginTransmission () starts transmitting data and defines the receiver.
- Wire.endTransmission ends data transmission
- Wire.onRequest () handles the request receive function
- Wire.onRecieve () manages the data reception function
Code of the “Master” card
“Slave” card code
Open the slave card serial monitor before the master card monitor.
In the serial monitor of the “Master” card:
In the serial monitor of the “Slave 1” card:
We can see that the two cards are exchanging information. É muito fácil estender este exemplo a várias placas Arduino (Leonardo, Mini, etc.) adaptando a fiação e o endereço dos componentes no código “Slave”.
Código para identificar os dispositivos conectados ao barramento I2C
Um bom teste para saber se seus dispositivos comunicam bem entre si é usar o código abaixo (I2CScanner) ) que retorna todos os endereços dos dispositivos conectados à placa Master.