
¿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 Ardunio.
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.
Anuncio:
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.
Anuncio:
Buen post, lo pondré a prueba
Disculpa, podrías explicar esta parte?
int SetMuxChannel(byte channel)
{
digitalWrite(muxS0, bitRead(channel, 0));
digitalWrite(muxS1, bitRead(channel, 1));
digitalWrite(muxS2, bitRead(channel, 2));
digitalWrite(muxS3, bitRead(channel, 3));
}
Si claro. El canal encendido del CD74HC4067 es controla a través de los pines S0 a S3, según un número binario de 4 dígitos (de 0000 a 1111), que hacen el total de 16 canales Para elegir el canal, una forma sencilla es emplear una función como la escrita, que reciba un byte (porque es el número más pequeño que podemos almacenar) de 8 bits (de 00000000 a 11111111). Y para convertir el byte a las salidas que necesitan los pines S0 a S3, una forma eficiente es emplear la función bitRead para repartir los 4 primeros bits de nuestro… Read more »
Simplemente, pon el número del canal que quieres en la función SetMuxChannel();
(en tu caso, SetMuxChannel(1) para C1)
Con Jumpers a machos en una placa breadboard, nunca. Para uniones permanentes, cable soldado (a ser posible, soldado a un conector mejor que un terminal dupont).
Y en el caso de pruebas etc, le sueldo un header macho, y uso cables dupont hembra.
Disculpa, se puede ocupar como salida analógica?
En la entrada indicamos que “el CD74HC4067 funciona con señales digitales y analógicas tanto como entrada como salida”
Cree que serían necesarios condensadores de desacoplo?
No, por parte del multiplexor. Si tu circuito necesita condensadores de desacoplo, tendrás que mantenerlos.
Hola Luis, una consulta… Sabes la velocidad maxima que soporta para lectura de 16 señales analogicas? Saludos
En los datasheets del HCF 4067 el pin 15 se llama “inhibit”, que corresponde con el “enable” de la placa. Puede despistar un poco, de hecho me pasé un rato mirando y remirando hasta comprobar que en efecto inhibit y enable son el mismo pin.
Luis, este aparatito, me permite controlar en forma INDIVIDUAL, cada canal? O sea, el C13 lo quiero output digital para abrir o cerrar un rele y el canal4 lo quiero como input, para leer la temperatura de una sonda. No se si me explico.
Exactamente Manuel. Para eso son los multiplexores (hay más modelos, no únicamente este)
Hola. No se si me podrías ayudar, pues me estoy rebanando la cabeza y no encuentro la solución. Con el código que has puesto del multiplexor como entradas analógicas, si en una de las entradas analógicas del mux, (por ejemplo la 15), conectara un pulsador o un sensor, como podría hacer con el código, que Arduino en una de sus salidas digitales, activara un led, o cualquier otro dispositivo. Es decir, pasar una puerta lógica de Arduino, a un estado alto a bajo, o viceversa. Gracias y disculpa por la molestia. He mirado en Google, tanto en español como en… Read more »
[…] Tutoriales Arduino. Más salidas/entradas en Arduino con multiplexor CD74HC4067 (2016) [En línea]. Luis Llamas. [Fecha de consulta: mayo 2017]. https://www.luisllamas.es/mas-salidas-y-entradas-en-arduino-con-multiplexor-cd74hc4067/ […]
como podria convinar los dos tanto entrada como salida obviamente utilizando un multiplexor como salida y otro como entrada pero que los dos esten en un mismo programa
Buenas, con este interfaz usándolo como demultiplexor ¿Se puede quedar simultáneamente varias salidas a HIGH? o mas haya,¿Se podría quedar una salida configurada por ejemplo a 3 voltios y otra a 5 simultáneamente?
Un saludo.
Las salidas de 3V no son salidas realmente de 3V, son una señal PWM. El multiplexor puede mantener una señal lógica, pero no una señal PWM. Necesitaras un generador de señales PWM. Echale un ojo a esta entrada https://www.luisllamas.es/controlar-16-servos-o-16-salidas-pwm-en-arduino-con-pca9685/ a ver si te sirve
Buenas, y gracias por el tutorial… pero no consigo poner a HIGH las 16 salidas a la vez, sólo consigo poner una. Necesito mas salidas digitales, he realizado mil pruebas, pero no consigo ponerlas en HIGH todas.
Me puedes ayudar??
Gracias
Hola buenas tardes. cuantos MULTIPLEXOR se pueden conectar a un Arduino?
Hola Mónica. En principio, hasta que te quedes sin Pins libres. Pero podrías incluso conectar multiplexor a multiplexor, y así hasta que te canses (lo cuál no significa que no haya opciones mejores)
Buenas Luis, muy buen post.
estoy haciendo una maqueta de trenes y me vienen genial los mux, el tema es que para leerlos leo todos los sensonres hall que puse en las vias, el tema es como leo cada entrada de forma independiente? y se puede por ejemplo usar los mux a modo de semaforo? es decir, dejar la salida c0 en HIGH y la salida c1 en LOW? he revisado post por internet pero no veo como leer o escribir solo por un canal.
gracias de antemano
hola he leido este post y lo que necesito es no solo conectar un multiplexer si no tres . como se conect al arduino? (los tres me refiero) se unen las conexiones de todos los multiplexer al arduino o van de otra forma
gracias
Hola no se si este hilo sigue abierto, me gustaría hacer una pregunta ¿se pueden conectar tres módulos Multiplexor CD74HC4067 en serie o paralelo y como habría que conectarlos?