[아두이노] 쉬프트레지스터(74HC595) 제어

IOT/아두이노|2019. 2. 13. 14:32

[아두이노] 쉬프트레지스터(74HC595)



제 블로그에 포스팅 했던 내용인데 좀 어려운 내용이라서 이걸 소개해야하나 남감했지만 7 Segment LED의 연결되기 때문에 최대한 간단하게만 설명하겠습니다.

이전 시간에 7 Segment LED 제어를 배웠습니다. 이걸 사용하기 위해서 총 8핀을 아두이노에 연결해야 합니다. 문제는 2개 이상의 7 Segment LED를 제어할 경우 아두이노핀이 부족하게 됩니다. 그래서 아두이노 사용되는 핀을 줄일 수 있는 방법을 찾다보니깐 여러 칩중에 쉬프트레지스터라는 칩을 알게 되었으며 온라인 가상시뮬레이터에서도 모델명 75HC595칩(쉬프트레지스터)이 제공하기 때문에 이 칩을 이용해서 제어해보도록 하겠습니다.

1. 쉬프트레지스터(75HC595)


칩만보면은 햇갈립니다. 실제로 칩을 구매하실때 데이터시트를 꼭 인터넷에서 찾으셔서 살펴봐야 합니다. 물론 전 데이터시트를 보기가 참 힘들더군요. 간단히 칩구성과 핀 연결로 대충 이 칩의 작동원리만 이해하고 사용해 보았습니다. 참고로 칩을 사용하실때 칩에 사용되는 전압을 꼭 확인하시고 써야 합니다. 그렇지 않으면 칩이 망가질 수 있어서 조심해서 다루셔야 합니다.


  • 그림에서 보듯이 Vcc, Gnd은 그대로 해당 핀에 연결해주면 됩니다.
  • 데이터입력핀 DS핀 : 아두이노에서 데이터를 이칩에 보내게 됩니다.(총8개 출력값)
  • STCP 핀 : HIGH, LOW값으로 결쇠 역할을 하는 핀입니다. 칩에 입력할때 LOW 칩을 개방하고 입력을 끝내면 HIGH 칩닫음
  • SHCP 핀 : 클럭핀
  • MR 핀 : 5V 연결하더군요. 사용목적은 데이터시트 참고(저도 기억이 가물)
  • Q7S 핀 : 직렬 연결할때 사용합니다.이 칩 역시 8개값을 출력하기 때문에 더 많은 값을 출력하기 위해서 칩을 직렬 연결용으로 사용
  • Q0~Q7 : 각 핀으로 입력된 8개의 값을 출력합니다.

결론적으로 3개의 핀을 사용하여 결쇠핀, 클럭핀, 데이터핀으로 해서 이 칩을 제어할 수 있습니다. 가령 2개 이상의 75HC595를 사용해도 3핀만으로 직렬연결을 통해 제어가 가능합니다. 이건 다음에 소개하고 현재 이 칩을 아두이노에서 제어하는게 가장 중요합니다.

2. 회로도 구성


  • 준비물 : 75HC595 칩 1개, 7 Segment LED 1개, 저항 330옴 1개, 아두이노우노, 뻥판
  • 내용 : 숫자를 순차적으로 출력해보자.


칩이 정면으로 되어 있기 때문에 칩을 회전시켜야합니다. 그림을 잘 보시면 뒤집어져있는걸 보실꺼에요. 마우스로 해당칩에 끝점을 대면 핀이름이 나타납니다. 5V와 Gnd은 그림에서 보는것처럼 동일하게 배치하시면 됩니다.

참고로 Q0이 기름에서 보는것처럼 하단에 있어서 지난시간에 배운데로 A~G핀과 DP핀을 순차적으로 Q0~Q7까지 연결하면 선이 안이뻐서 Q0을 그냥 DP핀(점 LED)으로 했네요. 나머지 Q1~Q7을 A~G핀으로 연결했습니다. 그래서 배열변수값들이 지난시간에 제대로 이해 못하셨다면 약간 혼동되실꺼에요.

  • 7 Segment LED 제어 :
    74HC595칩의 Q0~Q7핀을 통해서 A~G핀과 DP핀 연결

3. 코딩


  • 사용함수 : pinMode(출력핀, 모드), digitalWrite(결쇠핀, 열림/잠금), shiftOut(데이터입력핀, 클럭핀, 순서, 데이터전송값)
  • 내용 : 아두이노에서 제공되는 shiftOut( )함수로 74HC595칩을 제어를 통해 7 Segment LED에 숫자를 순차적으로 출력해보자.

  • 74HC595칩 제어 :
    • latchPin, clockPin, dataPin을 pinMode( )로 선언
    • digitalWrite(결쇠핀, 열림/잠금)으로 74HC595칩에 입력할때 열림/잠금을 제어
    • shiftOut(데이터입력핀, 클럭핀, MSBFIRST, 전송값)으로 이걸 통해서 역순으로 데이터가 배치

설계

(1) 숫자패턴 배열변수 만든다.



7 Segment LED 연결된 것이 DP핀, A~G핀이 Q0~Q7순으로 순차적으로 연결됩니다. 홀짝에서 홀수일때 DP핀에 불이 들어오게 싶다면 숫자 0이면 G핀과 DP핀만 꺼지면 되니 10000001 이 됩니다. 그런데 1일때 0100111이겠지라고 생각하시면 안됩니다. MSBFIRST은 현재 연결핀 순서라면 역순이 됩니다. 11110010이 되어야 합니다.

이걸배열변수로 하면

byte data[]={
0B10000001,  
0B11110010,
0B01001001,
0B01100000,
0B00110011,
0B00100100,
0B00000101,
0B11110000,
0B00000001,
0B00100000
};

아마 지난시간을 생각하면 2차 배열변수로 생각하셨던 분도 있을꺼에요. 이건 하나의 값으로 표현이 가능합니다.
이걸 16진수로 하면 0x81 이 됩니다. 데이터숫자값으로 표현이 가능합니다. 이 같은 2진수 비트로 해서 다시 표현하면 위 배열처럼 나타나게 됩니다. 위 표현은 기계가 이해하기 쉬운 숫자형태입니다.

진법을 알아야하는 간단히 설명하자면
10000001 은 패턴이고 2진수입니다.
1000 0001로 4개씩 쪼개서 16진수로 나타냅니다.
8과 1로 표현됩니다.

0001=>1
0010=>2
0011=>3
.....
원래 8421 표를 숙지해야 하는데 현재 이것이 중요한것이 아니기 때문에 대충 네개로 묶으면 16진수 3개씩 묶으면 8진수라는 정도로 의미만 이해하세요.
16진수로 배열변수 값을 한다면 0x81로 표현해서 저장해도 동일한 결과가 나옵니다. 그냥 이해하기 쉽게 위 배열변수의 형식으로 이해하셔서 코딩하세요.
10진수가 아닌 기계가 이해하기 쉬운 숫자형태로 표현한다고 생각하세요.

(2) 74HC595칩에 원하는 숫자패턴을 전송한다.

  • 출력핀모드 선언 :
pinMode(latchPin, OUTPUT);
pinMode(clockPin, OUTPUT);
pinMode(dataPin, OUTPUT);

(3) 74HC595칩에 숫자패턴을 입력한다.

digitalWrite(latchPin, LOW); //열림
shiftOut(dataPin, clockPin, MSBFIRST, data[i]); //패턴입력
digitalWrite(latchPin, HIGH); //닫힘   

(4) 7 Segment LED에 출력한다.

74HC595칩(Q0~Q7) => 7 Segment LED(DP,A~G) 출력

코딩을 하면

byte data[]={
0B10000001,  
0B11110010,
0B01001001,
0B01100000,
0B00110011,
0B00100100,
0B00000101,
0B11110000,
0B00000001,
0B00100000
};
int latchPin = 11; //ST_CP Pin
int clockPin = 12; //SH_CP Pin
int dataPin = 9; //DS Pin

void setup(){
pinMode(latchPin, OUTPUT);
pinMode(clockPin, OUTPUT);
pinMode(dataPin, OUTPUT);
}
void loop(){
 for(int i=0;i<10;i++){
    digitalWrite(latchPin, LOW);
    shiftOut(dataPin, clockPin, MSBFIRST, data[i]);
    digitalWrite(latchPin, HIGH);       
    delay(1000);
  }  
}

4. 결과



마무리


3핀을 이용하여 74HC595 칩을 제어하여 7 Segment LED에 출력하였습니다. 쉬프트 로직은 사실 좀 복잡합니다. 코딩 독해능력이 있어야 하는 부분임으로 그냥 함수명만 이해해 주세요. 위의 참고출처 가시면 튜토리얼로 쉬프트 함수의 로직을 살펴볼 수 있습니다. 독해능력이 되시면 어떤식으로 74HC595 칩에 데이터를 보내는지 확인하실 수 있을 꺼에요.

코딩에 자신있는분들은 본인이 직접 로직을 짜는분들도 있지만 초보분들은 그냥 있는 함수만 잘 사용하여 원하는 동작을 수행하는게 중요합니다.

digitalWrite(latchPin, LOW);
shiftOut(dataPin, clockPin, MSBFIRST, data[i]);
digitalWrite(latchPin, HIGH);       

이것이 코딩의 전부입니다. 이걸 통해서 74HC595 칩을 제어할 수 있어서 쉽게 원하는 글자나 숫자를 7 Segment LED에 출력을 할 수 있는 것이죠.

이 세줄만 이해하시면 됩니다.

열림
쉬프트레지스트에 데이터 전송
닫힘

이 문장만 숙지하시고 한번 이 세줄을 가지고 뭘 만들지 상상의 나래를 펼쳐보세요.


댓글()