본문 바로가기

Arduino

Arduino + 74HC595 (아두이노 + 시프트 레지스터 8-bit Shift register)



아두이노는 14개의 디지탈 입출력핀을 보유하고 있지만. 종종 핀이 부족한 경우가 생깁니다.
8x8 의 도트매트릭스를 컨트롤 한다고 해도 보통 16개의 핀이 필요합니다.

이럴경우 핀 부족 문제를 초저가로 해결해 줄 수 있는 부품이 바로
Shift Register라고 부르는 부품입니다.
전 74HC595 라는 부품을 사용해봤습니다. 개당400원이네요

이놈의 핀 세개를 잘 컨트롤 해주면 8개의 출력을 만들어 낼 수 있습니다.

 

74HC595

이녀석의 동작을 간단히 설명하자면
의자가 8개 있는데 여덟명을 앉혀놨다고 생각해봅시다.
종이 울리면 모두 한칸씩 오른쪽으로 옮겨 앉습니다.
빈자리에는 새로운 사람이 앉고 가장 오른쪽에 앉아있던 사람은 떨어져 나갑니다.ㅎ 

이것과 거의 같은 동작을 합니다.
한사람씩 오른쪽으로 옮겨 앉는 시프트 기능이 병렬출력을 가능케 하는 핵심입니다.

* Datasheet (가능하면 데이터시트를 꼼꼼히 살펴보는 습관을...)

 8-Bit Serial-In, Parallel-Out Shift
Wide Operating Voltage Range of 2 V to 6 V
High-Current 3-State Outputs Can Drive Up
To 15 LSTTL Loads
Low Power Consumption, 80-µA Max ICC
Typical tpd = 13 ns
±6-mA Output Drive at 5 V
Low Input Current of 1 µA Max
Shift Register Has Direct Clear

8비트의 직렬입력을 병렬로 출력해줍니다. 
2V~6V라니 아두이노에서 전원 입력 쪽은 크게 신경안써도 될거같지만 출력은 제한적이므로 소모전류에 약간은 조심해야 할것 같습니다.



웹에서 이놈을 검색해보면 쉽게 자료가 나오는 편입니다.
다만 핀 이름을 좀 다르게 표기한곳이 많아서 헷갈리는 경우가 있더군요

 

 기능에 따라 이름을 달리 써놨네요.
 
핀 번호에 따라 설명하자면

 PINS 1-7, 15  Output Pins (병렬출력)
 PIN 8  GND
 PIN 9  Serial Out
 PIN 10  Master Reclear, active low 
 PIN 11  Shift register clock pin
 PIN 12  Storage register clock pin (latch pin) 
 PIN 13  Output enable, active low 
 PIN 14  Serial data input 
 PIN 16  Positive supply voltage 


아두이노와 연결하는 방법은 아래 아두이노 공식Tutorial에 그림과 함께 잘 나와있습니다.
http://www.arduino.cc/en/Tutorial/ShiftOut


 

 

결론적으로 아두이노측면에서는 컨트롤을 위한 세개의 핀과 Vcc, Gnd, 이렇게 다섯개의 핀이 쓰입니다.


아두이노와 연결된 74HC595 핀은
11 - shift register clock pin
12 - storage register clock pin
14 - serial data input 
이렇게 세개입니다.

74HC595 8개의 출력핀을 아래와 같이 LED와 연결해서 테스트 해보았습니다.

 




이제 8개의 핀을 임의로 셋팅해서 동시에 출력하는것을 한다고하면...(사실은 동시가 아님 Datasheet참고)
아래와 같은 순서로하면 됩니다.

편의상 pin11: Shift / pin12: Hold / pin14:Data 라고 명칭
1. Hold low
2. Shift Low
3. Data 0 or 1
4. Shift High
5. 2~4 를 8번 반복
6. Hold High

6번을 실행한 즉시 3번에서 입력한 순서대로 PIN 15, PIN 1 ~ 7 을 통해 출력이 일어납니다.


무식하지만 이해하기 쉬운 예제 스케치

int dataPin = 8; //pin 14 of 74HC595
int holdPin = 10; // pin 12 of 74HC595
int shiftPin = 11; // pin 11 of 74HC595

void setup() {
  pinMode(dataPin, OUTPUT);
  pinMode(holdPin, OUTPUT);
  pinMode(shiftPin, OUTPUT);
  
  digitalWrite(holdPin, LOW);
 
  digitalWrite(shiftPin, LOW);
  digitalWrite(dataPin, 1);  
  digitalWrite(shiftPin, HIGH);
 
  digitalWrite(shiftPin, LOW);
  digitalWrite(dataPin, 0);  
  digitalWrite(shiftPin, HIGH);
 
  digitalWrite(shiftPin, LOW);
  digitalWrite(dataPin, 1);  
  digitalWrite(shiftPin, HIGH);
 
  digitalWrite(shiftPin, LOW);
  digitalWrite(dataPin, 0);  
  digitalWrite(shiftPin, HIGH);
 
  digitalWrite(shiftPin, LOW);
  digitalWrite(dataPin, 1);  
  digitalWrite(shiftPin, HIGH);
 
  digitalWrite(shiftPin, LOW);
  digitalWrite(dataPin, 0);  
  digitalWrite(shiftPin, HIGH);
 
  digitalWrite(shiftPin, LOW);
  digitalWrite(dataPin, 1);  
  digitalWrite(shiftPin, HIGH);
 
  digitalWrite(shiftPin, LOW);
  digitalWrite(dataPin, 0);  
  digitalWrite(shiftPin, HIGH);
 
  digitalWrite(holdPin, HIGH);
}

void loop() {
  //nothing
}

실행해보면 LED가 한집건너서 켜져 있는걸 확인 할 수 있습니다.

 

LED가 다섯개 밖에 없는 현실..


좀더 쓸만한 예제는 http://www.arduino.cc/en/Tutorial/ShiftOut 에 있습니다.



이제 시프트 레지스터 두개를 연결해서 8x8 도트 매트릭스를 컨트롤 해볼 차례네요.