bclose

Multiplexor Analógico 74HC4067

Ampliando el numero puertas analógicas o digitales en Arduino

Objetivos

 

 

    • Ampliando el número de puertas disponibles para nuestros Arduino. Tanto digitales con de lectura analógica.
    • Presentar el concepto de multiplexor y demultiplexor.
    • Conocer el integrado 74HC4067 de 16 canales analógicos.
    • Mostrar un pequeño ejemplo de uso.

 

Material requerido.

Imagen de Arduino UNO  Arduino UNO o equivalente.
ProtoboardUna Protoboard .
conexionesAlgunos cables de protoboard,
Vista principalUna 74HC4067 brakout Board
PotUn potenciómetro de 10K

Ampliando los pines disponibles

 

No es raro que alguien te pregunte, que haces con un Arduino cuando te quedas sin pines libres y aun así necesitas más.

O tal vez si los 6 convertidores de analógico a digital de que dispone un Arduino UNO no son suficientes y tampoco los 16 de que dispone un MEGA. Al final no hay Arduinos más grandes. ¿Y ahora qué?

Siempre me sorprende la cantidad de veces que me hacen esta pregunta como si fuese un problema de imposible solución. Pero no. En la práctica esto no es una limitación porque para eso el mercado inventó, hace tiempo diferentes soluciones según las necesidades.

Ya vimos, por ejemplo, que podemos soslayar el límite de puertas digitales de salida en cualquier Arduino mediante un sencillo HC7475, un Shift register.

Si el problema es que necesitamos mas convertidores ADC, el mercado nos ofrece todo un abanico de convertidores con más puertas de entrada e incluso más resolución que los 10 bits que encontramos en los Arduinos de 5V (Como siempre el DUE es sensiblemente mejor con 12 bits)

Y para las ocasiones en que el problema es de pines de entrada o de relacionar muchos con muchos hay chips sencillos para solucionar este problema. Nos referimos a los multiplexores demultiplexores y vamos a dedicar esta humilde sesión a hablar de ellos y a ver que son, para que sirven y como se usan.

Y para ello nos vamos a centrar en un chip típico para esto que se llama 74HC4607 que es muy fácil de encontrar y que es una pequeña joyita del ingenio de los ingenieros electrónicos, pero antes tenemos que hacer algunos comentarios sobre el concepto de multiplexado y demultiplexado.

Así que vamos con ello.

 

Multiplexores

 

Según la Wikipedia un multiplexor es:

Los multiplexores son circuitos combinacionales con varias entradas y una única salida de datos, están dotados de entradas de control capaces de seleccionar una, y sólo una, de las entradas de datos para permitir su transmisión desde la entrada seleccionada hacia dicha salida.

Algo técnicamente impecable, pero que en la práctica habrá dejado en blanco a muchos de los que no están habituados a la jerga técnica.

Imagínate las antiguas centralitas de teléfonos de los años 70, que ves en las películas en blanco y negro. Cuando el prota llama dice algo así como: Operadora póngame con……

De cada uno de los teléfonos activos llega un cable desde tu casa a la central telefónica y allí una operadora, literalmente pinchaba un cable a mano que conecta físicamente, tu línea y la del otro abonado en otro extremo del país o del mundo.

Claro que para ello a veces había que pedir conferencia, para poder conseguir acceso a los pocos cables que unían tu ciudad con otra, y cuando estaba disponible, la operadora te llamaba para decirte que el asunto estaba listo.

Aunque esto hoy parece ciencia ficción, era la realidad de la telefonía de la buena parte del siglo pasado, que parece muy lejana pero todavía se encuentran operadoras que hacían esto.

La idea era que muchas líneas convergían en la central, uno por cada abonado, pero pocas líneas salían de ellas camino de otras centrales telefónicas distantes. Este pasar de muchas entradas a un único camino compartido se conoce como multiplexado de líneas o señales.

Puede haber 1.000 abonados, pero que como no todos requieren hablar a la vez, basta con digamos 10 líneas compartidas para que ellos tengan la sensación de que siempre tienen línea disponible, y este multiplexado que inicialmente se hacía a mano hace ya tiempo que se automatizó, pero la idea sigue siendo la misma.

Así pues, un sistema que me pasa de N líneas a una sola compartida, le llamamos multiplexado y al circuito que lo realiza se le conoce por multiplexor.

Inversamente pasar de una línea común que puede entregarse a N líneas privadas se le conoce como demultiplexado y demultiplexor al equipo, y es algo que se realiza rutinariamente en todos sistemas de comunicaciones incluidos los móviles celulares, pero que como es automática rara vez te das cuenta.

Pero la técnica está ahí detrás y existen circuitos comerciales que hacen esto exactamente, por poco dinero: Los multiplexores. Veamos un caso concreto en la forma del chip 4067

 

EL multiplexor integrado 74HC4607

 

Es un circuito muy típico en el mundo de la electrónica con infinidad de aplicaciones y nosotros lo vamos a usar como ejemplo de cómo ampliar el número de puertas de tu Arduino de momento como entradas, bien analógicas o bien digitales.

Vista del chip

Hay muchas versiones de este chip tanto para protoboard con sus patitas, como de montaje en superficie o SMD (Surface Mounted Device), pero la idea siempre es la misma. Algo así

Esquema de bloques
Diagrama de pines

Hay una colección de 16 entradas analógicas, desde la C0, hasta la C15 y una señal de ENABLE que permite o inhibe el multiplexado. Con 4 señales de selección S0, S1, S2, S3 decidimos cuál de las señales en la entrada pasa a la salida Signal Out.

El valor que se construye con las cuatro señales de selección indica en binario que puerta es la que se envía a la salida común, siempre y cuando Enable este activo (En este caso es activo con LOW, no con HIGH). ¿Fácil no? Estos circuitos son de lo más sencillos y prácticos, porque funcionan a la primera y sin dar guerra.

Pasan cualquier señal analógica en una delas entradas a la salida prácticamente sin caída de tensión, en función de las señales de control, y nos permite por ejemplo pasar 16 señales analógicas hacia una única puerta de Arduino para hacer la conversión analógica a digital por ejemplo, y con la capacidad de elegir cual lees en cada momento.

Si la señal es digital el resultado sigue siendo el mismo, así que este circuito te permite multiplicar por 16 la capacidad de puertas de tu Arduino o similar a condición de usar 5 pines digitales para su uso: S0, S1, S2, S3 y EN.

Para nuestro pequeño ejemplo vamos a usar una Breakout Board Cd74HC4067 que trae el integrado montado en una plataforma para protoboard.

 
  • Breakout Board es un nombre muy común en el mundo Arduino, que significa montar un chip con todo lo necesario para conectarlo con nuestro, micro de modo que no tengamos que soldar, sino que podamos conectarlo con cables típicos e protoboard.  
Vista principal

Veamos un ejemplo práctico de uso para ver cómo podemos multiplexar hasta 16 señales analógicas de entrada contra una única puerta Analógica de un Arduino UNO.

 

Circuito de prueba

 

Vamos a proponeros un sencillo ejemplo para comprobar el multiplexor. Para ello conectaremos todos los pines de control de la placa y enviaremos la salida del multiplexor a una entrada analógica de nuestro Arduino, la A1 por ejemplo.

La entrada analógica variable la simularemos con un potenciómetro de 10K cuya señal variable enviaremos a una de las entradas del multiplexor. La idea es que veremos que podemos cambiar la posición de entrada de esta señal y comprobar que el Mux está funcionando. (Más de una vez encontrareis que llaman MUX a los multiplexores en internet, por pura vagancia)

El circuito es muy sencillo aunque fijaros bien en donde conectáis cada cosa porque al final son unos cuantos hilos. La conexión de los pines básicos  sería algo así:

MultiplexorGNDVccENS0S1S2S3Sig
ArduinoGND5VD13891011A1

Y el esquema de protoboard:

Esquema de protoboard

Lo mas importante es que os asegureis de conectar correctamente los pines de control en el orden correcto.

 

Programa de control

 

Recordad que el pin ENABLE es activo LOW, eso quiere decidir que necesitamos poner un nivel 0 en este pin para que el circuito multiplexe las entradas. Por lo demás, el programa lo que va a hacer es activar el pin ENABLE y seleccionar una de las entradas, la 15, y mostrar que se pasa al pin de salida SIG, y eso es todo

Empecemos definiendo los pines y demás:

const int Enable = 13 ;

void setup()
   {  
        Serial.begin(9600);
        for (int i = 8 ; i < 14 ; i++)
             pinMode(i , OUTPUT);
   }

Para el loop necesitamos usar de S0, a S3 para seleccionar la entrada, por lo que definimos unas cuantas variables con ello

unsigned int S0, S1, S2, S3, k, p ;
digitalWrite( Enable , LOW );   // Active Low

Para no complicarnos mucho la vida seria interesante usar un int que represente el número de puerta que queremos seleccionar, pero eso significa que tenemos que coger los bits de ese número  y escribirlos en los S0, S1, S2, S3.

Para ello la idea es tomar el último bit de esa variable k, y podemos hacerlo así:

S0 = k & B00000001;  digitalWrite ( 8 , S0); //Solo quiero el ultimo bit

Tomamos el numero k y le hacemos un and con el binario 1, de modo que solo se mantiene el ultimo bit en 1 o 0 y lo escribimos en S0, que es el bit de menos peso.

¿Y cómo cogemos ahora el resto de los bits? Fácil, haciendo un bit  shifting sucesivamente:

S1 = ( k >> 1 ) & B00000001 ; digitalWrite ( 9 , S1) ;
S2 = ( k >> 1 ) & B00000001 ; digitalWrite (10 , S2) ;
S3 = ( k >> 1 ) & B00000001 ; digitalWrite (11 , S3) ;

Al principio os puede parecer raro pero es una tontería. EL programa final queda así:Sesion_86_1

const int Enable = 13 ;

void setup()
   { Serial.begin(9600);
     for (int i = 8 ; i < 14 ; i++)
          pinMode(i , OUTPUT);
}

void loop()
   { unsigned int S0, S1, S2, S3, k, p ;
     digitalWrite( Enable , LOW );   // Active Low

     k= 15 ;   // Selecciona la puerta a pasar
     S0 = k & B00000001 ;  digitalWrite ( 8 , S0) ; //Solo quiero el ultimo bit
     S1 = ( k >> 1 ) & B00000001 ; digitalWrite ( 9 , S1) ;
     S2 = ( k >> 1 ) & B00000001 ; digitalWrite (10 , S2) ;
     S3 = ( k >> 1 ) & B00000001 ; digitalWrite (11 , S3) ;

     // Ya hemos selccionado la puerta:  print valores
     Serial.print (k, BIN); Serial.print('\t') ;
     Serial.println(analogRead(A1)) ;
     delay (250);
   }

Podéis ver el resultado en este pequeño video de muestra:

 

 

Resumen de la sesión

 

 

    • Vimos que son los multiplexores y demultiplexores.
    • Comprobamos que podemos usarlos como forma de ampliar el número de pines digitales de nuestros Arduinos, tanto digitales como analógicos.
    • Presentamos ejemplo de programación con ellos.