Múltiples entradas/salidas analógicas con un 74HC4051

Este ejemplo sencillo explica el funcionamiento de un multiplexor analógico, utilizado para leer el valor de 8 sensores LDR (sensor de luz).

¿Qué es un multiplexor?

En electrónica digital, un 'multiplexor', es un circuito usado para el control de un flujo de información que equivale a un conmutador. En su forma más básica se compone de dos entradas de datos (A y B), una salida de datos y una entrada de control (sel). Cuando la entrada de control se pone a 0 lógico, la señal de datos A es conectada a la salida; cuando la entrada de control se pone a 1 lógico, la señal de datos B es la que se conecta a la salida...

Figura 1. Esquema de un multiplexor 2 a 1. Puede ser comparado a un conmutador controlado.

El multiplexor es una aplicación particular de los decodificadores, tal que existe una entrada de habilitación (EN) por cada puerta AND y al final se hace un OR entre todas las salidas de las puertas AND.

La función de un multiplexor da lugar a diversas aplicaciones:

  1. Selector de entradas.
  2. Serializador: Convierte datos desde el formato paralelo al formato serie.
  3. Transmisión multiplexada: Utilizando las mismas líneas de conexión, se transmiten diferentes datos de distinta procedencia.
  4. Realización de funciones lógicas: Utilizando inversores y conectando a 0 ó 1 las entradas según interese, se consigue diseñar funciones complejas, de un modo más compacto que con las tradicionales puertas lógicas.

(fuente: Wikipedia)

Para el ejemplo voy a utilizar un multiplexor analógico 74HC4051 que permite conmutar entre 8 entradas o salidas analógicas, dependiendo para que lo usemos. En este caso particular el objetivo en conmutar 8 señales analógicas desde una única entrada analógica en la placa Arduino.

En la siguiente figura se obervan las características del 74HC4051:

 - Las 8 entradas, señaladas de A0 a a7.
 - Los 3 bits para direccionar las 8 entradas, señalados como S0, S1 y S2.
 - El enable, que se habilita poniéndolo a LOW (lógica inversa).

Figura 2. Multiplexor analógico 74HC4051.

A continuación se ve la tabla de valores necesaria para conmutar entre las 8 entradas:

Figura 3. Tabla de valores del multiplexor analógico 74HC4051.

La conexión de Arduino y el Multiplexor analógico 74HC4051 quedaría como a continuación se muestra:

Figura 4. Esquema de conexionado a una una placa Arduino.

Código fuente

 /*

 Ejemplo de lectura de un conjunto de 8 LDR (sensor de luminosidad) 
 mediante un multiplexor analógico 74HC4051.

 */

 int val = 0;                   // Vble que almacenará los valores de la LDR
 int LDR=2;                     // PIN analógico de la LDR
 int bit1=6;                    // PIN digital al S2 del multiplexor
 int bit2=5;                    // PIN digital al S1 del multiplexor
 int bit3=4;                    // PIN digital al S0 del multiplexor

 void setup() {
  beginSerial(9600);                              
  pinMode(bit1,OUTPUT); 
  pinMode(bit2,OUTPUT);  
  pinMode(bit3,OUTPUT); 
 }

 void loop() {
  for (int i=0;i<8;i++){        // Recorre las 8 posiciones del multiplexor
    switch (i) {
      case 0:
        digitalWrite(bit1,LOW); // Posición 0 --> S0=0, S1=0 y S3 =0 (en binario)
        digitalWrite(bit2,LOW);
        digitalWrite(bit3,LOW);
        break;      
      case 1:
        digitalWrite(bit1,LOW);
        digitalWrite(bit2,LOW);
        digitalWrite(bit3,HIGH);
        break;      
      case 2:
        digitalWrite(bit1,LOW);
        digitalWrite(bit2,HIGH);
        digitalWrite(bit3,LOW);
        break;      
      case 3:
        digitalWrite(bit1,LOW);
        digitalWrite(bit2,HIGH);
        digitalWrite(bit3,HIGH);
        break;      
      case 4:
        digitalWrite(bit1,HIGH);
        digitalWrite(bit2,LOW);
        digitalWrite(bit3,LOW);
        break;      
      case 5:
        digitalWrite(bit1,HIGH);
        digitalWrite(bit2,LOW);
        digitalWrite(bit3,HIGH);
        break;      
      case 6:
        digitalWrite(bit1,HIGH);
        digitalWrite(bit2,HIGH);
        digitalWrite(bit3,LOW);
        break;      
      case 7:
        digitalWrite(bit1,HIGH);
        digitalWrite(bit2,HIGH);
        digitalWrite(bit3,HIGH);
        break;            
    }
    val = analogRead(LDR);        // Lee el valor del sensor LDR      
    Serial.print("Valor de ");
    Serial.print(i);
    Serial.print(" es: ");    
    Serial.println(val);
  }
  delay(100);
 }

Referencias

by Igor González Martín 25-02-2008