Bus I2C de Raspberry Pi II

@cmdearcos
Grupo TIECs

Empezaré este artículo intentando contestar a una pregunta que me habéis hecho llegar durante estos días: ¿Qué relación tiene la programación en C y el Rasperry PI con la factura eléctrica y las medidas de eficiencia energética?.

Las Tecnologías de la Información, Energía y Comunicaciones tienen dos aspectos básicos:

  • Tanto las TICs como la Energía son materias transversales a todos los sectores. Una solución TIEC tendrá en cuenta el gasto energético tanto de la solución como del resto de los sistemas que interactúen con la solución para conseguir un sistema que cumpla con los objetivos de diseño y que para ello consuma la menor cantidad de energía posible (eficiencia en todos los sentidos).
  • Todas las medidas de eficiencia energética necesitan de las TIC para su control y fiscalización y poder corregir errores en caso de producirse desviaciones de consumo no previstas. No se puede entender la eficiencia energética sin las TIC.

Dicho esto, un Raspberry Pi (RPi) gasta 2W. ¿Veis ahora la relación?. Si una misma aplicación (solución TIC) la podemos hacer “correr” en un RPi tenemos una solución TIEC.

Este artículo quiere ampliar la entrada que hice hace algunos días sobre la configuración del bus I2C. Una vez que tenemos nuestra RPi configurada y con un esclavo conectado a nuestro bus es el momento de comunicarse con dicho esclavo a través de un programa en C.

Todo programa que vaya a utilizar el bus I2C deberá incluir el fichero de cabecera wiringPiI2C.h y a la hora de “lincar” el programa la librería lwiringPi.

Esta librería tiene las siguientes funciones:

int wiringPiI2CSetup (int devId)

Esta función nos devuelve un “file descriptor” que utilizaremos para comunicarnos con el esclavo y que necesitaremos en el resto de funciones. devld es la dirección del esclavo que podemos sacar o de la documentación del mismo o al ejectutar el comando i2cdetect como explicamos en el artículo anterior.

add = 0x39;

fd = wiringPiI2CSetup (add);

Esta función devuelve -1 si no puede abrir las comunicaciones o el descriptor de fichero si todo ha ido correctamente.

Una vez que tenemos abierta las comunicaciones solo podemos hacer dos cosas: leer datos de los esclavos y escribir datos en los algunos registros del esclavos.

int wiringPiI2CRead (int fd)

Esta es la función básica de lectura. No todos los esclavos permiten esta función.

int wiringPiI2CWrite (int fd, int data)

Esta es la función básica para escribir un dato en un esclavo. data es el dato que se quiere escribir en el esclavo. No se especifica ningún registro del dispositivo y no todos los esclavos permiten esta función.

También es posible leer el valor de registros de los dispositivos. El valor de dichos registros y el dato que devuelve (especialmente su tamaño) deben venir especificados en la documentación del esclavo. Las funciones que lo posibilitan en casa caso son:

int wiringPiI2CReadReg8 (int fd, int reg)

int wiringPiI2CReadReg16 (int fd, int reg)

donde reg es la dirección del registro.

Por último también podemos escribir datos en un registro concreto, por ejemplo, para configurar el funcionamiento del esclavo. Al igual que ocurría con las de lectura tenemos dos funciones según el registro necesite 1 o 2 bytes. Las funciones son las siguientes:

int wiringPiI2CWriteReg8 (int fd, int reg, int data)

int wiringPiI2CWriteReg16 (int fd, int reg, int data)

La dirección de los registros son diferentes en cada esclavo y deben venir especificadas en la documentación para poder comunicarse con él.

Con estas 7 funciones podemos controlar y comunicarnos con un esclavo a través del bus I2C. A modo de ejemplo os dejo la documentación de un adaptador serie/I2C de un Nuchuck “de la Wii”, cuyo ejemplo en python podéis ver en esta entrada. En C habría que realizar el “mismo” programa pero con las funciones que os he comentado en este artículo.

Todo un nuevo mundo de posibilidad se abre a nuestra RPi con este bus. Ahora a disfrutar!!!.

@cmdearcos
Grupo TIECs

Deja un comentario

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