반응형

 【 아두이노 센서#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 배열을 하트 모양으로 만들어 보면 , 아주 근사한 장식품이 될 것이다.


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




반응형
반응형

 【 아두이노 센서#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




반응형
반응형

 【 아두이노 센서#10】 나이트 라이더 만들어보기


지난시간 시프트 레지스터의 개념(시프트 레지스터 이해하기☜클릭)과 홀 수 번째 LED를 켜보는 실습(시프트 레지스터 실습1☜클릭)을 해 보았다. 


 오늘은 조금 응용해서 Light Rider 라는 것을 만들어 볼 것이다. 


오래전 한국에 방영된 전격Z작전과 리메이크작 미드 Knight Rider 에서 이름을 따서 Light Rider라 지었다. 드라마에서 '키트'라고 불리는 인공지능 무적 스포츠카 앞부분에 달린 LED의 동작 형태를 따라 만든 것이다. 


 지금은 구리(?)지만... 센세이셔널 했던 당시 미드를 잠시 감상해보자





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



《 74HC595 IC 핀배열》


▶ 실습 목표 :  


1. 8bit 시프트 레지스터 IC 이기 때문에, LED 8개를 연결한다. 

 

2. LED의 불 빛 하나가 좌에서 우로, 다시 우에서 좌로 연속으로 이동하듯 켜지는 동작이 반복되도록 한다. 



▶ 실습 회로도면 :

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





(괄호 안은 2단으로 연결할 경우 필요 수량)





▶ 실습 절차  : 

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

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


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



▶ 프로그램 코드 및 설명 : 


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)


// LED 점등을 10진수로 계산한 값을 배열로 저장 

int seq[14]={ 1, 2, 4, 8, 16, 32, 64, 128, 64, 32, 16, 8, 4, 2 };

 

void setup() {

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

  pinMode(SER, OUTPUT);

  pinMode(LATCH, OUTPUT);

  pinMode(CLK, OUTPUT);


}

void loop() {     

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

   digitalWrite(LATCH, LOW);              //LATCHLOW 입력

   shiftOut(SER, CLK, MSBFIRST, seq[i]); // 배열의 인덱스(i) 값 전송

   digitalWrite(LATCH, HIGH);             //LATCHHIGH 입력

   delay(100);                                     // delay값으로 LED켜지는 속도 조절

   }   

}



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

3.  "int seq[14]={1,2,4 ... "을 살펴보자, LSB(최하위비트)에서 MSB(최상위비트)로 LED가 하나씩만 켜질 수 있는 10진 값을 배열형태로 잡아 놓은 것이다. 최상위비트(값:128)를 켠 다음에는 다시 하위비트로 내려가는 방향으로 배열이 구성되어 있다.


▶ 실행 결과 :

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



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

Latch_LightRider.ino


반응형
반응형

 【 아두이노 센서#9】 시프트 레지스터 이해하기 실습1

지난시간 시프트 레지스터의 개념에 대해 다루었다.(시프트 레지스터 이해하기

☜클릭).  

이제 이어지는 몇 가지 실험을 잘 수행 한다면 시프트 레지스터를 능숙히 다룰 수 있을 것이다. 



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



《 74HC595 IC 핀배열》


▶ 실습 목표 :  


1. 8bit 시프트 레지스터 IC 이기 때문에, LED 8개를 연결하고,  데이터(2진 값) 예, '10101010' 혹은 '01010101' 등을 LED로 시프트 시켜 표시해보는 실습이다. 

 

2. 예를 들어, 짝수번째 LED 켜기, 홀수 번째 LED켜기, 11110000, 00001111, 11001011, 등등 원하는 데이터를 아두이노에서 IC에 시리얼로 입력하면 패러럴(병렬) 형태로 LED로 나타낼 수 있다. 


▶ 실습 회로도면 :

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





(괄호 안은 2단으로 연결할 경우 필요 수량)





▶ 실습 절차  : 

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

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


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



▶ 프로그램 코드 및 설명 : 


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);

  digitalWrite(LATCH, LOW);

  // 비트값 10101010 전송 (2진 값을 10진 값으로(170) 바꾸어본다

  shiftOut(SER, CLK, MSBFIRST, B10101010); 

  //LATCHHIGH 입력 : 홀수 LED 점등

  digitalWrite(LATCH, HIGH);

}

void loop() {     

          // Loop 문에는 비워 놓는다

}



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

3.  shiftout() 함수 속 데이터 값은 2진 값 형태로 입력이 가능하고 10진값 등의 형태로도 입력이 가능하다. 따라서 B10101010을 10진값으로 변환하면 '170'이 되고 이값을 그대로 입력해도 똑같은 결과를 얻을 수 있다. 만약 2진 ↔ 10진 변환을 손쉽게 하고 싶다면, 윈도우에 있는 계산기(calculator)를 실행시키고 옵션에 공학용 계산기로 변환하면 2진, 8진, 10진, 16진 값을 동시에 확인 할 수 있어 편리하다.

▶ 실행 결과 :

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



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

01_shift-Register.ino


반응형
반응형

 【 아두이노 센서#8】 시프트 레지스터 이해하기 (Shift Register)

오늘은 시프트 레지스터에 대해 다루어 보고자 한다. 시프트 레지스터를 활용하면 여러개의 포트를 사용하여 병렬로 제어할 수 밖에 없는 상황에서, 한 두개의 시리얼 라인으로 제어가 가능한 장점이 있다. 이를 위해서는 시프트 기능을 구현해주는 레지스터 구조로 되어 있는 IC인 74HC595 칩을 활용 하면 된다. 



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


《상세 스팩》


《로직 다이어그램》


1. 아래 이미지에서 보면 SER(시리얼 데이터)가 첫 번째 레지스터에 입력되고 동기클럭신호(SRCLK) 에 따라 다음단의 레지스터로 차례로 시프트(이동)된다. 


2. 모든 데이터(8bit)가 스토리지 레지스터(버퍼)로 이동된 상태가 되면,  RCLK(래치 클럭) 신호에 의해 외부로 동시에(병렬) 출력이 된다.  이 때 3-state 버퍼라고 하는 것이 출력에 달려있는데, OE(아웃 인에이블) 단자로 출력을 할지? 말지?(홀드)를 조절 가능하다.  



《 핵심 개념 》


※ 아래 이미지를 보면 마지막 시프트 레지스터의 출력 단자에서 나오는 출력이 보일 것이다.(Serial data output) 이 단자를 두 번째 시프트 레지스터의 시리얼 데이터 입력으로 넣게 되면, 다단 연결이 가능하게 된다. 이런 식으로 3단, 4단,  다단연결이 가능하게 된다.








1. 먼저 버퍼(Buffer)란? 무엇인지 살펴보자,  아래 이미지에서 AND게이트에서 나오는 출력 C부분에 Buffer를 연결하였다. 

 보통의 경우 C에서 나오는 출력 값(예, 5V)의 레벨이 떨어져 나오는 경우가 발생할 수 있다. 그런 신호를 사용하면 회로에서 원하는 결과를 얻지 못 할 수 있다. 이 때 버퍼를 한 단계 거치게 되면 버퍼에 공급되는 전원을 출력하는 형태가 되기 때문에 출력레벨을 원래대로 맞출 수 있는 장점이 있어 사용하게 된다. 

 또한 결과적으로 출력값을 한 스텝 저장(홀드)하게 된다. 


2.  두 개 이상의 게이트를 직결할 경우를 생각해보자, 

 AND1에서의 출력과 AND2에서의 출력을 하나의 라인으로 이용하고자 연결한 것이겠지만,  AND1과 AND2에서 동시에 데이터가 출력이 되었을 때 문제가 된다. 


만약 AND1에서 HIGH 신호가 나오고, AND2에서 LOW 신호가 동시에 나오면?   HIGH 신호가 될까? LOW 신호가 될까? (마치 5V 선과 0V 선을 이어 붙인 것이나 다름없다)  

또한 AND1에서 나온 X 출력이 F단자로 빠져나가기도 하겠지만, AND2의 출력단자 Y로도 역입력이 되게 되는데, 이는 무리가 가게 되고 경우에 따라서는 손상을 입힐 수도 있다. 



2-1.  따라서 아래 이미지 처럼 각 AND게이트 각 출력단에 3state 버퍼를 연결하여 이런 문제를 해결하게 된다. 


   3 state란? 세 가지 상태를 말하는데, 0(LOW) 출력상태, 1(HIGH) 출력상태,  Hi-임피던스 상태를 말한다. 

- EN(인에이블) 단자를 이용해서 0과 1을 출력하게 만들거나(Enable 단자 On) 

- 다른 곳의 출력이 여기에 되먹임 되지 않도록(손상이 가지 않도록)  '고 임피던스'(High 저항) 상태로 만들수 있다(Enable 단자 Off). 






반응형