Python: I2C, uso y configuración

Configuración del periférico I2C en Raspbian para la Raspberry Pi

 

I2C SONY DSC
Sensor touch pad shield 9/12 Canales MPR121 COMPRAR

 

 

Para comenzar a utilizar el protocolo I2C es necesario realizar una serie de pasos que a continuación se explicaran de manera clara y sencilla. Cabe señalar que este proceso solo se realiza una sola vez siempre y cuanto se mantenga el mismo sistema operativo.

El protocolo I2C ha ganado un gran terreno en los últimos años, esto debido a que hoy en día es el protocolo de comunicación preferido para dispositivos sensores, relojes de tiempo real, memorias entre otros.

Estos pasos solo son validos para Raspbian, revisa el SO que estas utilizando ya que hay unos que vienen listos para usar el I2C, de cualquier manera se recomienda actualizar la versión del SO que se este utilizando. Para comenzar abrimos la terminal y escribimos el siguiente comando:

 

[code language=»bash»]
sudo nano /etc/modules
[/code]

 

se abrirá un archivo, tenemos que añadir estas 2 lineas de código al final del archivo:

[code language=»bash»]
i2c-bcm2708
i2c-dev
[/code]

 

Una vez agregadas las lineas previamente mencionadas, procedemos a guardar el archivo y a reiniciar la raspberry pi.

Para poder usar instrucciones de i2c es necesario instalar las siguientes instancias, esto lo haremos escribiendo en la terminal:

[code language=»bash»]
sudo apt-get install python-smbus
sudo apt-get install i2c-tools
[/code]

 

posteriormente vamos a escribir:

[code language=»bash»]
sudo nano /etc/modprobe.d/raspi-blacklist.conf
[/code]

 

y comentamos las 2 lineas, tiene que quedar asi:

[code language=»python»]
#blacklist spi-bcm2708
#blacklist i2c-bcm2708
[/code]

 

Para guardar y salir podemos usar CTRL-x y Y.

Una vez que se hayan realizado los pasos previos podemos escribir en la terminal:

[code language=»bash»]
sudo i2cdetect -y 1
[/code]

 

Esta instrucción, realizara un barrido de las direcciones y desplegara la misma una vez encuentre algún dispositivo. OJO! si no te funciona prueba con un «-y 0» envés de «-y 1», esto significa que tienes una revisión pasada de la rapsberry pi, en la nueva revisión se usa el puerto I2C 1 del hardware.

[code language=»bash»]
pi@raspberrypi ~ $ i2cdetect -y 1
0 1 2 3 4 5 6 7 8 9 a b c d e f
00: — 04 — — — — — — — — — — —
10: — — — — — — — — — — — — — — — —
20: — — — — — — — — — — — — — — — —
30: — — — — — — — — — — — — — — — —
40: — — — — — — — — — — — — — — — —
50: — — — — — — — — — — — — — — — —
60: — — — — — — — — — — — — — — — —
70: — — — — — — — —
[/code]

 

I2C detect es una función extremadamente útil para probar nuestros dispositivos y/o validar si están bien conectados a nuestra raspberry pi. existen otras funciones que pueden ser de gran ayuda, en este caso no se veran ya que la idea es trabajar el I2C con scripts de pyton pero si estas interesado puedes comenzar con:

 

[code language=»bash»]
i2cget -y 1 <DIRECCIÓN DEL DISPOSITIVO> <REGISTRO> <MODO>
i2cset -y 1 <DIRECCIÓN DEL DISPOSITIVO> <REGISTRO> <MODO> <DATO>
[/code]

 

En donde, la dirección tiene que ir en hexadecimal (0x) a 7 bits, el registro en formato hexadecimal también, el modo, refiere al tipo de dato, b para byte u 8 bits y w para word o 16 bits. El dato el el valor a escribir para el i2cset.

 

Para mayor información de los comandos en terminal: http://www.lm-sensors.org/wiki/i2cToolsDocumentation

 

Funciones I2C SMBUS para Python

SMBus es una configuración del protocolo I2C, pro razones de compatibilidad es recomendable utilizar solamente las funciones de SMBus para controlar dispositivos I2C (Aunque en la mayoría de estos es indistinto el uso de las mismas).

 

[code language=»python»]
long write_quick(int addr)
[/code]

Solo envía la dirección con el bit de lectura/escritura.

 

[code language=»python»]
long read_byte(int addr)
[/code]

Lee un solo byte del dispositivo sin especificar el registro del dispositivo.

 

[code language=»python»]
long write_byte(int addr,char val)
[/code]

Enviar un byte al dispositivo,

 

[code language=»python»]
long read_byte_data(int addr,char cmd)
[/code]

Leer un byte del dispositivo.

 

[code language=»python»]
long write_byte_data(int addr,char cmd,char val)
[/code]

Escribir en el dispositivo.

 

[code language=»python»]
long read_word_data(int addr,char cmd)
[/code]

Leer un word o 2 bytes del dispositivo.

 

[code language=»python»]
long write_word_data(int addr,char cmd,int val)
[/code]

Escribe un word o 2 bytes en el dispositivo.

 

[code language=»python»]
long[] read_block_data(int addr,char cmd)
[/code]

Leer un bloque de datos.

 

[code language=»python»]
long[] read_i2c_block_data(int addr,char cmd)
[/code]

Leer un bloque de datos.

 

[code language=»python»]
write_i2c_block_data(int addr,char cmd,long vals[])
[/code]

Escribir un bloque de datos.

4 comentarios en «Python: I2C, uso y configuración»

  1. Buenas. La biblioteca BlackLib funciona para códigos en c? Además estoy buscando como implementar un canal I2C en C con la BeagleBone Black para comunicación con sensores externos. Algún tutorial? Gracias

  2. Buenos días. Estoy tratando de controlar en mi Raspberry PI 3 modelo B, un gyroscopo y acelerómetro (mpu60650) con el protocolo I2C. Inicio los pasos que se indican en este blog y cuando pongo sudo i2cdetect -y 1 obtengo un mensaje de error: Ettor Could not open file ‘/dev/i2c-1’ or ‘/dev/i2c/1’:No such file or directory.
    No se cual podrá ser el problema.
    Gracias.

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *