[tutorial] MUX74HC4067

MUX74HC4067 Tutorial from codebender on Vimeo.

This is a tutorial on the MUX74HC4067 library.

project_zps8b2d4a42

The name of the library refers to the IC that is on the Analog/Digital MUX Breakout from Sparkfun. This IC is a 16-channel analog multiplexer/demultiplexer. You can think of it as an SP16T switch that is digitally controlled. You position the switch by writing to the control pins and then you let the data flow in either direction.

sp16t_zps45e15bff

You can use this module to increase the number of inputs and outputs on your Arduino, since it only needs 6 or 5 pins to provide access to 16 data lines. You could connect to these 16 lines... sensors, buttons, transistors to control relays, or even serial lines from other Arduinos.

mux_zpsb70bdc5d

The SIG pin connects to any of the 16 channels, C0 - C15. S0 to S3 are the control pins. You write to these pins a binary code, and the corresponding channel is selected. For example, by writing 1010 to S3 S2 S1 S0, the C10 channel gets connected to the SIG pin.

table_zpsc1c7d742

There is also the EN pin that if driven HIGH, it disables the connection of the SIG pin with any of the 16 channels.

The maximum current that can go through a channel is 25 mA. If you need to power things like relays, solenoids, or motors, you will need to use transistors, and pass through the channels only the control signals.

readDigitalSignals


This example assumes there are push buttons with pullup 10 kOhm resistors connected to the 16 channels like in the following figure.

schematic_buttons_zpsb9d3f54f

The code reads the input from all the channels, one after the other, and prints on the serial monitor a statement about whether a push button is pressed or not.

All you have to do is declare a MUX74HC4067 instance, configure as a DIGITAL INPUT the Arduino pin to which the SIG pin connects, and you are ready to read from the channels. Just call read with argument the channel number and read will return either LOW or HIGH.

readAnalogSignals


This example assumes there are potentiometers connected to the 16 channels like in the following figure.

schematic_pots_zps18d61b5c

The code takes measurements of the potentiometers' values and prints on the serial monitor a statement about that value.

By configuring the signal pin as an ANALOG INPUT and then calling read, you get back the value measured by the A/D converter. It's an integer from 0 to 1023.

writeDigitalSignals


This example assumes there are 16 LEDs with current limiting 150 Ohm resistors and the positive leads of the LEDs are connected to the 16 channels like in the following figure.

schematic_leds_zps5b08114f

The code just lights up the LEDs, one after the other. You configure the signal pin as a DIGITAL OUTPUT and then you write to a channel by calling the write method and providing as arguments the channel number and a LOW or HIGH value.

writePWMSignals


The circuit for this example is identical to the previous one. The difference here is that the output to the LEDs is a PWM signal.

You can output a PWM signal, by configuring the signal pin as an ANALOG OUTPUT and then calling the write method and providing as arguments the channel number and a value (0 to 255) for the duty cycle of the PWM signal.


That's all folks. We hope you enjoy this library, and if you have any comments or suggestions you can contact us at girder [at] codebender [dot] cc

Sounds are from freesound.org. Schematics were based on Fritzing.