Páginas

sábado, 18 de enero de 2014

Expandiendo las Entradas y Salidas Digitales de Raspberry Pi con el MCP23008

En una entrada anterior en este blog (ver Reloj en tiempo real para Raspberry Pi) se explicaba de qué manera podíamos dotar al potente RaspPi de un reloj en tiempo real (RTC), ausente del mismo, cuando se nos antojaba que era un defecto fácilmente mejorable, y a un coste mínimo y asumible por cualquiera. Sí, seguro que en los primeros diseños de la RaspPi alguien pensaría en dotarle de un reloj en tiempo real, pero con la mente fija en minimizar costes, otro alguien diría que la puesta de fecha y hora podía ser más eficaz si la obtenía de Internet accediendo a un servidor NTP. Pero, no siempre podemos estar seguros de que cuando arranque el RaspPi tengamos operativo el acceso a Internet, y fue por esta razón que implementamos este módulo.
Otra limitación patente del hardware la RaspPi es el reducido número de entradas/salidas digitales (E/S), y de todo tipo. En la versión 2 de la RaspPi disponemos de un conector GPIO P1, de 2x13 pines, y la posibilidad de soldar otro, el conector P5, de 2x4.
En esta entrada expondremos el modo de ampliar de forma casi ilimitada el número de entradas y salidas digitales, utilizando el circuito integrado (CI) MCP23008, circuito que está dimensionado para manejar 8 E/S digitales. Esta misma solución la podemos extender fácilmente para que maneje 16 E/S digitales, sustituyendo el circuito por el MCP23017. Los circuitos integrados MCP23S08 y MCP23S17 utilizan el interfaz SPI en lugar del i2c.
En el esquema podemos observar, junto al módulo de reloj en tiempo real, desarrollado en la entrada anterior,  el módulo objeto de esta entrada: el interfaz de entradas/salidas digitales que en este caso se han configurado todas las 8 patillas de salida, permitiéndonos controlar individualmente el estado de los leds rojos.

Diseño y montaje del módulo de E/S digitales

Previo al montaje físico en una protoboard, he utilizado el programa Fritzing para realizar el diseño y montaje virtual del módulo, utilizando los siguientes componentes:

  • 1 MCP23008 (empaquetado DIL18)
  • 8 resistencias de 330 ohmios
  • 8 leds
  • conector de expansión (desarrollado por mi) para conexión de la protoboard al RaspPi. Ver entrada anterior en este blog (Conectando la Raspberry Pi a una protoboard)
En cuanto al código de colores utilizado por los conductores de este montaje:
  • Verde (SDA) y Rosa (SCL) corresponden al bus i2c.
  • Rojo a la alimentación de 5V, que se toma del conector de 2x13 pines. 
  • Negro, para puesta a tierra  (GND)
  • Azul conectan las patillas de entrada/salida del MCP23008 a las 8 resistencias de 330 ohmios.

IMPORTANTE: La patilla de RESET del MCP23008 debe ponerse a la tensión de alimentación del mismo. La no consideración de esta patilla puede hacerte perder mucho tiempo, como fue éste mi caso, que, por despiste y olvido, dejé la patilla al aire, sin conexión, y el módulo no me era reconocido por la RaspPi.
Las dos líneas del bus i2c están conectadas mediante unas resistencias de 1,8 kohms a la tensión de 3.3V de las RaspPi. Para el resto, utilizo la alimentación de 5V disponible en los pines 2 y 4 del conector P1 de 2x13 pines.
A partir del diseño virtual en Fritzing, pasamos a montarlo físicamente, comprobando que los conductores unen las distintas partes de acuerdo al diseño, y a implementar la parte de software requerido para la gestión del bus i2c en la Raspberry Pi.
CON EL EQUIPO SIN TENSIÓN DE ALIMENTACIÓN, conectamos la protoboard a la tarjeta RaspPi uniendo los dos conectores de 2x13 pines mediante un cable plano de 26 conductores.

Librerías a instalar en la Raspberry Pi

En principio, lo indicado en la entrada  Reloj en tiempo real para Raspberry Pi de este mismo blog es lo que podemos utilizar para instalar las librerías que requerimos en este nuevo caso. Por lo que recomiendo leer previamente esta entrada y seguir las instrucciones de instalación de librerías.

Manejando el MCP23008

Vamos a utilizar las mismas librerías descargadas en la entrada anterior, y programaremos el ejemplo en el lenguaje C.
La hoja de datos del circuito integrado nos permite averiguar el funcionamiento del mismo. Y basándonos en la misma vamos a tratar de controlar las patillas de salida.
Lo primero a tener en cuenta es la dirección del chip. En nuestro caso, al poner las tres patillas de direccionamiento a cero (A0,A1,A2), responderá a la dirección 0x20.
El MCP23008 tiene un total de 11 registros, a los que podemos acceder a través del interfaz i2c.
Para manejar estos registros, podemos utilizar las instrucciones i2cget e i2cset, que están disponibles al instalar la librería i2c-tools.
i2cget -y 1 0x20 REGISTRO
i2cset -y 1 0x20 REGISTRO VALOR
Aplicando estas instrucciones podremos observar el comportamiento del terminal de comandos y el estado de los LEDs conectados al MPC23008. Donde pone REGISTRO hay que poner la DIR (00h-0Ah) y en VALOR el que queremos que tenga el registro direccionado.
La primera instrucción, i2cget -y 1 0x20 0 , accede al registro IODIR, lee su estado, nos devuelve 0xff, lo que nos está diciendo que las patillas de E/S están en modo de Entrada.
La siguiente instrucción, i2cset -y 1 0x20 0 0x00 , pone todos los bits del registro IODIR a cero, con lo que estamos poniendo todas las patillas de E/S como Salidas.
La instrucción  i2cset -y 1 0x20 0x0A 0xff  enciende todos los LEDs conectados la MCP23008, mientras que la última, i2cset -y 1 0x20 0x0A 0x00  los vuelve a apagar.
Una vez que hemos experimentado con el montaje y las instrucciones de la librería i2c-tools vamos a realizar el programa que irá encendiendo y apagando de forma aleatoria los 8 LEDs conectados al MCP23008. El tiempo que se mantendrán encendidos lo p.asaremos, en milisegundos, como parámetro al programa.

El programa mcp23008aleatorio

En el apartado de enlaces se encuentra el enlace que apunta al fichero comprimido mcp23008aleatorio.rar. Hay que descomprimirlo, creándose una carpeta en donde lo hubiéramos descargado.
cd <carpeta en donde hemos descargado mcp23008aleatorio.rar>
unrar x mcp23008aleatorio.rar
cd mcp23008aleatorio
y al entrar en la carpeta, encontraremos los dos ficheros que necesitamos para generar el ejecutable:
mcp23008aleatorio.c
makefile
ejecutamos la sentencia desde un terminal, en la propia carpeta
make all
lo que nos generará un ejecutable, mcp23008aleatorio, que podremos ejecutar, desde un terminal y posicionados en su carpeta, de la siguiente manera:
./mcp23008aleatorio 150
si nos fijamos en los LEDs del montaje veremos que se encienden y apagan, varios a la vez, de forma aleatoria, mientras que en el terminal de comandos aparece línea tras línea, el registro y el valor que se envía al registro.
Del programa fuente, es importante resaltar el valor que hay que escribir en el registro IODIR. Para dejar el puerto del MCP23008 con todos los bits de salida, hay que escribir el valor 0x00. Si quisiéramos que el bit 1, 5 y 7 fueran de entrada y el resto de salida, escribiríamos el valor 0xA2, que corresponde el binario b10100010. Debemos tener en cuenta que el bit menos significativo es el bit 0, y el más significativo es el bit 7.
He añadido otro ejemplo, mcp23008contador.rar, que no aporta realmente nada nuevo al ejemplo anterior. Es una variación de la estructura anterior. El programa va incrementado un contador, el que se utiliza para ir encendiendo los LEDs del montaje.

Enlaces

- MCP23008/MCP230S8 datasheet
- MCP23017/MCP23S17 datasheet
- RPi Low-level peripherals
- Using MCP23008 8-bit I2C IO Expander on the Raspberry Pi
- dev-interface
- Using I2C from userspace in Linux
- Conectando la Raspberry Pi a una protoboard
- I2CTools – lm-sensors
- I2C and ISA Tools Documentation
- SMBus - System Management Bus
- How can I use I2C to talk to sensors?
- I2C (Inter-Integrated Circuit) Bus Technical Overview and Frequently Asked Questions
- I²C :: NXP
- SMBus Specifications
- mcp23008aleatorio.rar
- mcp23008contador.rar


No hay comentarios:

Publicar un comentario