멀티플렉서는 여러 입력 중 하나를 선택해 출력으로 전달하는 디지털 스위치입니다. 디지털 신호를 선택하여 마이크로컨트롤러의 입력/출력 수를 절약할 때, 또는 여러 디지털 소스를 하나의 버스로 묶어 읽을 때 유용합니다.
이번 글에서 다루는 두 IC는 다음과 같습니다:
- 74HC157: 쿼드(4채널) 2:1 멀티플렉서 (한 번에 4비트 병렬 선택)
- 74HC153: 듀얼(2섹션) 4:1 멀티플렉서 (각 섹션이 4개의 입력 중 1개 선택)
주의: 이들 칩은 CMOS 디지털 멀티플렉서입니다. 아날로그 신호(센서의 연속 전압)를 선택하려면 CD4051, CD4066 같은 아날로그 MUX를 사용하는 것이 일반적입니다.
2. 부품 소개 및 핀 설명(요약)
74HC157 (주요 핀)
- S (Select) : 공통 선택 입력. 0이면 A 그룹, 1이면 B 그룹을 출력으로 보냄.
- E (Enable, Output enable) : 출력 활성 제어(Active LOW). LOW일 때 정상 동작, HIGH일 때 모든 출력이 강제로 LOW(데이터시트에 따라)로 됩니다.
- A0..A3, B0..B3 : 두 그룹의 입력 (각 4비트)
- Y0..Y3 : 출력 (선택된 그룹의 각 비트가 이쪽으로 전달)
- VCC, GND : 전원 (+5V 권장, 동작 전압 범위는 데이터시트 확인)
74HC153 (주요 핀)
- S0, S1 : 공통 2비트 선택 입력 (00 -> I0, 01 -> I1, 10 -> I2, 11 -> I3 형식으로 매핑)
- 1E, 2E : 각 섹션별 Enable(Active LOW). LOW이면 출력 정상, HIGH이면 해당 섹션 출력은 강제로 LOW.
- I0a..I3a, I0b..I3b : 섹션 A, B의 입력
- Za, Zb : 섹션 A, B 출력
- VCC, GND : 전원
(구체적인 핀 번호는 패키지(DIP/SOIC)에 따라 다르니 실제 핀 번호를 쓸 때는 데이터시트를 확인하세요.)
3. 작동 원리(진리표)
74HC157 진리표(핵심)
E S Y (한 채널 기준)
1 X 0 // Enable이 HIGH이면 출력은 LOW(강제)
0 0 A // Enable LOW + Select 0 -> A 입력이 출력
0 1 B // Enable LOW + Select 1 -> B 입력이 출력
- E는 Active LOW(정상 동작은 E=LOW). 데이터시트에 따르면 E=HIGH일 때 모든 Y 출력은 LOW로 강제됩니다.
74HC153 진리표(한 섹션 기준)
E S1 S0 Z (출력)
1 X X 0 // Enable이 HIGH이면 출력은 LOW(강제)
0 0 0 I0
0 0 1 I1
0 1 0 I2
0 1 1 I3
- S1,S0의 조합으로 I0~I3 중 하나가 선택되어 출력으로 전달됩니다. Enable은 섹션별로 독립.
4. 아두이노와 연결하기
공통 권장 사항
- 전원(VCC): 74HC 시리즈는 일반적으로 2V~6V 동작 범위를 가지지만, 아두이노 UNO 기준(5V)에서 동작시키면 호환성이 좋습니다.
- 디커플링 캡(노이즈 필터): VCC와 GND 사이에 0.1μF 세라믹 캡을 칩에 가까이 연결하세요.
- 입력 레벨: 입력이 떠있지 않게(High-Z) 주의하세요. 센서나 스위치 등으로 연결할 때는 풀업/풀다운이나 정의된 전압원을 사용하세요.
- 버스 결합 주의: 여러 출력이 같은 버스로 연결되는 경우(버스 드라이브) Output Enable 동작을 잘 확인하세요. 74HC157/153은 출력 비활성 상태에서 High-Z가 아니라 강제 LOW가 되는 경우가 있으므로(칩 종류에 따라 다름) 버스 공유에 적합하지 않을 수 있습니다. 데이터시트의 출력 형태(풀업/풀다운/3-state)를 꼭 확인하세요.
예제 A — 74HC157 (디지털 입력 전환: A 그룹 vs B 그룹)
아두이노 핀 (예시):
SEL -> D2
EN -> D3
A0..A3 -> D4, D5, D6, D7 (A 그룹 입력)
B0..B3 -> D8, D9, D10, D11 (B 그룹 입력)
Y0..Y3 -> A0, A1, A2, A3 (출력 읽기용: 아날로그 핀을 디지털로 사용 가능)
VCC -> 5V
GND -> GND
- 설명: EN을 LOW로 하면 정상 동작. SEL을 LOW/ HIGH로 바꿔 A그룹 또는 B그룹을 선택합니다. Y0..Y3을 아두이노로 읽어 현재 선택된 비트를 확인합니다.
예제 B — 74HC153 (4:1 디지털 입력 선택)
아두이노 핀 (예시):
S0 -> D2
S1 -> D3
1E -> D4 (섹션 A enable)
2E -> D5 (섹션 B enable)
I0a..I3a -> D6, D7, D8, D9 (A 섹션 입력)
I0b..I3b -> D10, D11, D12, D13 (B 섹션 입력)
Za -> A0 (출력 A)
Zb -> A1 (출력 B)
VCC -> 5V
GND -> GND
- 설명: S1,S0의 조합으로 각 섹션의 4개 입력 중 하나가 선택됩니다. 섹션별 E(Enable)은 LOW로 해야 동작합니다.
5. 라이브러리 코드
아래는 블로그에 붙여넣기 좋은 형태의 라이브러리 코드입니다. 파일 2개(MUX74HC.h, MUX74HC.cpp)와 예제 스케치 2개가 포함되어 있습니다.
MUX74HC.h
#ifndef MUX74HC_H
#define MUX74HC_H
#include <Arduino.h>
// =========================================
// HC157: Quad 2-to-1 MUX
// - selPin: 공통 선택핀 (0 -> A, 1 -> B)
// - enPin: 출력 활성 핀 (Active LOW) : LOW -> enable, HIGH -> outputs forced LOW
// - aPins[], bPins[], yPins[] : 각 채널 핀 배열
// =========================================
class HC157 {
private:
int selPin;
int enPin;
int aPins[4];
int bPins[4];
int yPins[4];
public:
// 생성자: 아두이노 핀 번호를 넣어 초기화
HC157(int sel, int en,
int a0, int a1, int a2, int a3,
int b0, int b1, int b2, int b3,
int y0, int y1, int y2, int y3);
// begin(): 초기 pinMode 설정
void begin();
// enable(): true -> enable(동작), false -> disable(출력 강제 LOW)
void enable(bool en);
// select(): false -> A 그룹, true -> B 그룹
void select(bool selAB);
// readY(channel): Y0..Y3 값을 읽음 (0 또는 1). 오류시 -1 반환
int readY(int channel);
// readAll(): 4비트 마스크(LSB=Y0)로 한 번에 읽기
uint8_t readAll();
};
// =========================================
// HC153: Dual 4-to-1 MUX
// - s0Pin, s1Pin: 공통 선택 입력
// - gPinA, gPinB: 각 섹션 Enable (Active LOW)
// - aPins[4], bPins[4] : 섹션 입력
// - yAPin, yBPin : 출력
// =========================================
class HC153 {
private:
int s0Pin, s1Pin;
int gPinA, gPinB;
int aPins[4];
int bPins[4];
int yAPin, yBPin;
public:
HC153(int s0, int s1, int gA, int gB,
int a0, int a1, int a2, int a3,
int b0, int b1, int b2, int b3,
int yA, int yB);
void begin();
void enableA(bool en);
void enableB(bool en);
void select(byte sel); // 0..3
int readYA();
int readYB();
};
#endif
MUX74HC.cpp
#include "MUX74HC.h"
// ---------------- HC157 ----------------
HC157::HC157(int sel, int en,
int a0, int a1, int a2, int a3,
int b0, int b1, int b2, int b3,
int y0, int y1, int y2, int y3) {
selPin = sel;
enPin = en;
aPins[0] = a0; aPins[1] = a1; aPins[2] = a2; aPins[3] = a3;
bPins[0] = b0; bPins[1] = b1; bPins[2] = b2; bPins[3] = b3;
yPins[0] = y0; yPins[1] = y1; yPins[2] = y2; yPins[3] = y3;
}
void HC157::begin() {
// 제어핀들은 출력으로 설정
pinMode(selPin, OUTPUT);
pinMode(enPin, OUTPUT);
// 입력핀들은 외부 회로에서 들어오는 신호를 읽도록 INPUT으로 설정
for (int i=0; i<4; i++) {
pinMode(aPins[i], INPUT);
pinMode(bPins[i], INPUT);
pinMode(yPins[i], INPUT);
}
// 기본적으로 동작하도록 enable
enable(true);
}
void HC157::enable(bool en) {
// 데이터시트상 Enable은 Active LOW
// en == true -> 동작 상태 -> enPin LOW
// en == false -> 비동작 상태 -> enPin HIGH (출력 강제 LOW)
digitalWrite(enPin, en ? LOW : HIGH);
}
void HC157::select(bool selAB) {
// selAB false -> A 그룹, true -> B 그룹
digitalWrite(selPin, selAB ? HIGH : LOW);
}
int HC157::readY(int channel) {
if (channel < 0 || channel > 3) return -1;
return digitalRead(yPins[channel]);
}
uint8_t HC157::readAll() {
uint8_t value = 0;
for (int i=0; i<4; i++) {
value |= (digitalRead(yPins[i]) & 0x1) << i; // LSB = Y0
}
return value;
}
// ---------------- HC153 ----------------
HC153::HC153(int s0, int s1, int gA, int gB,
int a0, int a1, int a2, int a3,
int b0, int b1, int b2, int b3,
int yA, int yB) {
s0Pin = s0;
s1Pin = s1;
gPinA = gA;
gPinB = gB;
aPins[0] = a0; aPins[1] = a1; aPins[2] = a2; aPins[3] = a3;
bPins[0] = b0; bPins[1] = b1; bPins[2] = b2; bPins[3] = b3;
yAPin = yA;
yBPin = yB;
}
void HC153::begin() {
// 선택핀과 enable핀을 출력 모드로 설정
pinMode(s0Pin, OUTPUT);
pinMode(s1Pin, OUTPUT);
pinMode(gPinA, OUTPUT);
pinMode(gPinB, OUTPUT);
// 입력핀들을 INPUT으로 설정
for (int i=0; i<4; i++) {
pinMode(aPins[i], INPUT);
pinMode(bPins[i], INPUT);
}
pinMode(yAPin, INPUT);
pinMode(yBPin, INPUT);
// 기본적으로 enable (동작 상태)
enableA(true);
enableB(true);
}
void HC153::enableA(bool en) {
// en == true -> 동작 (LOW)
digitalWrite(gPinA, en ? LOW : HIGH);
}
void HC153::enableB(bool en) {
digitalWrite(gPinB, en ? LOW : HIGH);
}
void HC153::select(byte sel) {
// sel: 0..3
digitalWrite(s0Pin, (sel & 0x01) ? HIGH : LOW);
digitalWrite(s1Pin, (sel & 0x02) ? HIGH : LOW);
}
int HC153::readYA() {
return digitalRead(yAPin);
}
int HC153::readYB() {
return digitalRead(yBPin);
}
6. 예제 스케치
HC157_example.ino
#include <MUX74HC.h>
// 예시 핀맵 (아두이노 UNO 기준, 필요에 따라 변경하세요)
// SEL -> D2
// EN -> D3
// A0..A3 -> D4, D5, D6, D7
// B0..B3 -> D8, D9, D10, D11
// Y0..Y3 -> A0, A1, A2, A3 (디지털로 읽음)
HC157 mux157(2, 3, // sel, en
4,5,6,7, // A0..A3
8,9,10,11, // B0..B3
A0, A1, A2, A3); // Y0..Y3 (읽기용)
void setup() {
Serial.begin(115200);
mux157.begin();
Serial.println("HC157 테스트 시작");
}
void loop() {
// A 그룹 선택 테스트
mux157.select(false); // A 그룹 선택 (sel=LOW)
Serial.print("A 선택 -> Y = ");
Serial.println(mux157.readAll(), BIN); // 4비트를 바이너리로 출력
delay(500);
// B 그룹 선택 테스트
mux157.select(true); // B 그룹 선택 (sel=HIGH)
Serial.print("B 선택 -> Y = ");
Serial.println(mux157.readAll(), BIN);
delay(500);
}
HC153_example.ino
#include <MUX74HC.h>
// 예시 핀맵
// S0 -> D2, S1 -> D3
// 1E -> D4, 2E -> D5
// I0a..I3a -> D6..D9
// I0b..I3b -> D10..D13
// Za -> A0, Zb -> A1
HC153 mux153(2, 3, 4, 5, // s0, s1, gA, gB
6,7,8,9, // I0a..I3a
10,11,12,13, // I0b..I3b
A0, A1); // Za, Zb
void setup() {
Serial.begin(115200);
mux153.begin();
Serial.println("HC153 테스트 시작");
}
void loop() {
for (int s=0; s<4; s++) {
mux153.select(s);
Serial.print("Select = "); Serial.println(s);
Serial.print("Za = "); Serial.println(mux153.readYA());
Serial.print("Zb = "); Serial.println(mux153.readYB());
delay(500);
}
}
7. 팁 & 트러블슈팅
- 출력이 항상 LOW로 보일 때: Enable 핀의 극성을 확인하세요. HC157/153은 Enable이 Active-LOW입니다. 즉 LOW일 때 동작합니다.
- 입력이 떠있어 이상값이 나올 때: 외부 입력에 pull-up/pull-down을 걸거나, 아두이노 내부 풀업(pinMode(INPUT_PULLUP))을 사용하여 안정화하세요.
- 여러 IC의 출력을 버스로 묶을 때: 74HC157/153의 출력 비활성 동작이 강제로 LOW가 되는 형태이면(3-state가 아님) 버스 결합에 적합하지 않을 수 있습니다. 이 경우 3-state 출력(예: 74HC125 같은 버퍼) 또는 트랜시버를 사용하거나, 출력이 진짜 tri-state인 버전을 선택하세요.
- 아날로그 신호 선택 필요 시: 74HC 시리즈는 디지털 전용이므로 아날로그 신호는 CD4051(8:1 아날로그 MUX) 등으로 처리하세요.
8. 참고(데이터시트 요약)
- 74HC157, 74HC153의 Enable은 일반적으로 Active-LOW이며, Enable이 HIGH일 때 출력이 강제 LOW가 됩니다. 정확한 동작(출력 강제 LOW 또는 다른 동작)은 제조사 데이터시트를 확인하세요.
- 데이터시트 링크(예시): Nexperia / TI 등 제조사 공식 문서를 참조하여 핀배치와 전기적 특성(timing, VOH/VOL, IOH/IOL, 동작 전압 범위 등)을 확인하세요.
'MCU > 아두이노' 카테고리의 다른 글
아두이노에서 74HC93 / 74HC161 / 74HC163 Binary Counter 사용하기 (0) | 2025.09.10 |
---|---|
아두이노에서 74HC165 (병렬 → 직렬 변환기) 사용하기 (0) | 2025.09.03 |
아두이노에서 74HC154 제어하기 (0) | 2025.09.03 |
아두이노에서 74HC573 사용하기 (0) | 2025.09.03 |
Arduino UNO R4에서 DMA 설정 및 사용하기 (0) | 2025.08.20 |
AVR128DA48 Curiosity Nano를 아두이노 보드 만들기 | 어셈블리 코드로 1602 LCD 제어(Controlling 1602 LCD with AVR128DA48 Curiosity Nano Using Arduino DxCore) (0) | 2025.08.14 |
Arduino UNO R4: RA4M1 I2C 드라이버 구현 (Implementing I2C Driver with RA4M1) (0) | 2025.08.13 |
Arduino Nano 33 IoT로 LSM6DS3 센서 데이터를 BLE로 전송하기(Sending LSM6DS3 Sensor Data via BLE with Arduino Nano 33 IoT) (0) | 2025.08.03 |