Comunicação I2C com Raspberry Pi Pico: Sensores, Memórias e Expansão em Sistemas Embarcados

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:

  • ADC → leitura local
  • PWM → atuação
  • UART → comunicação externa
  • Data logging → persistência

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 — 🠊🠊

Modelos e módulos

Exemplos práticos

  • Usando I2C na Raspberry Pi Pico — 🠊🠊
  • Módulo I2C no Arduino — 🠊🠊