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