Trasteando con la Raspberry Pi - I2C & SPI

Bueno, esta bastante claro que para ciertos usos de bajo nivel, la RPi no sirve, como leer señales analógicas o generar pulsos pwm.
Para este tipo de trabajos se necesitan dispositivos externos (o un microcontrolador) y una de las formas más comunes con las que estos dispositivos -y muchos sensores- se comunican es mediante comunicación serie sincrona -con la señal de reloj compartida- y los buses más habituales de este tipo son el SPI y el I2C que sí que están disponibles en la RPi.

-- Esto es a partir de la imagen 2012-07-15-wheezy-raspbian --

Para usar el I2C es necesario cargar dos módulos (ya vienen en raspbian, no hay que bajar nada)
$ sudo modprobe i2c-bcm2708
$ sudo modprobe i2c-dev

Pero la primera vez hay que eliminar de la lista negra el primero, i2c-bcm2708, editando  /etc/modprobe.d/raspi-blacklist.conf

Para cargar siempre el modulo al inicio, añadir  'i2c-dev' en /etc/modules
También es útil es útil instalar las i2ctools
$ sudo apt-get install i2c-tools

Se pueden listar los dispositivos conectados al puerto i2C desde la linea de comandos mediante
$  sudo i2cdetect -y 0

Para usar el I2C con python hay que incluir el modulo python-smbus, disponible en el repositorio de raspbian, la  documentacion aqui

La forma en la que lo he probado ha sido con el  magnetometro hmc5883 conectado y alimentado directamente en el gpio con direccion 0x1e (se puede ver si esta disponible con el i2cdetect)

Es necesario ejecutar python como su o dar permisos con
$ sudo chmod a+rw /dev/i2c*

El código para hablar con el magnetometro es...

import smbus
i2c0=smbus.SMBus(0)    #asocia el bus 0 de i2c - el del GPIO
i2c0.read_byte_data(0x1e,0x03)     #lee el registro 0x03
i2c0.write_byte_data(0x1e,0x02,0)    #escribe un 0 en 0x02

------

Para usar el bus SPI es necasario actualizar el firmware de la rpi (el raspbian de base no monta los buses spi) con rpi-update -info aqui-  y reiniciar.

-Se puede ver si los buses spi estan montados listando /dev/, tiene que aparecer los dispositivos spidev0.0 y spidev0.1

No lo he podido probar aun -no tengo nada con SPI por aquí ahora mismo-, pero según he podido leer basta con escribir y leer en /dev/spidev0.x para comunicarse.. parece que no es necesario nada especial....



No hay comentarios: