74595 (UTC U75HC595AL) / 8-BIT SERIAL-IN SHIFT REGISTER WITH LATCHED 3-STATE PARALLEL OUTPUTS, PROVIDING SERIAL OUTPUT

 무슨 Datasheet 에 Description 이 이리도 긴지 모르겠습니다. 하지만 뭐하는 놈인지는 잘 알 수 있네요. 시리얼 IN 을 받아서 8Bit 패러랠로 넘기는 Shift Register 이고, Latch 가 있고, 3-State 패러랠 아웃풋(? 이게 뭔지는 하면서 알아봐야 겠네요), Serial Output 까지 제공하는 녀석입니다.


위 처럼 생긴 녀석입니다. 다리가 8*2 = 16개가 달렸습니다. 164는 같은 8Bit Shift Register 이지만 14개가 달려있지요.


 74164와 가장 다른점은 OUTPUT ENABLE, LATCH CLOCK, SQH 입니다. LATCH 와 SQH 는 Latch, Serial 출력 일 것으로 짐작 되지만, Output Enable 핀은 무엇인지 모르겠네요. 하면서 찾아봐야 하겠습니다.

 

 위 테이블을 보면, Operation 에 적혀있는 동작을 하기 위해서는 각 제어 핀들이 어떻게 시그널을 주어야 하는지 보여주고 있습니다. OUTPUT ENABLE 핀은 High Impedance State 라는 동작을 하기 위해 쓰이는군요. 그런데 이것도 모르겠습니다. 그래서 또 하다보면 나오겠다 생각됩니다.


1개의 595로 LED 켜기

 가장 기본적인 단계입니다. 1개의 595로 불 켜는 예제를 해보겠습니다.


 위 처럼 연결합니다. 이때 1uF 짜리 캐패시터는 Latch 시그널을 줄 때 클럭이 깨끗하지 못한 경우 깜빡임이 있을 수 있으므로 연결합니다. 

 위 회로도에서, Q7" 는 SQH 이고, MR 은 Clear (Reset), OE 가 Output Enable 핀 입니다. (회로도 그리기가 귀챦아서 퍼다 쓰다보니..^^)

 * 아두이노는 D3-Data Pin , D4-Latch Pin, D5-Clock Pin 으로 설정하겠습니다.

 * 이후에 있을 예제들까지 하려면 LED 가 모자라서 집에 지인으로부터 받았던 삼성 SMPWHT5606 시리즈 SMD 타입 조명용 LED (3V)가 있어서 이놈에 100 Ohm 저항을 달아서 20mAh 정도로 전류를 맞추었습니다.

 * 1uF 짜리 전해콘덴서가 없어서 20pF 컨덴서와 33kOhm 저항을 2개 추가하여 1.3us 로 맞추었습니다. (그냥 회로도를 그릴껄 그랬나봅니다..^^;;)


첫번 째 예제입니다. 0 에서 255 까지 를 BIT 로 표현합니다.

#define  PIN_DATA    3

#define  PIN_LATCH   4

#define  PIN_CLOCK   5


void setup() {

  pinMode(PIN_DATA,OUTPUT);

  pinMode(PIN_LATCH,OUTPUT);

  pinMode(PIN_CLOCK,OUTPUT);

  digitalWrite(PIN_CLOCK,LOW);

}


void loop() {

  for (int i = 0 ; i < 256 ; i++) {

    digitalWrite(PIN_LATCH, LOW);

    shiftOut(PIN_DATA, PIN_CLOCK, LSBFIRST, i);

    digitalWrite(PIN_LATCH, HIGH);

    delay(100);

  }

}


 동작하는 모습니다. LED 가 조명용을 썼더니 너무 밝네요..^^;;


2개의 74595로 채널 확장

 1개의 Shift Register 로 제어하는것과 동일하게 3개의 핀 만으로 더 많은 출력을 많들어낼 수 있습니다. 이번 예제에서는 74595 하나를 더 추가하여 LED 의 개수를 늘려보겠습니다.

 Shift Register 의 확장의 핵심은 바로 Parallel to Serial 핀 입니다. 이 핀을 다음 595의 Data 입력으로 넣어주면 끝입니다. 아주 간단합니다. Latch 와 Clock 은 함께 사용합니다. 

 왠만하면 회로도 안그릴려고 했는데, 말로 설명이 길어질까봐 한장 그렸습니다.


 위와 같이 연결 해주면 이제 코코드를 작성해봅니다.

#define  PIN_DATA    3

#define  PIN_LATCH   4

#define  PIN_CLOCK   5


void setup() {

  pinMode(PIN_DATA,OUTPUT);

  pinMode(PIN_LATCH,OUTPUT);

  pinMode(PIN_CLOCK,OUTPUT);

  digitalWrite(PIN_CLOCK,LOW);

}


void loop() {

  for (int i = 0 ; i < 256 ; i++) {

    digitalWrite(PIN_LATCH, LOW);

    shiftOut(PIN_DATA, PIN_CLOCK, LSBFIRST, i); // 2번째 595 (8bit)

    shiftOut(PIN_DATA, PIN_CLOCK, LSBFIRST, 255-i); // 1번째 595 (8bit)

    digitalWrite(PIN_LATCH, HIGH);

    delay(50);

  }

}

 위 코드의 for Loop 에서 처음 shitOut 을 하면, shiftOut() 내에서 1비트 씩 8번을 shift 합니다. 그리고 그 다음 shitOut() 은 또 8비트를 shift 하는데, 이때 부터는 데이터가 SQH 로 넘어가기 때문에 두 번째 Shift Register 에 출력이 됩니다. 

 좀더 명확히 이해하는데에는 아래 코드가 도움이 되겠습니다.

#define  PIN_DATA    3

#define  PIN_LATCH   4

#define  PIN_CLOCK   5


void setup() {

  pinMode(PIN_DATA,OUTPUT);

  pinMode(PIN_LATCH,OUTPUT);

  pinMode(PIN_CLOCK,OUTPUT);

  digitalWrite(PIN_CLOCK,LOW);

  

  shiftOut(PIN_DATA, PIN_CLOCK, LSBFIRST, 0);

  shiftOut(PIN_DATA, PIN_CLOCK, LSBFIRST, 0);

}


void loop() {

  for (int i = 0 ; i < 256 ; i++) {

    digitalWrite(PIN_LATCH, LOW);


    digitalWrite(PIN_DATA, !(i%4)); //4회 OFF ,1회 ON

    digitalWrite(PIN_CLOCK, HIGH);

    digitalWrite(PIN_CLOCK, LOW);


    digitalWrite(PIN_LATCH, HIGH);

    delay(500);

  }

}

 위 코드를 실행하면, LED 가 4개는 빈칸, 1개는 켜짐 상태로 계속 Shift 를 합니다. 

 SQH(Q7") 는 계속 Serial 로 자신이 Shift 될 때 마다 넘어가는(Overflow) 데이터를 출력해 줍니다.




OUTPUT ENABLE 핀

 Output Enable 은 구글링을 해보니, Shift Register 의 전체 출력을 보이게 하거나 안보이게 하는 역할을 한답니다. 그래서, 이 핀을 아두이노와 같은 PWM 출력이 되는 MCU 와 결합하면 LCD 등에서 밝기를 조절하는 역할을 합니다.

실제 analogWrite() 를 통해서 PWM 출력을 해보니 밝기 조절이 되네요. 출력을 높게 줄수록 밝기는 어두워집니다. GND 일때가 ON 이고 HIGH 주면 OFF 입니다.


결론

 Shift Register 와 Latch 를 잘 활용하면 깜빡임이나 스크롤 현상 없는 출력을 만들어 낼 수 있고, Serial Output 을 사용하여 무한대에 가까운 (전력이 허용하는 한) 출력을 뽑아낼 수 있겠습니다. 거기에 OUT ENABLE 을 더하여 밝기 조절을 하면, LED 를 통한 다양한 표현이나 LCD 의 제어가 더욱 용이해지겠습니다. 

 물론 LCD 에 드라이버가 내장된것들이 많지만 이러한 원리를 알아가는 과정이 참 재미있네요.


반응형
블로그 이미지

Good Joon

IT Professionalist Since 1999

,