¿Qué es un multiplexor CD74HC4067?
Los multiplexores y demultiplexores son dispositivos que nos permiten controlar un mayor número de dispositivos con un número menor de entradas o salidas. Podemos emplear estos dispositivos para ampliar el número de entradas y salidas de un procesador como Arduino.
Un multiplexor (o mux) permite dirigir múltiples señales a una única entrada. El dispositivo inverso se denomina demultiplexor (o demux) y permite dirigir una única señal a múltiples salidas.
El CD74HC4067 es un Multiplexor/Demultiplexor de 16 canales bidireccionales. Podemos considerarlo como un interruptor controlado digitalmente, que conecta el pin común con uno de los canales disponibles.
Esto permite escribir o leer de 16 dispositivos con solo 5 pines. 4 de ellos controlan el dispositivo que queremos leer. El pin restante recoge la señal leída o escrita en el canal seleccionado.
EL CD74HC4067 funciona con señales digitales y analógicas tanto como entrada como salida. Por este motivo a este tipo de dispositivos se les denomina ampliadores de entradas y salidas (I/O expanders).
EL CD74HC4067 también puede ser empleado en dispositivos de comunicación como el puerto serie, bus I2C o bus SPI. Por ejemplo, podemos conectar el pin TX del UART para enviar información a múltiples dispositivos. No obstante, para una comunicación completa necesitaremos más de un CD74HC4067, uno por cada pin que intervenga en la comunicación.
El máximo de corriente que puede proporcionar es 20 mA, limitado, pero tampoco es un gran problema dado que es similar a la intensidad máxima que puede proporcionar un pin de Arduino. Para corriente superiores será necesaria una etapa de amplificación mediante transistor, o salida por relé.
La tensión de alimentación del CD74HC4067 es entre 2V a 6V. En cualquier caso, las tensiones de las señales de los dispositivos no pueden superar a la tensión Vcc.
Precio
Los multiplexores CD74HC4067 son dispositivos baratos. Podemos encontrarlos por 0.80€ en vendedores internacionales de eBay o AliExpress.
Esquema montaje
La conexión es sencilla. Por un lado, alimentamos el CD74HC4067 conectando Vcc y Gnd respectivamente a 5V y Gnd en Arduino. También conectamos el chip EN a 5V, para activar el CD74HC4067.
Por otro lado, conectamos los pines S0, S1, S2 y S3, que controlan el canal activo, a 4 salidas digitales cualquier de Arduino. Finalmente, conectamos el pin de señal a una entrada o salida de Arduino. En el esquema emplearemos el pin A0, pero podría ser cualquier otro pin analógico o digital.
La conexión, vista desde Arduino, sería la siguiente, donde nuevamente hemos empleado el pin A0 pero podríamos emplear cualquier otro pin.
Ejemplos de código
CD74HC4067 como salida
En el primer ejemplo mostramos el uso del CD74HC4067 para añadir salidas. El siguiente código enciende y apaga progresivamente los 16 canales. Para ello cambiamos los pins de dirección, y empleamos una salida digital de Arduino para encender y apagar el pin de señal.
const int muxSIG = A0;
const int muxS0 = 8;
const int muxS1 = 9;
const int muxS2 = 10;
const int muxS3 = 11;
int SetMuxChannel(byte channel)
{
digitalWrite(muxS0, bitRead(channel, 0));
digitalWrite(muxS1, bitRead(channel, 1));
digitalWrite(muxS2, bitRead(channel, 2));
digitalWrite(muxS3, bitRead(channel, 3));
}
void setup()
{
pinMode(muxSIG, OUTPUT);
pinMode(muxS0, OUTPUT);
pinMode(muxS1, OUTPUT);
pinMode(muxS2, OUTPUT);
pinMode(muxS3, OUTPUT);
}
void loop()
{
for (byte i = 0; i < 16; i++)
{
SetMuxChannel(i);
digitalWrite(muxSIG, HIGH);
delay(200);
digitalWrite(muxSIG, LOW);
delay(200);
}
}
CD74HC4067 como entrada
El siguiente ejemplo muestra la lectura de valores mediante el CD74HC4067. El siguiente código realiza secuencialmente la lectura analógica del pin A0, y muestra la lectura por el puerto serie. Igual que en el código anterior cambiamos los pines de dirección, pero ahora empleamos la lectura analógica del pin de señal.
const int muxSIG = A0;
const int muxS0 = 8;
const int muxS1 = 9;
const int muxS2 = 10;
const int muxS3 = 11;
int SetMuxChannel(byte channel)
{
digitalWrite(muxS0, bitRead(channel, 0));
digitalWrite(muxS1, bitRead(channel, 1));
digitalWrite(muxS2, bitRead(channel, 2));
digitalWrite(muxS3, bitRead(channel, 3));
}
void setup()
{
Serial.begin(9600);
pinMode(muxS0, OUTPUT);
pinMode(muxS1, OUTPUT);
pinMode(muxS2, OUTPUT);
pinMode(muxS3, OUTPUT);
}
void loop()
{
for (byte i = 0; i < 16; i++)
{
SetMuxChannel(i);
byte muxValue = analogRead(muxSIG);
Serial.print(muxValue);
Serial.print("\t");
}
Serial.println();
delay(1000);
}
Descarga el código
Todo el código de esta entrada está disponible para su descarga en Github.