반응형

 【 아두이노 센서#11】 시프트레지스터 2단 연결하기 (Daisy Chain)


지난시간 시프트 레지스터의 개념(시프트 레지스터 이해하기 ☜클릭)과 나이트 라이더 LED를 구현해 보았다. (나이트 라이더 실습1 ☜클릭)


 오늘은 8bit 인 시프트 레지스터를 2단으로 연결 하여 16개의 LED를 순차적으로 켜보는 실습을 해보겠다. 이를 통해 다단 연결(앞단의 출력을 뒷 단으로 연결 하면 여러단으로 연결이 가능)이 가능하고 이러한 연결을 Daisy Chain 이라 한다. 


 사실 8bit 시프트 레지스터이기 때문에 2단으로 연결하더라도 16bit로 동작하지는 않지만, 16bit로 데이터가 이동되는 것 처럼 보이도록 프로그램을 짜 볼 것이다. 



▶ 실습에 사용되는 74HC595 IC 자료



《 74HC595 IC 핀배열》


▶ 실습 목표 :  


1. 아래 8bit 시프트 레지스터 도면과 같은 회로를 2단으로 연결 구성한다.

 

2. LED가 마치 16bit로 시프트(이동) 되도록 프로그래밍 한다. 



▶ 실습 회로도면 :

  (이미지 클릭하면 확대 가능)


2단 연결회로는 아래 회로에서 같은 부품과 회로를 우측에 똑 같이 하나 더 구성하여 연결 하면 된다. 

1. 둘째 단 IC의 시리얼 입력(14pin)은 첫 단 IC의 9번 핀에서 받도록 연결한다

즉, IC1의 9pin 과 IC2의 14pin 을 서로 연결해준다)

2. 둘째 딴의 Latch클럭(12pin)과 shift클럭(11pin)에는 첫 단 IC 핀과 묶어준다(동기화)




(2단 연결을 위해서는 괄호안의 수량 만큼 부품이 필요하다)





▶ 실습 절차  : 

1. 위 회로 연결 도면을 보며 착오가 없도록 연결해준다. LED의 +, - 극성 방향에 주의 해서 연결한다. 

2. 저항은 LED를 보호해 줄 수 있는 저항 값을 달아주면 되기에 가지고 있는 저항 중에 100Ω~470Ω 사이의 저항값이 있으면, 어떤 것이든 사용가능하다. 


3. IC가 동작하기 위한 전원(vcc-16번, Gnd-8번)은 반드시 인가 되어야 동작이 되며, 만약 +,-를 정반대로 인가할 경우 IC가 손상될 수 있으니 주의한다.


4. 2단 연결을 위해서는 위의 회로 연결 내용을 참고해서 연결 한다.

2단 연결회로는 같은 부품과 회로를 우측에 똑 같이 하나 더 구성하여 연결 하면 된다. 

1. 둘째 단 IC의 시리얼 입력(14pin)은 첫 단 IC의 9번 핀에서 받도록 연결한다

즉, IC1의 9pin 과 IC2의 14pin 을 서로 연결해준다)

2. 둘째 딴의 Latch클럭(12pin)과 shift클럭(11pin)에는 첫 단 IC 핀과 묶어준다(동기화)


아래 그림에서 9번 핀에서 8bit 데이터의 앞선 값이 계속 출력된다. 

이 핀의 출력을 다음 단의 입력으로 넣는 것이다.

   



▶ 프로그램 코드 및 설명 : 


const int SER=8;        // 아두 8핀 <-> 595IC Serial Data  (14)

const int LATCH=9;  // 아두 9핀 <-> 595IC  Latch CLK (12)

const int CLK= 10;    // 아두 10핀 <-> 595IC Shift CLK (11)

 

void setup() {

  //시프트 레지스터에 연결된 각 핀의 입출력 모드를 출력으로 지정

  pinMode(SER, OUTPUT);

  pinMode(LATCH, OUTPUT);

  pinMode(CLK, OUTPUT);

  shiftOut(SER, CLK, LSBFIRST, 0);

  shiftOut(SER, CLK, LSBFIRST, 0);

  Serial.begin(9600);

}

void loop() {     

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

   digitalWrite(LATCH, LOW);

   digitalWrite(SER, !(i%16));   //  15OFF ,1ON 

 //  1에서 15까지 나머지(%)1이 되고, 16배수 마다 나머지는 0, 

     LED를 켜기 위해 이것의 반대  (HIGH) 데이터로 삽입 (! 사용)

 // 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 ...

   Serial.println(!(i%16));

   digitalWrite(CLK, HIGH);   //Data1신호에 하나씩 쉬프트됨 

   digitalWrite(CLK, LOW);     //다음 클럭 신호 생성을 위해 OFF

   digitalWrite(LATCH, HIGH); //Latch신호로 shift레지스터의 데이터를 출력함

   delay(50);    }

}



1.  프로그램 코드를 파악할 때 맨 위쪽 《74HC595 핀배열 을 참고해서 본다면 파악하기가 훨씬 쉽다. 
2.  int 변수 선언에서 'const int' 라고 선언을 하면, 선언된 변수의 내용 값이 프로그램 내에서 어떤 계산이나 착오에 의해 변하는 것을 막고 싶을 때 선언하는 것이다. 때문에 이런 염려가 없을 경우는 그냥 'int' 로 선언 하면 된다. 

3.  '%'는 나머지 연산자로 앞의 값을 뒤의 값으로 나눈 후, 나머지 값을 나타내는 연산자이다. 
16개의 LED 중에 LED가 하나씩만 켜지도록 하기 위해 나머지 연산자(%)를 사용하였다. 따라서 프로그램에서 16으로 나누었기 때문에, 16번 째 LED마다 나머지 값은 '0'이 됨을 알 수 있다. 
단, 이때 회로 연결 구조상 LED는 HIGH 신호가 들어와야 켜지기 때문에, 이 값을 반대로 뒤집는 것이 필요하여 !(부정-반대) 연산자를 사용하여 16번째 마다 '1' 이 나오고 다른 순서에는 '0'의 값이 출력 되도록 한 것이다.


▶ 실행 결과 :

 (영상은 고화질로 설정하고 전체화면으로 보세요)


《천천히 동작》



《빠르게 동작》


※ LED 배열을 하트 모양으로 만들어 보면 , 아주 근사한 장식품이 될 것이다.


▶ 아두이노 파일(다운) :

LATCH74595_4.ino




반응형