This website requires JavaScript.
쿠폰
배송지
블로그

Arduino LED 드라이버: 74HC595와 MAX7219 연결·제어 방법

최초 게시일 Nov 14, 2026, 업데이트 되였습니다. Nov 14, 2026

5 분

표목(TOC)
  • Arduino 프로젝트에 LED 드라이버 IC가 필요한 이유
  • Arduino LED 드라이버 IC 비교
  • 74HC595로 Arduino LED와 매트릭스 제어하기
  • MAX7219 LED 매트릭스 모듈 사용하기
  • Arduino LED 매트릭스의 전원 요구사항
  • Arduino LED 드라이버 문제 해결
  • Arduino LED 드라이버 활용 예
  • 마무리
  • Arduino LED 드라이버 FAQ

LED가 많아지면 Arduino의 GPIO 핀과 전류 용량이 빠르게 부족해집니다. 출력 확장 IC나 전용 LED 드라이버를 사용하면 핀 사용을 줄이고, 경우에 따라 표시 갱신 작업을 하드웨어에 맡길 수 있습니다.

이 글에서는 74HC595 시프트 레지스터와 MAX7219 드라이버의 동작, 배선, 데이지 체인 연결과 제어 방법을 비교합니다.

Arduino 프로젝트에 LED 드라이버 IC가 필요한 이유

Arduino GPIO 핀과 전류의 한계

ATmega328P 기반 Arduino Uno는 LED를 다수 직접 구동할 때 다음 조건을 고려해야 합니다.

  • 핀별 전류: Arduino Uno 자료의 디지털 I/O 핀 정격은 20 mA입니다. 원문이 언급한 40 mA는 절대 최대값으로, 연속 동작 목표로 사용하면 안 됩니다.
  • 패키지 합계: 원문은 마이크로컨트롤러의 VCC·GND를 통과하는 합계 전류의 한계를 200 mA로 제시합니다. 핀 그룹별 조건도 데이터시트에서 확인해야 합니다.
  • 핀 수: Arduino Uno에는 디지털 I/O 핀 14개와 아날로그 입력 핀 6개가 있습니다.

15 mA LED 16개를 동시에 마이크로컨트롤러 핀에서 직접 구동하면 합계 240 mA가 필요합니다. 이는 앞서 제시한 200 mA 조건을 넘으므로 소자 손상 위험이 있습니다. LED 전류는 외부 드라이버와 전원 공급 능력을 기준으로 설계해야 합니다.

소프트웨어 멀티플렉싱과 전용 드라이버

8×8 매트릭스나 7세그먼트 표시기를 구동하는 방법은 크게 다음과 같습니다.

  • GPIO 직접 멀티플렉싱: CPU가 행과 열을 계속 스캔합니다. 센서 읽기, 통신, delay() 등으로 갱신이 지연되면 표시가 멈추거나 깜박일 수 있습니다.
  • 74HC595 시프트 레지스터: 데이터·클록·래치의 3개 제어선으로 출력을 확장합니다. 행렬 표시의 스캔은 여전히 MCU 소프트웨어가 담당합니다.
  • MAX7219 전용 드라이버: 내부 표시 RAM과 스캔 회로가 행·열 갱신을 담당해 MCU의 반복 스캔 부담을 줄입니다.

74HC595와 MAX7219 중 무엇을 선택할까?

  • 릴레이, 막대 그래프, 상태 표시등처럼 범용 디지털 출력이 필요하면 74HC595를 검토합니다. LED 전류는 칩의 권장 동작 조건과 전체 패키지 한계를 따릅니다.
  • 8×8 LED 매트릭스, 흐르는 글자, 여러 자리의 공통 음극 7세그먼트 표시기에는 전류 설정·스캔·밝기 제어가 내장된 MAX7219가 적합합니다.

Arduino LED 드라이버 IC 비교

범용 출력 확장기와 전용 디스플레이 드라이버의 차이를 정리했습니다. 실제 출력 전류와 연결 가능한 모듈 수는 데이터시트 및 배선 조건을 우선합니다.

항목74HC595 시프트 레지스터MAX7219 LED 드라이버
역할8비트 직렬 입력·병렬 출력 확장공통 음극 LED 표시 드라이버
필요한 제어선3개(데이터, 클록, 래치)3개(DIN, CS, CLK)
LED 수칩당 개별 출력 8개매트릭스 LED 64개 또는 표시 자리 8개
멀티플렉싱MCU 소프트웨어에서 스캔내부 회로에서 자동 스캔(원문 예: 약 800 Hz)
표시 RAM없음(출력 래치 레지스터)8×8 듀얼 포트 정적 RAM
전류 설정출력별 전류 제한 저항 등 외부 설계 필요ISET 외부 저항 하나로 피크 세그먼트 전류 설정
밝기 제어OE 핀의 PWM으로 전체 밝기 조정 가능16단계 디지털 밝기 제어
연결 확장데이지 체인 가능, 신호·전류 조건에 따라 제한복수 모듈 연결 가능, 속도·전원·배선 조건에 따라 제한

74HC595로 Arduino LED와 매트릭스 제어하기

74HC595는 적은 제어 핀으로 출력 수를 늘릴 수 있는 시프트 레지스터입니다.

74HC595 핀 배열

이 IC에는 8비트 시프트 레지스터와 8비트 저장 레지스터가 있습니다. 주요 핀은 다음과 같습니다.

  • DS(14번): 직렬 데이터 입력
  • SH_CP(11번): 시프트 레지스터 클록, 상승 에지에서 동작
  • ST_CP(12번): 저장 레지스터 클록(래치), 병렬 출력 갱신
  • OE(13번): 출력 활성화, LOW일 때 동작
  • MR(10번): 마스터 리셋, LOW일 때 동작
  • Q0~Q7(15번, 1~7번): 병렬 출력
  • Q7'(9번): 다음 칩 연결용 직렬 출력

74HC595 DIP-16 시프트 레지스터의 핀 배열

그림: 74HC595 DIP-16 핀 배열

Arduino와 74HC595 두 개로 8×8 LED 매트릭스 배선하기

두 레지스터의 클록과 래치 핀은 Arduino의 같은 제어선에 병렬로 연결하고, 직렬 데이터는 데이지 체인으로 연결합니다. 예시 구성에서는 첫 번째 레지스터가 행의 양극, 두 번째가 직렬 저항을 거친 열의 음극을 제어합니다. 실제 매트릭스 전류가 레지스터 출력 정격을 넘으면 별도 구동 소자가 필요합니다.

Arduino Uno와 74HC595 두 개를 연결한 8×8 LED 매트릭스 회로

그림: 두 개의 74HC595가 행·열을 담당하는 연결 예

shiftOut()으로 74HC595 LED 매트릭스 스캔하기

다음 코드는 두 레지스터에 바이트 두 개를 차례로 전송해 8×8 하트 무늬를 행별로 표시하는 예입니다.

코드의 핵심:

  • 데이지 체인 전송: 래치를 LOW로 둔 채 8비트 값 두 개를 연속 전송합니다. 첫 바이트는 두 번째 레지스터(열)에, 다음 바이트는 첫 번째 레지스터(행)에 들어갑니다.
  • 행·열 극성: ~pattern으로 열의 음극 구동 비트를 반전하고, 비트 시프트로 현재 행의 출력만 HIGH로 설정합니다.
  • 스캔 간격: 행을 순서대로 빠르게 갱신해 깜박임을 줄입니다.
C/C++
const int latchPin = 10;
const int clockPin = 9;
const int dataPin = 11;

// 8x8 heart pattern representation (1 = active LED, 0 = off LED)
byte heartPattern[8] = {
  B00000000,
  B01100110,
  B11111111,
  B11111111,
  B11111111,
  B01111110,
  B00111100,
  B00000000
};

C/C++
// Setup
void setup() {
  pinMode(latchPin, OUTPUT);
  pinMode(clockPin, OUTPUT);
  pinMode(dataPin, OUTPUT);
}
C/C++
// Main Loop
void loop() {
  // Scan through all 8 rows sequentially
  for (int row = 0; row < 8; row++) {
    // Columns (active LOW): Invert the pattern so that 1s are driven LOW (sinking current)
    byte colData = ~heartPattern[row];
    
    // Rows (active HIGH): Turn on only the current row (e.g. Row 0 -> B00000001, Row 1 -> B00000010)
    byte rowData = (1 << row);
    
    // Ground the latch pin and hold it LOW as long as we are transmitting data
    digitalWrite(latchPin, LOW);
    
    // 1. Shift out column data first (this byte overflows into Register 2, controlling Columns)
    shiftOut(dataPin, clockPin, MSBFIRST, colData);
    
    // 2. Shift out row data second (this byte stays in Register 1, controlling Rows)
    shiftOut(dataPin, clockPin, MSBFIRST, rowData);
    
    // Return the latch pin HIGH to output the updated states simultaneously
    digitalWrite(latchPin, HIGH);
    
    // Delay interval per scan line (1.25 ms per row achieves ~100 Hz frame refresh rate)
    delayMicroseconds(1250);
  }
}

shiftOut()은 사용하기 쉽지만 CPU가 클록과 데이터 핀을 직접 바꿔야 합니다. 표시 갱신 요구가 높으면 ATmega328P의 하드웨어 SPI를 검토할 수 있습니다. 원문은 최대 8 MHz 전송을 예로 듭니다.

74HC595 여러 개 데이지 체인으로 연결하기

출력 8개보다 더 필요하면 첫 번째 칩의 Q7'(9번)을 두 번째 칩의 DS(14번)에 연결합니다. 두 칩의 SH_CP와 ST_CP는 같은 Arduino 선에 병렬로 연결합니다.

16비트를 보내면 먼저 전송한 8비트가 두 번째 칩으로 이동합니다. 따라서 MSBFIRST로 전송할 때는 두 번째 레지스터용 바이트를 먼저 보내야 합니다.

OE 핀의 PWM으로 전체 밝기 제어하기

74HC595의 OE 핀을 GND에 고정하지 않고 D3 또는 D9 같은 PWM 핀에 연결하면 전체 출력을 PWM으로 제어할 수 있습니다. OE는 LOW 활성화이므로 analogWrite(OEPin, brightnessValue)에서 값 0은 밝게 켜진 상태, 255는 꺼진 상태에 해당합니다. LED 전류 한계는 별도로 확인해야 합니다.

MAX7219 LED 매트릭스 모듈 사용하기

브레드보드에서 IC를 직접 연결해 원리를 배울 수 있지만, 실제 제작에서는 MAX7219와 디커플링 커패시터, 매트릭스 소켓이 이미 실장된 MAX7219 8×8 LED 매트릭스 모듈을 이용할 수 있습니다.

MAX7219 8×8 매트릭스의 동작 원리

MAX7219에는 8×8 듀얼 포트 정적 RAM과 하드웨어 스캔 회로가 있습니다. Arduino가 직렬 인터페이스로 픽셀 데이터를 보내면 모듈이 저장하고 계속 갱신합니다. 원문은 내부 갱신 속도를 약 800 Hz로 설명합니다. 따라서 MCU가 각 행을 소프트웨어로 계속 스캔할 필요가 없습니다.

MAX7219 모듈의 핀과 연결

일반적인 모듈은 입력과 출력 쪽에 5핀 헤더를 제공합니다. 실제 핀 배치는 모듈마다 확인하세요.

입력과 데이지 체인 출력 헤더가 있는 MAX7219 8×8 LED 매트릭스 모듈

그림: 왼쪽 입력 헤더와 오른쪽 출력 헤더를 갖춘 MAX7219 모듈

  • VCC: 일반적으로 +5 V DC 전원
  • GND: 공통 접지
  • DIN: MCU의 MOSI 측 직렬 데이터 입력
  • CS(LOAD): LOW에서 전송을 시작하고 HIGH에서 데이터를 래치
  • CLK: 직렬 데이터 클록. 원문은 최대 10 MHz를 제시합니다.
  • DOUT: 다음 모듈로 이어지는 직렬 데이터 출력

ISET 전류 설정 저항

MAX7219 칩의 LED 세그먼트 피크 전류는 ISET 핀의 외부 저항(R_iset)으로 설정합니다.

시판 8×8 모듈에는 대개 이 저항이 기판에 실장되어 있으며, 원문은 약 10 kΩ을 예로 듭니다. 제조사 데이터시트는 약 9.53 kΩ에서 피크 세그먼트 전류가 약 40 mA가 될 수 있다고 설명합니다. 40 mA를 모든 LED의 안전한 구동값으로 가정하지 말고 실제 LED 정격, 모듈 저항값과 밝기 설정을 확인해야 합니다.

Arduino Uno와 MAX7219 8×8 LED 매트릭스 연결 회로

그림: Arduino Uno와 MAX7219 매트릭스 모듈의 배선 예

MAX7219 제어 레지스터

모듈에는 8비트 주소와 8비트 데이터로 이루어진 16비트 패킷을 보냅니다.

명령 = [주소(D15-D8)] + [데이터(D7-D0)]

주요 레지스터는 다음과 같습니다.

주소(16진수)레지스터역할과 대표 설정
0x09Decode Mode8×8 원시 매트릭스 매핑은 0x00, 7세그먼트 모드는 0x0F/0xFF 예시
0x0AIntensity0x00 최소부터 0x0F 최대까지 16단계 밝기(최대 15/16 듀티)
0x0BScan Limit전체 8행·열 사용 시 0x07
0x0CShutdown0x00 대기, 0x01 동작
0x0FDisplay Test0x00 일반 동작, 0x01 모든 LED 테스트
0x01~0x08Digit 0~78×8 매트릭스의 열 1~8에 대응

Arduino 라이브러리와 저수준 제어

SPI.h로 레지스터를 직접 제어하면 동작을 이해하기 좋지만, 그래픽과 흐르는 글자를 처음부터 구현하기에는 코드가 많아집니다. 다음 라이브러리를 검토할 수 있습니다.

  1. LedControl: 개별 모듈이나 짧은 체인에서 setLed()로 좌표별 LED를 켜고 문자 등을 표시할 수 있습니다.
  2. MD_MAX72XX와 MD_Parola: FC-16 등 모듈 배치 차이, 여러 모듈의 글자 버퍼·글꼴·애니메이션·표시 구역 설정을 지원합니다.

예: 하드웨어 SPI를 이용한 저수준 제어

다음 코드는 Arduino의 SPI.h를 통해 MAX7219 레지스터에 데이터를 쓰는 개념 예시입니다.

C/C++
// Pin Definitions
// Includes and Definitions
#include <SPI.h>
const int csPin = 10;

// MAX7219 Register Addresses
const byte REG_NOOP         = 0x00;
const byte REG_DIGIT0       = 0x01;
const byte REG_DECODE_MODE  = 0x09;
const byte REG_INTENSITY    = 0x0A;
const byte REG_SCAN_LIMIT   = 0x0B;
const byte REG_SHUTDOWN     = 0x0C;
const byte REG_DISPLAY_TEST = 0x0F;


// Display Pattern Buffer
byte heartPattern[8] = {
  B00000000,
  B01100110,
  B11111111,
  B11111111,
  B11111111,
  B01111110,
  B00111100,
  B00000000
};
C/C++
// Helper Function to Write to Register
void writeRegister(byte address, byte data) {
  digitalWrite(csPin, LOW);
  SPI.transfer(address);
  SPI.transfer(data);
  digitalWrite(csPin, HIGH);
}
C/C++
// Setup Function
void setup() {
  pinMode(csPin, OUTPUT);
  digitalWrite(csPin, HIGH);
  SPI.begin();
  SPI.beginTransaction(SPISettings(8000000, MSBFIRST, SPI_MODE0));
  writeRegister(REG_DISPLAY_TEST, 0x00);
  writeRegister(REG_DECODE_MODE, 0x00);
  writeRegister(REG_INTENSITY, 0x03);
  writeRegister(REG_SCAN_LIMIT, 0x07);
  writeRegister(REG_SHUTDOWN, 0x01);
  for (int i = 1; i <= 8; i++) {
    writeRegister(i, 0x00);
  }
}
C/C++
// Main Loop
void loop() {
  for (int col = 0; col < 8; col++) {
    writeRegister(REG_DIGIT0 + col, heartPattern[col]);
  }
  delay(1000);
}

MAX7219 8×8 모듈 여러 개 연결하기

모듈을 나란히 두고 VCC, GND, CLK, CS를 공통으로 연결합니다. 데이터는 앞 모듈의 출력 헤더 DOUT을 다음 모듈의 입력 헤더 DIN에 연결합니다.

MD_Parola 같은 라이브러리에서는 연결 모듈 수를 설정합니다. 예를 들어 #define MAX_DEVICES 4를 사용하면 라이브러리가 체인 데이터를 관리해 여러 모듈에 걸친 흐르는 글자를 표시할 수 있습니다.

Arduino LED 매트릭스의 전원 요구사항

모듈 하나는 조건에 따라 Arduino의 5 V 전원에서 동작할 수 있지만 여러 개를 연결하면 USB 및 보드의 전원 예산을 확인해야 합니다.

  • USB 2.0의 일반적 전류 예산: 원문은 표준 포트의 500 mA를 기준으로 설명합니다. 실제 공급 가능 전류는 포트와 장치 상태에 따라 확인해야 합니다.
  • 4개 모듈: 8×32 표시기를 높은 밝기와 높은 점등 밀도로 구동하면 원문 기준 약 600 mA~1 A가 필요할 수 있습니다.
  • 외부 전원: 원문은 정격 5 V·최소 2 A의 안정화 전원을 모듈의 VCC·GND에 직접 연결하도록 권합니다. 외부 전원 GND와 Arduino GND도 반드시 연결해 공통 기준을 만듭니다.

Arduino LED 드라이버 문제 해결

1. 74HC595 출력이 바뀌지 않을 때

래치(ST_CP) 배선을 확인합니다. 연결이 끊기거나 GND에 고정되면 직렬 데이터를 받아도 병렬 출력에 새 값이 반영되지 않습니다.

2. 데이지 체인 LED 순서가 뒤바뀔 때

먼저 전송한 바이트가 다음 레지스터로 이동합니다. shiftOut() 호출 순서를 바꾸고 두 칩의 데이터 연결을 확인합니다.

3. MAX7219에 글자가 표시되지 않을 때

MAX7219는 전원 인가 뒤 Shutdown 상태일 수 있습니다. Shutdown 레지스터(0x0C)에 0x01을 쓰고 Scan Limit(0x0B)을 0x07로 설정해 8행을 활성화했는지 확인합니다.

4. 매트릭스가 어둡거나 밝기가 고르지 않을 때

가는 점퍼선을 따라 모듈 전원을 계속 이어 연결하면 전압 강하가 생길 수 있습니다. 5 V 전원에서 각 모듈까지 충분한 굵기의 전원선을 연결하고 전원 용량을 확인합니다.

5. 표시가 깜박일 때

외부 어댑터를 쓴다면 어댑터의 음극과 Arduino GND가 연결되어 있는지 확인합니다. 소프트웨어 스캔 방식이라면 긴 delay()나 다른 작업으로 갱신이 지연되지 않는지도 살펴봅니다.

6. 전원을 켤 때 LED가 잠깐 켜질 때

74HC595의 출력 상태는 초기화 전에 예측하기 어렵습니다. 원문은 OE 핀과 VCC 사이에 10 kΩ 풀업 저항을 두어 시작 시 출력을 비활성화하고, Arduino의 setup()이 끝난 뒤 OE를 LOW로 내려 활성화하는 방법을 제안합니다.

Arduino LED 드라이버 활용 예

8×32 MAX7219 흐르는 글자 표시기

8×8 모듈 네 개를 데이지 체인으로 연결하고 MD_Parola를 사용하면 8×32 크기의 흐르는 글자 표시기를 만들 수 있습니다.

Arduino용 8×8 LED 매트릭스 네 개를 연결한 8×32 표시기

그림: 데이지 체인으로 연결한 8×8 LED 매트릭스 모듈 네 개

74HC595로 만드는 LED 막대 그래프

74HC595 세 개를 연결하면 출력 24개로 오디오 레벨 표시기나 배터리 잔량 표시기를 구성할 수 있습니다. 밝기와 구동 전류가 중요하다면 레지스터의 출력 정격에 맞는 별도 드라이버를 검토해야 합니다.

Arduino 7세그먼트 표시기의 멀티플렉싱

숫자 표시에는 a~g의 일곱 세그먼트와 선택적인 소수점(dp)을 사용합니다. 원문의 4자리 패키지 예에서는 세그먼트용 8핀과 자리 선택용 공통 양극 또는 공통 음극 4핀, 합계 12핀을 사용합니다.

74HC595나 MAX7219를 사용하면 GPIO 사용량과 갱신 코드의 부담을 줄일 수 있습니다. 4자리 숫자 표시에서 개별 LED를 모두 직접 연결하면 32개 핀이 필요할 수 있지만, 멀티플렉싱은 공통 핀 네 개를 순서대로 선택하면서 해당 세그먼트 데이터를 보냅니다. 충분히 빨리 스캔하면 연속된 숫자로 보입니다.

JLCPCB PCB 조립 서비스 배너
브레드보드에서 맞춤형 LED 표시 PCB로
지금 견적 받기
  • 브레드보드 시제품을 PCB로 옮길 때는 전류 경로, 커넥터 위치, 디커플링 커패시터와 드라이버 IC 풋프린트를 먼저 계획합니다.
  • JLCPCB에서 Arduino LED 드라이버 회로의 PCB 제조와 조립 옵션을 확인할 수 있습니다.

마무리

Arduino에서 더 많은 LED를 제어하려면 GPIO 수와 전류, 밝기, CPU 부하를 함께 고려해야 합니다. 직접 행렬 스캔, 74HC595 출력 확장, 찰리플렉싱, MAX7219 드라이버는 서로 다른 제약을 해결하는 방법입니다. 특히 LED 전류가 소자 정격을 넘지 않도록 회로와 전원을 검증해야 합니다.

Arduino LED 드라이버 FAQ

Q. 74HC595 한 개로 LED 몇 개를 제어할 수 있나요?

병렬 출력이 8개이므로 개별 LED 최대 8개의 논리 상태를 제어할 수 있습니다. 여러 칩을 데이지 체인으로 연결하면 출력 수를 늘릴 수 있지만 전류, 신호 지연과 전원 용량에는 제한이 있습니다.

Q. MAX7219 모듈은 몇 개까지 연결할 수 있나요?

원문은 일반적인 하드웨어 SPI 구성에서 8개 이상을 예로 듭니다. 고정된 보편적 상한은 아니며 배선 길이, 클록 속도, 전원 분배, 모듈 설계에 따라 달라집니다.

Q. MAX7219에 직접 멀티플렉싱 코드를 작성해야 하나요?

필요하지 않습니다. 칩의 하드웨어 스캔 회로가 매트릭스를 계속 갱신하므로 Arduino는 표시할 데이터를 보내면 됩니다.

Q. 시작할 때 74HC595 출력이 임의 상태인 이유는 무엇인가요?

전원 인가 직후 레지스터 내용이 초기화되기 전일 수 있습니다. OE 핀에 10 kΩ 풀업을 두어 출력을 비활성화하고 설정을 마친 뒤 활성화하는 방법을 검토할 수 있습니다.

Q. 74HC595로 고전력 LED를 직접 구동할 수 있나요?

권장하지 않습니다. 원문에 제시된 35 mA는 일부 74HC595 부품의 절대 최대 출력 전류이며 권장 연속 동작 전류가 아닙니다. 고전력 LED에는 트랜지스터 드라이버나 달링턴 어레이 등 별도 전력 구동 회로를 사용합니다.

Q. 74HC595와 MAX7219 중 어느 쪽이 적합한가요?

범용 출력 확장에는 74HC595, 공통 음극 7세그먼트나 8×8 LED 매트릭스의 스캔·밝기 제어에는 MAX7219가 보통 편리합니다. 요구 전류와 표시 구조를 먼저 확인하세요.

Q. LED 매트릭스가 깜박이는 이유는 무엇인가요?

외부 전원과 Arduino의 접지가 연결되지 않았거나, 소프트웨어 스캔 갱신이 느린 작업 때문에 지연되는 경우를 확인하세요. 전원 전압 강하도 함께 점검해야 합니다.

Q. MAX7219 모듈에 외부 저항이 필요한가요?

일반적인 8×8 모듈에는 ISET 전류 설정 저항이 실장되어 있는 경우가 많아 열마다 별도 직렬 저항이 필요하지 않습니다. 모듈마다 구성이 다를 수 있으므로 실물 회로와 LED 전류 정격을 확인해야 합니다.

지속적인 성장