반응형

 【 아두이노 센서#12】 시프트레지스터 Bit(연산자)제어 실습


※ 사전 학습하면 좋을 내용(앞선 강의)

☞  시프트 레지스터의 개념(시프트 레지스터 이해하기 ☜클릭)


 시프트레지스터 2단 연결 실습(데이지 체인-Daisy Chain 실습 ☜클릭)


 오늘은 2단으로 연결된 상태에서 비트제어 함수를 통해서 좀 모양나도록(?) LED를 제어해보고자 한다. 



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



《 74HC595 IC 핀배열》


▶ 실습 목표 :  


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

 

2. 8bit짜리의 LED를 차례로 하나씩 켜지도록 한다.(1단, 2단 회로 동시 동작)



▶ 실습 회로도면 :

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


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 데이터의 앞선 값이 계속 출력된다. 

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

   



▶ 비트(bit) 제어 관련 함수 정리 :



▶ 프로그램 코드 및 설명 : 


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)

byte x = B00000000;  // 바이트 의 값은 모두 ‘0’ 으로 초기화

 

void setup() {

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

  pinMode(SER, OUTPUT);

  pinMode(LATCH, OUTPUT);

  pinMode(CLK, OUTPUT);

}

void loop() {     

for (int i=1; i>=0; i--)          //  i 1에서 까지 감소 (LED On /Off)

  {

      for (int j=8; j>=0; j--)  // j 8에서 0까지 감소 (1~8번 LED On/Off)

      {

       digitalWrite(LATCH, LOW);    // 레지스터 값 변경하려는 신호 보냄

      shiftOut(SER, CLK, LSBFIRST,bitWrite(x,j,i));   // 1단 레지스터 (595 IC)

      shiftOut(SER, CLK, MSBFIRST,bitWrite(x,j,i));  // 2단 레지스터 (595 IC)

      digitalWrite(LATCH, HIGH);    //'HIGH' 입력으로 데이터 전송 끝을 알림

       delay (50); 

      }

  }


1.  프로그램 코드를 파악할 때 맨 위쪽 《74HC595 핀배열 을 참고해서 본다면 파악하기가 훨씬 쉽다. 

2.  int 변수 선언에서 'const int' 라고 선언을 하면, 선언된 변수의 내용 값이 프로그램 내에서 어떤 계산이나 착오에 의해 변하는 것을 막고 싶을 때 선언하는 것이다. 때문에 이런 염려가 없을 경우는 그냥 'int' 로 선언 하면 된다. 

3.  위 IC와 회로는 8bit 구조 이기 때문에 shiftOut() 함수를 두 개 연속으로 써주어야 두 개의 8bit LED가 같은 타이밍으로 동작하게 된다. 
4. 위 bit 연산자 함수 목록 중에 아래와 같은 연산자를 사용한 프로그래밍이다. 




▶ 실행 결과 :

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


《안에서 밖으로 켜기》





《밖에서 안으로 켜기》

아래 동작을 위해서는 

shiftOut() 함수를 아래와 같이 MSB 와 LSB 위치를 서로 바꾸어 주면 된다.

      shiftOut(SER, CLK, MSBFIRST,bitWrite(x,j,i));   // 1단 레지스터 (595 IC)

      shiftOut(SER, CLK, LSBFIRST,bitWrite(x,j,i));  // 2단 레지스터 (595 IC)




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


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




반응형