Após consolidar controle digital, leitura analógica, controle de potência e comunicação serial, o próximo passo em arquitetura embarcada é a expansão modular via barramento.
O protocolo I2C permite exatamente isso: conectar múltiplos dispositivos com mínima complexidade física.
O que é I2C
I2C (Inter-Integrated Circuit) é um protocolo de comunicação síncrona que utiliza apenas dois fios:
- SDA → dados
- SCL → clock
Características Operacionais
- Arquitetura mestre-escravo
- Endereçamento único por dispositivo
- Suporte a múltiplos periféricos no mesmo barramento
Inicialização no Raspberry Pi Pico
from machine import Pin, I2C
i2c = I2C(0, scl=Pin(9), sda=Pin(8), freq=100000)
Descoberta de Dispositivos
print(i2c.scan())
Resultado esperado:
- Lista de endereços ativos no barramento
- Base para validação física da conexão
Projeto 1: Expansor de GPIO (MCP23017)
Expande o número de portas digitais disponíveis.
from machine import Pin, I2C
import utime
i2c = I2C(0, scl=Pin(9), sda=Pin(8))
DEVICE = 0x20
IODIRA = 0x00
GPIOA = 0x12
i2c.writeto_mem(DEVICE, IODIRA, b'\x00')
while True:
i2c.writeto_mem(DEVICE, GPIOA, b'\x01')
utime.sleep(1)
i2c.writeto_mem(DEVICE, GPIOA, b'\x00')
utime.sleep(1)
Ponto técnico:
- Escrita em registradores internos
- Controle indireto de hardware externo
Projeto 2: EEPROM (Persistência Externa)
Permite armazenamento não volátil fora do microcontrolador.
Escrita
def Write(memloc, data):
i2c.writeto_mem(0x50, memloc, data, addrsize=16)
Leitura
def Read(memloc, length):
return i2c.readfrom_mem(0x50, memloc, length, addrsize=16)
Uso
Write(0x1000, b'1234')
data = Read(0x1000, 4)
print(data)
Aplicação:
- Data logging persistente
- Configuração de sistemas
- Armazenamento de estados
Projeto 3: Sensor TMP102
Leitura direta de temperatura via I2C.
from machine import I2C, Pin
i2c = I2C(0, scl=Pin(9), sda=Pin(8))
def read_temp():
data = i2c.readfrom_mem(0x48, 0x00, 2)
temp = (data[0] << 4) | (data[1] >> 4)
return temp * 0.0625
while True:
print(read_temp())
Projeto 4: Sensor BMP280 (Alta Precisão)
data = i2c.readfrom_mem(0x76, 0xF7, 8)
adc_t = ((data[3] << 16) + (data[4] << 8) + (data[5] & 0xF0)) >> 4
adc_p = ((data[0] << 16) + (data[1] << 8) + (data[2] & 0xF0)) >> 4
Características:
- Leitura multi-byte
- Reconstrução de dados brutos
- Conversão baseada em calibração interna
Projeto 5: Integração Sensor + Display
import bmp280
import LCD
LCD.lcd_init()
while True:
T, P = bmp280.BMP280()
LCD.lcd_clear()
LCD.lcd_puts("T=" + str(T)[:5] + " C")
LCD.lcd_goto(0,1)
LCD.lcd_puts("P=" + str(P)[:6] + " hPa")
Arquitetura completa:
- Entrada → sensor
- Processamento → conversão
- Saída → display
Operações Fundamentais
Escrita
i2c.writeto_mem(addr, reg, data)
Leitura
i2c.readfrom_mem(addr, reg, nbytes)
Endereçamento
Cada dispositivo possui um endereço único (ex: 0x48, 0x50, 0x76)
Boas Práticas
Uso de Pull-ups
- Resistores (~10kΩ) em SDA e SCL
- Essenciais para estabilidade do barramento
Validação do Barramento
print(i2c.scan())
Sempre validar antes de operar.
Frequência Segura
freq=100000
Evita problemas de comunicação em prototipagem.
Arquitetura de Sistema Real
Com I2C, o sistema se torna modular:
- Múltiplos sensores
- Expansão de IO
- Memória externa
- Interfaces visuais
Tudo compartilhando o mesmo barramento.
Integração com o Ecossistema
I2C conecta diretamente com os blocos já dominados:
Insight Técnico Final
I2C não é apenas um protocolo — é um mecanismo de escalabilidade.
Permite transformar um sistema simples em uma arquitetura distribuída com múltiplos dispositivos, mantendo baixo custo e simplicidade de conexão.
Encerramento Geral
Com este capítulo, o conjunto está completo:
- Entrada (ADC, sensores)
- Processamento (lógica)
- Saída (GPIO, PWM)
- Comunicação (UART, I2C)
- Persistência (arquivos, EEPROM)
Isso define a base funcional de sistemas embarcados modernos.
Sites de Referência
Protocolo
Fornecedores
- Mouser I2C CIs de interface — 🠊🠊
- Mouser microcontroladores com I2C — 🠊🠊
- Eletrogate módulo I2C LCD — 🠊🠊
- Saravati adaptador I2C LCD — 🠊🠊
