Como usar os pinos I2C no Raspberry Pi Pico. Código I2C Scanner

Tempo de leitura: 5 minutes

Visão geral

Neste tutorial, aprenderemos como usar os pinos I2C no Raspberry Pi Pico e passaremos pelo código do scanner I2C. O Raspberry Pi Pico é construído usando um microcontrolador RP2040. A placa expõe 26 pinos GPIO multifuncionais de um total de 36 pinos GPIO. Os 10 pinos GPIO não são expostos, portanto, não podem ser usados. Dos 26 pinos GPIO utilizáveis, há 2 pares de pinos I2C que serão discutidos neste post.

Veremos o que é o protocolo de comunicação I2C e como funciona. Também aprenderemos em detalhes sobre o Pin I2C do Raspberry Pi Pico. Tomaremos o código do scanner I2C como exemplo e verificaremos o endereço I2C de alguns sensores e módulos habilitados para I2C. Antes disso, você pode verificar nosso Tutorial de introdução ao Raspberry Pi Pico para saber mais sobre o módulo.

O que é o protocolo de comunicação I2C

I2C (Inter-Integrated Circuit) é um barramento de comunicação serial síncrono, multi-mestre, multi-escravo, comutado por pacote e terminação única. É amplamente utilizado para conectar CIs periféricos de baixa velocidade a processadores e microcontroladores em comunicação de curta distância dentro da placa.

Como a comunicação UART, o I2C usa apenas dois fios para transmitir dados entre os dispositivos.

Os dois fios são denominados Serial Clock Line (SCL) e Serial Data Line (SDA). Os dados a serem transferidos são enviados por meio do fio SDA e são sincronizados com o sinal de clock do SCL. Todos os dispositivos/ICs na rede I2C estão conectados às mesmas linhas SCL e SDA conforme mostrado acima.

Os dispositivos conectados ao barramento I2C são mestres ou escravos. A qualquer momento, apenas um único mestre permanece ativo no barramento I2C. Ele controla a linha do relógio SCL e decide qual operação deve ser feita na linha de dados SDA.

Todos os dispositivos que respondem às instruções deste dispositivo mestre são escravos. Para diferenciar entre vários dispositivos escravos conectados ao mesmo barramento I2C, cada dispositivo escravo recebe fisicamente um endereço de 7 bits permanente.

Quando um dispositivo mestre deseja transferir dados de ou para um dispositivo escravo, ele especifica o endereço deste dispositivo escravo particular na linha SDA e então prossegue com a transferência. Portanto, a comunicação efetiva ocorre entre o dispositivo mestre e um dispositivo escravo específico. Todos os outros dispositivos escravos não respondem, a menos que seu endereço seja especificado pelo dispositivo mestre na linha SDA.

 

Pins I2C em Raspberry Pi Pico

O chip microcontrolador RP2040 possui dois controladores I2C. Você pode acessar ambos os controladores I2C por meio dos pinos GPIO do Raspberry Pi Pico. A tabela a seguir mostra a conexão dos pinos GPIO com ambos os controladores I2C.

Controlador I2CPinos GPIO
I2C0 – SDAGP0/GP4/GP8/GP12/GP16/GP20
I2C0 – SCLGP1/GP5/GP9/GP13/GP17/GP21
I2C1 – SDAGP2/GP6/GP10/GP14/GP18/GP26
I2C1 – SCLGP3/GP7/GP11/GP15/GP19/GP27

Cada conexão do controlador pode ser configurada por meio de vários pinos GPIO, conforme mostrado na figura. Mas antes de usar um controlador I2C, você deve configurar no software quais pinos GPIO deseja usar com um controlador I2C específico.

 

Características dos pinos Raspberry Pi Pico I2C

O Raspberry Pi Pico possui chip RP2040 que suporta os seguintes recursos:
1. O dispositivo pode funcionar no modo mestre ou escravo com um endereço padrão salve = 0x055
2. Os pinos I2C têm 3 modos de velocidade: Padrão (0 a 100 Kb/s), Modo rápido (<= 400 Kb/s) e Mais rápido (<= 1000 Kb/s)
3. Pode transmitir e receber buffers
4. Também pode ser usado em modo de interrupção e DMA

Como usar os pinos I2C do Raspberry Pi Pico com sensores ou módulos I2C?

Agora vamos aprender como podemos usar o pino I2C do Raspberry Pi Pico com quaisquer outros sensores ou módulos baseados em I2C. Neste caso, podemos usar Raspberry Pi Pico como um dispositivo Mater e outros sensores externos ou módulos como um dispositivo escravo.

Aqui está um circuito onde conectamos 3 dispositivos I2C diferentes ao Pico Board. Os 3 dispositivos são BME680 Sensor, MPU6050 Sensor e 0,96″ OLED Display.

Neste exemplo, conectaremos o pino SDA e SCL do MPU6050, BME680 e display OLED à linha I2C comum do Raspberry Pi Pico. Como existem vários pinos I2C, usaremos apenas um único par de pinos I2C do Raspberry Pi Pico. Usaremos GPIO8 como SDA0 e GPIO9 como SCL0.

 

 

Código do scanner Raspberry Pi Pico I2C

Agora vamos ver o código do scanner I2C com Raspberry Pi Pico. O código é escrito em MicroPython. Você pode usar Thonny IDE ou uPyCraft IDE para conectar o Raspberry Pi Pico ao seu computador.

O código a seguir fará a varredura do endereço I2C de todos os sensores conectados ao pino I2C do Raspberry Pi Pico. Copie o código e faça o download e execute.

import machine
sda=machine.Pin(8)
scl=machine.Pin(9)
i2c=machine.I2C(0,sda=sda, scl=scl, freq=400000)
 
print('Scan i2c bus...')
devices = i2c.scan()
 
if len(devices) == 0:
  print("No i2c device !")
else:
  print('i2c devices found:',len(devices))
 
  for device in devices:  
    print("Decimal address: ",device," | Hexa address: ",hex(device))

Depois de executar o código, o Micropython tentará escanear os dispositivos I2C conectados ao Pico Board. Você pode conectar até 127 dispositivos I2C Slave. O dispositivo irá escanear o endereço e irá mostrá-lo na janela Shell.

1. O endereço I2C do Display OLED é 60 que em hexadecimal é 0x3C
2. O endereço I2C de MPU6050 é 104, que em hexadecimal é 0x68
3. O endereço I2C de BME680 é 119 que em hexadecimal é 0x77