Comunicação I2C no Raspberry Pi

A comunicação por i2c no Raspberry Pi tem limitações, ou pelo não consegui resolver as seguintes limitações que encontrei:

  • Não funciona bem com outros master no bus;
  • No Raspberry Pi B não funciona como slave;

De resto, num ambiente com o Pi master e só com slaves não deve existir problemas.

Pinos do Raspberry Pi

Os pinos disponiveis variam consoante o modelo do Raspberry pi. A imagem abaixo refere-se aos pinos do PI B.  Para outros modelos consultar o link: Pinos do Raspberry.

Pelo que percebi as ligações são diferentes consoante se use o Raspberry Pi como master ou como slave. Se for como master, são usados o GPIO2 e GPIO3 (pinos 3 e 5); se for como slave são usados o GPIO18 e GPIO19 (pinos 12 e 35). Como o pino 35 não existe no Pi B, apenas no B+, então neste modelo do Raspberry Pi não é possivel implementar a comunicação i2c como slave.

Configuração do I2C no Raspberry Pi

Ao contrário do Arduino, que não necessita de configuração. Basta apenas carregar o programa de teste correspondente. O Raspberry Pi necessita de configuração prévia para poder usar a comunicação via i2c.

A configuração do Raspberry Pi para comunicar por i2c divide-se em várias partes.

Parte 1 – Carregar o modulo do kernel

raspi-config
Interfacing Options > I2C (kernel module loading) > Yes
reboot

Usar o seguinte comando para testar se o modulo do kernel foi carregado:
ls /dev/*i2c*

Deve listar:
/dev/i2c-1

Parte 2 – Instalar o pacote de sofware para o i2c

apt-get update
apt-get upgrade
apt-get install i2c-tools

Usar o seguinte comando para testar se o slave é detectado no Raspberry Pi

i2cdetect -y 1

Parte 3 – Instalar os pacotes de sofware para o python

A instalação do python é devida ao software de teste.

apt-get install python-smbus python3-smbus python-dev python3-dev

Parte 4 – Instalar os pacotes de sofware para o C++

A instalação destes pacotes é devida ao software de teste.

apt-get install g++ pigpio

De qualquer forma a exploração da comunicação dos dados via i2c irá requerer algum destes pacotes

Configuração I2C alternativa

Também encontrei um processo de configuração alternativa para a exploração das comunicações i2c no Raspberry Pi com Python.

Instalar modulos

modprobe i2c-dev
modprobe i2c-bcm2708

Verificar

ls /dev/i2c-*

Instalar o pacote de Python necessário

pip install i2cdev

Programa exemplo em Python

from devi2c import I2C
device, bus = 0x42, 0
i2c = I2C(device, bus)
value = i2c.read(1) # read 1 byte
i2c.write(b’some raw data’) # write bytes
i2c.close() # close connection

Programa exemplo em C

https://www.kernel.org/doc/Documentation/i2c/dev-interface

Troubleshoot I2C on Raspberry Pi

Check if the module is not in blacklist
nano /etc/modprobe.d/raspi-blacklist.conf

Comment out any lines with: i2c-bcm2708
#blacklist i2c-bcm2708

Assure that i2c.dev is loaded in modules file:
nano /etc/modules

Check or add this to the end:
i2c-dev

Allow User to Access I2C Devices
adduser user i2c

Comandos Python I2C

Iniciar o python na shell do linux, e depois continuar na shell do python.

python
from smbus import SMBus
bus = SMBus(1)
print bus.read_byte(0x04)
print bus.read_byte_data(0x04, 0x01)
print bus.read_block_data(0x04, 0x01)
print bus.read_i2c_block_data(0x04, 0x01)
bus.write_byte(0x04, 0x05)

 

Links

https://learn.sparkfun.com/tutorials/raspberry-pi-spi-and-i2c-tutorial

How to Work with I2C Communication in Raspberry Pi

https://gpiozero.readthedocs.io/en/stable/
apt install python3-gpiozero

Raspberry GPIO & Python

http://abyz.me.uk/rpi/pigpio/
https://www.raspberrypi.org/documentation/usage/gpio/
https://raspberrypi.stackexchange.com/questions/76109/raspberry-as-an-i2c-slave
https://github.com/hendric-git/bsc-slave

Notas

g++ i2cSlaveTestV1.cpp -lpthread -lpigpio -o i2cSlaveTest

./i2cSlaveTest