Diseñando el hardware

En esta cuarta entrega por fin vamos a empezar a ver cómo trabajará nuestro hardware. Veremos una breve introducción al sistema de entradas y lectura del bus I2C, y nos meteremos de lleno al diseño físico tanto del hardware como del software.

Diagrama conceptual

Recuperando de la anterior publicación el esquema conceptual de nuestra botonera, tendremos presente el conexionado que vemos mas arriba. Vemos que el corazón de la comunicación es básicamente el bus I2C. ¿Por qué? Ahora lo veremos…

Vamos a ello!

 

El bus I2C y por qué lo hemos elegido

Como comentábamos en publicaciones anteriores, 36 entradas es un número muy elevado de entradas para poder manejarlo de forma “sencilla” con un Arduino. Normalmente, sistemas con entradas en matriz de hasta 4×4 podemos manejarlos gracias al uso de 8 pins de forma simultánea… Pero esto es un precio demasiado elevado para nosotros… 36 entradas aumentaría considerablemente este coste en el uso de pins, que no podemos acometer…

Para saber de qué estamos hablando exactamente, miremos este esquema del conexionado en matriz de 8 botones (4×4):

Matriz de b

Esta imagen es original del genial blog de Luís Llamas, que recomiendo consultar para obtener una buena base en Arduino, y otras tecnologías. Para saber cómo funciona dicho sistema de botonera en matriz, podéis pasaros por su blog en esta dirección: https://www.luisllamas.es/arduino-teclado-matricial.

Una vez lo hayáis consultado veréis claramente por qué a nosotros no nos sirve esta técnica

Volviendo a nuestra necesidad, recordemos: 36 entradas.

Como ya vimos en la entrada anterior, existe un bus de comunicación que os ofrece una herramienta perfecta a nuestro problema. Es el estándar I2C. Con 2 hilos de comunicación, y diversos dispositivos interconectados entre sí, podemos conseguir aumentar de forma muy considerable nuestro número de entradas. Y no necesariamente será mucho mas caro, gracias a que actualmente los dispositivos electrónicos son muy baratos, a parte de ir en su mayoría ya integrados en placas de circuito impreso.

Así pues, usaremos el bus I2C como bus de comunicación entre nuestras entradas y Arduino.

Pero ahora hace falta saber qué dispositivo va a manejar estas entradas…

 

Expansor de entradas y salidas para bus I2C: el versátil PCF8574

Descripción

El circuito integrado PCF8574 es de Texas Instruments. Se trata de un expansor IO de 8 bits (8 pins configurables como entrada o salida).

 

Sin entrar mucho en detalle, porque de esta parte nos abstraemos completamente al usar la plaquita que veréis mas abajo, si os quiero dar unas cuantas anotaciones a cerca del patillaje del circuito:

  • pines de dirección: A0, A1 y A2, en total 3 bits, que nos permiten hasta 2^3 posibles direcciones, hasta 8 dispositivos, comenzando por la dirección 0x38
  • pines de datos: P0 a P7, en total 8 pines configurables como entrada / salida
  • pin de interrupción: INT, de lógica negada, lanza un pulso de flnco descendiente cada vez que hay un dato de entrada en alguno de sus pins (no lo usaremos)
  • pines de datos: SCL / SDA, comunicación I2C
  • pines de alimentación: Vcc y GND

Mas adelante veremos cómo debemos conectar cada uno de estos pins.

Solución a la implementación completa del PCF8574

Para nuestro proyecto vamos a usar el PCF8574 montado en una tarjeta expansora de entradas y salidas como la siguiente:

¿Por qué usar esta placa? El motivo es sencillo: es muy muy barata y fácil de usar. Además, en contra de lo que otras placas del estilo ofrecen, esta nos permite interconectar cuantas necesitemos simplemente enchufándolas mediante los conectaros de expansión de los que dispone. Existen otras placas parecidas, pero la versatilidad que nos da esta por tener la expansión del puerto I2C que permite interconectar mas placas es muy atractiva. 

En definitiva, lo que haremos será configurar tantos dispositivos expansores interconectados como nos sean necesarios en nuestro bus de datos I2C. En nuestro caso serán 5, ya que necesitamos 36 entradas digitales (36 / 8 = 4,5).

Dichos dispositivos serán accesibles, como ya comentamos, mediante las direcciones:

  • PCF8574_0: 0x38
  • PCF8574_1: 0x39
  • PCF8574_2: 0x40
  • PCF8574_3: 0x41
  • PCF8574_4: 0x42

Y se les otorgará las siguientes entradas (indistintamente de su tipo, pulsadores, interruptores, etc):

  • PCF8574_0: I00 a I07 (8 entradas)
  • PCF8574_1: I10 a I17 (8 entradas)
  • PCF8574_2: I20 a I27 (8 entradas)
  • PCF8574_3: I30 a I37 (8 entradas)
  • PCF8574_4: I40 a I43 (4 entradas)

Nótese, por convención, la nomenclatura de 0 a 4 de los dispositivos, heredada por cada uno de sus pines, desde el I0X hasta el I4X.

Finalmente, si necesitásemos algún dispositivo con salidas, podríamos usar las disponibles del PCF8574_4, así como otros dispositivos adicionales añadidos posteriormente.

 

Usando los expansores como entradas

Como os comentaba, los expansores PCF8574 pueden ser usados como entradas, salidas o ambos tipos al mismo tiempo. Esto ya lo veremos mas adelante en la sección de programación.

Ahora lo que necesitamos comprender es cómo deberemos conectar nuestros pulsadores e interruptores para que Arduino pueda reconocerlos.

Las entradas digitales en Arduino y, en general, en todos los microcontroladores, se pueden configurar para leer flanco ascendente o por flanco descendente. Es decir, activaremos la entrada pasando de 0 a 1 o de 1 a 0. Normalmente, por conveniencia y lógica, nosotros trabajaremos con flanco ascendente o pulso positivo, que es lo mas parecido a pulsar o activar un interruptor que estaba apagado. Hay casos en los que es mejor usar el otro caso, por motivos de eficiencia y diseño.

Vamos a dar una pequeña explicación de en qué se basa cada uno de ellos, y cómo se implementa en el mundo Arduino.

 

Lectura del flanco descendente, uso de la “resistencia pull-up”

Cuando se desea usar el dato de entrada como flanco descendente, o detección de 0, usaremos esta implementación. Un caso práctico para su uso podría ser la detección de paso o apertura de una puerta, en la que el sensor está enviando continuamente un 1, y al abrir el circuito, la señal cae a 0.

Resistencia pull-up

El diagrama muestra la configuración de una resistencia pull-up.

Se trata de una resistencia que se conecta a Vcc (en Arduino puede ser 5V o 3,3V) y a un pulsador o interruptor que deriva a masa o GND. En el punto intermedio entre ambos elementos, a modo de divisor de tensión, disponemos de la salida de señal digital que excitará nuestra entrada digital del dispositivo o microcontrolador, denominada Digital Input en el diagrama.

Su funcionamiento es el siguiente: si el pulsador está abierto, la corriente en el punto Digital Input es alta. Es decir, en reposo tenemos 5V (un 1 lógico). Al pulsar y cerrar el circuito, el punto Digital Input se conecta directamente a masa, con lo que lo tenemos conectado a GND (0 lógico).

La resistencia se denomina pull-up, y suele tener valores que van desde los 4k7 ohm a los 10k ohm, para que su carga sea la correcta en funcionamiento. Su finalidad es asegurar la señal en el punto deseado.

De este modo conseguimos un circuito lógico negado: al presionar el pulsador conseguiremos un flanco negativo en la entrada digital.

 

 

Lectura del flanco ascendente, uso de la “resistencia pull-down”

Por otro lado, podemos necesitar que el dato de entrada sea por flanco ascendente, o lo que es lo mismo, detección de 1 lógico. Este tipo de detección es más usual y concuerda con el día a día. Por ejemplo, si pensamos en el simple caso de un timbre. Al pulsar, cerramos el circuito y damos un 1 lógico al timbre. 

El diagrama muestra la configuración de una resistencia pull-down.

Se trata de una resistencia que se conecta a GND (0V) y a un pulsador que obtiene los 5V desde Vcc. Cuando el pulsador cierra el circuito, el punto Digital Input recibe los 5V de forma directa, obteniendo así el 1 lógico que deseamos.

La funcionalidad de la resistencia es que “la entrada lógica no quede al descubierto”, ya que pueden generarse falsos positivos (por temas de conducción eléctrica residual o de ambiente, por ejemplo). Así que esta resistencia lo que está haciendo es mantener el punto Digital Input a 0V mientras el pulsador esté abierto (es muy importante tener esto en cuenta para futuros montajes).

La resistencia se denomina pull-down, y suele tener valores que van desde los 4k7 ohm a los 10k ohm, para que su carga sea la correcta en funcionamiento. Su finalidad es asegurar la señal de 0 lógico en el punto deseado, y la de no permitir el paso de la corriente cuando se cierre el circuito, de modo que se deriven los 5V de forma completa hacia la Digital Input.

De este modo conseguimos un circuito lógico directo: al presionar el pulsador conseguiremos un flanco positivo en la entrada digital.

 

Selección del tipo de entrada

Una vez que sabemos cuáles son las diferentes implementaciones que podemos adoptar para atacar las entradas de nuestro sistema, debemos decidir cuál de ellas es la que mas nos interesa.

Como ya dije anteriormente, en mi diseño quiero que sea la señal de 1 lógico la que active las entradas, o al menos es lo que deseo en la mayoría de los casos. Ahora mismo no recuerdo cuál sería el caso que nos obligara a seleccionar una señal por flanco descendiente, pero podría darse el caso. De cualquier modo, seamos conscientes que en uno u otro caso podemos diferenciar el paso de 0 a 1 y viceversa de forma sencilla.

En conclusión, nosotros usaremos la activación por flanco ascendente.

Por lo tanto, ya sabemos que todas y cada una de nuestras entradas usarán un montaje de resistencia pull-down, dónde el punto de Digital Input dará un 1 lógico como señal de activación. En Arduino deberemos tratar ese cambio de estado para saber que la entrada ha sido activada. Más adelante veremos que quizá nos interese ver si ese 1 se mantiene o bien es momentáneo. Pero eso ahora mismo no nos preocupa.

Quiero hacer constar que la mayoría de los micro controladores que actualmente hay en el mercado permiten seleccionar el tipo de entrada ya directamente como pull-down o pull-up. Esto significa que en tiempo de configuración, le decimos que implementación queremos usar en el pin de entrada seleccionar. Internamente el microcontrolador ya contiene estas implementaciones y nosotros no tendremos que construirlas de forma externa. Tan sólo aplicaremos la señal que nos convenga en el pin seleccionado. Desgraciadamente, es algo que nuestro PCF8574 no incorpora, y por eso tendremos que construirlo para cada una de las entradas….

Esquema electrónico preliminar

Este sería nuestro montaje para cada uno de los dispositivos PCF8574 con entradas digitales:

Conexión del PCF8574_0

Como se puede ver, tenemos el dispositivo PCF8574_0, que es nuestro primer expansor de entradas / salidas, y el conexionado pertinente con las 8 entradas, en montaje de resistencia pull-dow.

Con este esquema ya podemos empezar a montar nuestro primer prototipo de hardware:

Prototipo de conexionado del PCF8574_0

En la foto podemos ver el Arduino Pro Mini (clon del Sparkfun) que compré para hacer el test, una tarjeta de prototipo para montajes con PCF8574, y hasta 5 entradas por pulsador smd NO (normally open, o normalmente abierto).

Observad el conexionado necesario, dñonde tan solo tenemos dos cables de datos con Arduino (blanco y verde), la alimentación (rojo y negro) y un cable de entrada para cada uno de los pulsadores, que además montan sus resistencias pull-down.

 

Conclusión

Con esta entrega hemos podido ver qué infraestructura base de hardware vamos a usar. Hemos visto el tipo de entrada que queremos para excitar nuestro controlador y también hemos podido observar la forma tan sencilla de conexionado que nos ofrece una solución con I2C y el PCF8574.

En la próxima entrega nos vamos a ocupar de programar este pequeño prototipo para que podamos saber si es o no viable seguir con estas premisas, y si este tipo de construcción cubre nuestras necesidades.

Comentar que si bien este prototipo sólo cuenta con 5 entradas, no cabe duda de que el resto de las entradas se implementarán de idéntica forma.

Este pequeño prototipo nos dará la capacidad para empezar a programar lo que será la versión final de nuestra botonera.

 

 

Gracias por leerme.

Nos vemos en la próxima entrega!

 

Jordi

 


Navegación:

Buttonbox para simuladores de conducción

Share Button