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)
- 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.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
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
mcp23008aleatorio.c makefile
make all
./mcp23008aleatorio 150
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