아두이노 강좌 #21 Shift Register 74HC595 로 LED 점멸하기
Lucy Archive
Lucy 2023
2020. 8. 9. 01:21

아두이노 시프트 레지스터로 LED 제어아두이노 시프트 레지스터로 LED 제어

Arduino Uno Control LED with 74HC595

아두이노 포트수는 한정되어 있으나, 많은 수의 LED를 제어해야 하는 경우 시프트 레지스터 사용이 필수적으로 요구 됩니다. 많은 LED 가 사용되는 전광판 같은 LED Matrix 구동 회로에는 대부분 시프트 레지스터가 필수적으로 사용됩니다. 지난 포스트에서 shiftOut() 함수 사용 방법에 대해 알아보고, 시프트 레지스터 중의 하나인 74HC595 내부 구조에 대해 알아보았습니다. 이번 포스트에서는

아두이노 우노 보드에서 74HC595 를 사용하여 LED를 제어

하는 예제를 소개합니다.

Hardware

준비물

본 예제의 구성품은 아래와 같습니다. 

  • Arduino Uno x 1EA
  • 74HC595 x 1EA
  • DIP Type LED x 8EA
  • DIP Type Resistor x 8EA (본 예제에서 2.2kΩ 사용)
  • Bread Board x 1EA
  • Jumper WIres

회로도 및 연결

아두이노 우노와 74HC595 를 연결하기 위해 핀은 지정 되어있는 것은 아니고, 연결하시기 편하신 대로 연결 후 코드에서 수정이 가능합니다. 위 회로도에서는 제가 배선하기 편한 순서대로 배선을 진행 하였습니다.

아두이노 우노와 74HC595 핀 연결은 아래의 표를 참고해주세요.


예제1 : 8개 LED 순차적으로 점멸

코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#define sckPin 13 // 74HC595의 SRCLK핀
#define latchPin 12 // 74HC595의 RCLK핀
#define oePin 11 // 74HC595의 OE핀
#define dataPin 10 // 74HC595의 SER핀
 
void setup(){
    // CLK, DATA, OE, DATA 핀 모두 출력 포트로 설정
    // LATCH와 OE는 
    pinMode(latchPin, OUTPUT);
    pinMode(oePin, OUTPUT);
    pinMode(dataPin, OUTPUT);
    pinMode(sckPin, OUTPUT);
    digitalWrite(oePin, HIGH); //초기설정시 출력이 안나오도록
}
 
void loop(){
 
    for(int i = 0 ; i < 8 ; i++)
    {
        byte temp = 1 << i;
        digitalWrite(oePin, HIGH); //데이터가 저장될동안 출력을 출력 비활성화
        digitalWrite(latchPin, LOW); 
        shiftOut(dataPin, sckPin, MSBFIRST, temp);
        digitalWrite(latchPin, HIGH); // LATH핀 LOW -> HIGH 일떄 D래치 동작
        digitalWrite(oePin, LOW); // 8bit 데이터 출력 저장 후 Output 활성화
        delay(500);
    }
}
cs

코드 설명

  • 1~4줄 : Arduino Uno 와 74HC595 핀 매핑을 선언문으로 지정 - 회로도와 다르게 연결 한 경우 수정 필요합니다.
  • 9~13줄
    • CLK, LATCH, DATA, OE 핀을 출력 포트로 설정 합니다.
    • OE핀은 Active Low로 기본 출력을 LOW로 지정합니다.
  • 20줄 : temp 변수는 1Byte 변수로 for문의 i값에 따라 0b00000001 -> 0b00000010 -----> 0b10000000 순서로 변경됩니다.
  • 21~25줄 : 시프트레지스터에 실제 데이터를 전송 하는 코드입니다.
    • 21~22줄 : OE 핀을 HIGH로, LATCH 핀을 LOW 로 출력합니다. (대기상태)
    • 23줄 : 시프트 레지스터에 기록할 데이터를 송신합니다.
    • 24~25줄 : 시프트 레지스터에 데이터를 기록하고 LATCH 활성화 후 OE(Output Enable)을 활성화 합니다.


실행 결과


예제2 : 8개 LED 바이너리 카운터

코드

8개의 LED로 0~255 숫자 바이너리 카운터 코드 입니다. 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#define sckPin 13 // 74HC595의 SRCLK핀
#define latchPin 12 // 74HC595의 RCLK핀
#define oePin 11 // 74HC595의 OE핀
#define dataPin 10 // 74HC595의 SER핀
 
void setup(){
    // CLK, DATA, OE, DATA 핀 모두 출력 포트로 설정
    // LATCH와 OE는 
    pinMode(latchPin, OUTPUT);
    pinMode(oePin, OUTPUT);
    pinMode(dataPin, OUTPUT);
    pinMode(sckPin, OUTPUT);
    digitalWrite(oePin, HIGH); //초기설정시 출력이 안나오도록
}
 
void loop(){
 
    for(int i = 0 ; i < 255 ; i++)
    {
        digitalWrite(oePin, HIGH); //데이터가 저장될동안 출력을 출력 비활성화
        digitalWrite(latchPin, LOW); 
        shiftOut(dataPin, sckPin, MSBFIRST, i);
        digitalWrite(latchPin, HIGH); // LATH핀 LOW -> HIGH 일떄 D래치 동작
        digitalWrite(oePin, LOW); // 8bit 데이터 출력 저장 후 Output 활성화
        delay(200);
    }
}
cs

코드 설명

예제1의 코드에서 18번 줄의 for문의 반복 숫자와, 22번 줄 shiftOut() 함수에서 파라이터 temp 를 삭제하고, i로 변경하였습니다. 

실행 결과


마무리

본 포스트에서는

74HC595 를 사용하여 8개의 LED를 순차적으로 제어하는 예제와 바이너리 카운터 예제

를 소개하였습니다. 본 예제에서 사용한 shiftOut() 함수와 74HC595 의 내부 구조에 대해 알고 싶으신 분은 하단의 링크를 참조해주세요.

끝까지 읽어주셔서 감사합니다. 😍

관련포스트

👉 아두이노 74HC595 관련글 목록 보기

👉 아두이노 관련글 전체 목록 보기