Escolar Documentos
Profissional Documentos
Cultura Documentos
Esse barramento foi criado pela empresa Holandesa (Philips) como Inter IC ou I2C que
possibilita a utilização de grande quantidade de componentes padronizados, os quais podem
realizar diversas funções, além de possibilitar a troca eficaz de informações entre eles. O
conceito do barramento I2C é facilitar a integração de circuitos de caráter final de aplicação
como por exemplo sensores e conversores, com um sistema de controle, de modo que eles
possam trabalhar com seus sinais de maneira direta.
O barramento I2C é do tipo multi-mestre, isso significa que mais de um dispositivo de controle
pode ser conectado a ele. No entanto, durante uma comunicação, somente um dos mestres
pode estar ativo, ou ocorrerá uma colisão de dados no barramento.
www.meccomeletronica.com página 1
I2C – PROTOCOLO DE COMUNICAÇÃO MCU
As linhas SDA como SCL são bidirecionais e devem ser ligadas ao positivo da alimentação
através de uma fonte de corrente ou de um resistor pull-up, para garantir que ambas as linhas
permaneçam em nível alto, quando o barramento está livre.
Uma das vantagens do padrão I2C é que ele não fixa a velocidade de transmissão
(frequência), pois ela será determinada pelo circuito MASTER (transmissão do SCL).
I2C é um protocolo de barramento (ou bus), ou seja, com os mesmo fios conectamos todos os
dispositivos do nosso setup. Essa característica, barramento, é um dos grandes atrativos do
I2C, pois reduzimos em muito a necessidade de pinos de conexão no Arduino, pois usaremos
sempre os mesmo fios para a conexão, não importa se estamos utilizando 1 ou 127
dispositivos.
www.meccomeletronica.com página 2
I2C – PROTOCOLO DE COMUNICAÇÃO MCU
O Arduino vem com pinos próprios para a conexão I2C, no caso do Uno e derivados
os pinos são sempre o 4 (SDA) e 5(SCL). No caso do Arduino Mega, os pinos
utilizados são o 20 (SDA) e 21 (SCL).
DAS - Serial Data SCL - Serial Clock
SDA é o pino que efetivamente transfere os dados, e SCL serve para temporização entre os
dispositivos, de modo que a comunicação pela SDA possa ter confiabilidade. Como podem
observar, tanto o envio quanto a recepção de dados é realizada utilizando a linha SDA, ou seja,
é uma linha bi-direcional de comunicação, ora estamos enviando dados por este pino, ora
estamos recebendo dados.
Existem uma variedade enorme de dispositivos que utilizam o protocolo I2C, como o próprio
Arduino, Raspberry, memórias externas (EEPROM), I/O expanders, RTC (Real Time Clock),
Visor (LCD, TFT, etc), sensores diversos (temperatura, acelerômetro, etc).
Além do SDA e SCL, os dispositivos utilizam o terra(GND) e o Vcc para alimentação. Abaixo
um exemplo de ligação mais real:
www.meccomeletronica.com página 3
I2C – PROTOCOLO DE COMUNICAÇÃO MCU
Os resistores pull-up nas linhas SDA e SCL, são normalmente utilizados quando há mais de
um slave no barramento, e o valor do resistor é dependente dos dispositivos. Normalmente
dispositivos I2C possuem um datasheet, e nele podemos encontrar o valor adequado dos
resistores pull-up. Se estiver utilizando apenas um dispositivo slave conectado ao Arduino, não
se preocupe, o Arduino já vem com resistores pull-up internos especializados para a
comunicação I2C.
A ordem que conectamos os dispositivos não importa. Podemos ligar os dispositivos como
quisermos, respeitando a pinagem certa, que o resultado final será o mesmo.
Caso não fique claro pelo datasheet se o seu dispositivo usa 7 ou 8 bits no endereçamento,
outra forma é verificar se o endereço está na faixa de endereços I2C válidos.
www.meccomeletronica.com página 4
I2C – PROTOCOLO DE COMUNICAÇÃO MCU
Como podem ver, a faixa disponível vai de 0x08 a 0x77. Não se esqueça que é em
hexadecimal, e fazendo as conversões para decimal podemos concluir que o número de
dispositivos possíveis na prática é 112.
Todo o trabalho com dispositivos I2C se resume a uma operação de leitura ou uma operação
de escrita. Em nossos sketches, independente do dispositivo, estaremos lendo alguma
informação ou escrevendo alguma informação em um dispositivo especifico. Será comum
encontrarmos dispositivos com alguma particularidade nas operações de escrita/leitura, mas
em geral o datasheet do dispositivo fornece esses detalhes.
Uma observação importante para trabalharmos com I2C no Arduino, temos que dar um include
na biblioteca Wire. No início de qualquer sketch inclua a linha #include <Wire.h>. Após
incluirmos a biblioteca, é necessário inicializá-la dentro de setup() com Wire.begin().
I2C – ESCRITA
A escrita em dispositivos I2C é relativamente simples. O trecho de código abaixo mostra como
funciona esse processo:
Wire.beginTransmission(endereço);
Wire.write(memória);
Wire.write(valor);
Wire.endTransmission();
WIRE.WRITE(VALOR) - Envia o valor (sempre 1 byte) pela SDA para o dispositivo informado
anteriormente. O dispositivo possui um registrador (ou memória) aguardando pela informação,
e os outros dispositivos ignoram esta comunicação. O comum é enviarmos uma informação
(um byte) em cada operação.
Se observarmos utilizamos o mesmo comando tanto para informar onde queremos gravar e o
que queremos gravar. Tudo dependo do datasheet do dispositivo, onde, no caso acima,
teríamos a instrução de que, numa operação de escrita, o primeiro byte indica a posição de
memória, e o segundo byte indica o valor a ser gravado. Poderíamos muito bem ter um
dispositivo com apenas um registrador para gravação, e portanto não seria necessário informar
em qual posição é para o valor ser gravado
www.meccomeletronica.com página 5
I2C – PROTOCOLO DE COMUNICAÇÃO MCU
I2C – LEITURA
Wire.beginTransmission(endereço);
Wire.write(memoria);
Wire.endTransmission();
Wire.requestFrom(endereço, 1);
byte valor;
if (Wire.available()){
valor=Wire.read();
Wire.endTransmission();
APLICAÇÃO
Quem precisa conectar um display LCD 16×2 ou 20×4 ao Arduino sabe que vai
precisar de pelo menos 6 fios para conexão. Em placas com um número menor de
portas, como o Arduino Uno, isso significa sacrificar algumas portas que poderiam ser
utilizadas para ligação de outros componentes, como sensores ou motores. Um
módulo que pode ser utilizado para contornar esse problema é o módulo I2C para
display LCD com CI PCF8574, disponível em :
https://www.nxp.com/docs/en/data-sheet/PCF8574_PCF8574A.pdf
www.meccomeletronica.com página 6
I2C – PROTOCOLO DE COMUNICAÇÃO MCU
Com esse módulo, você consegue controlar um display LCD, seja ele 16×2 ou 20×4,
utilizando apenas dois pinos do micro controlador.
Grupo de pinos que formam a interface de comunicação I2C.
Na lateral esquerda do módulo temos quatro pinos, sendo que dois são para
alimentação (Vcc e GND), e os outros dois são da interface I2C (SDA e SCL).
www.meccomeletronica.com página 7
I2C – PROTOCOLO DE COMUNICAÇÃO MCU
OBS.: Verificar a posição dos pinos SDA e SCL para cada plataforma utilizada.
http://www.meccomeletronica.com/site/data/uploads/newliquidcrystal_1.3.4-1.zip
www.meccomeletronica.com página 8