Pages Menu
TwitterFacebook



BANNER2_ALT

Posted by on May 2, 2014 in Raspberry Pi | 2 comments

Python: I2C, uso y configuración

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:

 

sudo nano /etc/modules

 

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

i2c-bcm2708
i2c-dev

 

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:

sudo apt-get install python-smbus
sudo apt-get install i2c-tools

 

posteriormente vamos a escribir:

sudo nano /etc/modprobe.d/raspi-blacklist.conf

 

y comentamos las 2 lineas, tiene que quedar asi:

#blacklist spi-bcm2708
#blacklist i2c-bcm2708

 

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

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

sudo i2cdetect -y 1

 

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.

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

 

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:

 

i2cget -y 1 <DIRECCIÓN DEL DISPOSITIVO> <REGISTRO> <MODO>
i2cset -y 1 <DIRECCIÓN DEL DISPOSITIVO> <REGISTRO> <MODO> <DATO>

 

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

 

long write_quick(int addr)

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

 

long read_byte(int addr)

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

 

long write_byte(int addr,char val)

Enviar un byte al dispositivo,

 

long read_byte_data(int addr,char cmd)

Leer un byte del dispositivo.

 

long write_byte_data(int addr,char cmd,char val)

Escribir en el dispositivo.

 

long read_word_data(int addr,char cmd)

Leer un word o 2 bytes del dispositivo.

 

long write_word_data(int addr,char cmd,int val)

Escribe un word o 2 bytes en el dispositivo.

 

long[] read_block_data(int addr,char cmd)

Leer un bloque de datos.

 

long[] read_i2c_block_data(int addr,char cmd)

Leer un bloque de datos.

 

write_i2c_block_data(int addr,char cmd,long vals[])

Escribir un bloque de datos.

2 Comments

  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

Post a Reply

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