초급 예제

누구나 쉽게 따라해볼 수 있는 쉬운 예제들입니다. 가볍게 도전~!

시프트 레지스터-다수의 LED 깜빡이기

2015-01-23 10:13:15

시프트 레지스터란?



플립플롭(flip-flop) 또는 래치(latch)라고도하는, 0과 1만을 갖는 1비트 값을 저장할 수 있는 기본 회로가 있습니다.

레지스터란 이런 플립플롭을 여려 개 일렬로 연결하여, 여러 비트로 구성한 2진수를 저장할 수 있게 한 것을 말합니다.

 

 

 


 

이 예제에서 사용된 8bit 시프트 레지스터는 8개의 플립플롭이 연결되어 있으며, 단방향 또는 양방향으로 매 클럭펄스마다, 한 플립플롭 씩 저장된 값을 좌우로 이동시킬 수 있는 레지스터입니다. 여기서 클럭 펄스란 일정한 간격을 갖는 전기적 펄스로 회로내의 동작을 동기화하는데 사용됩니다.  (전기적 펄스에 대한 내용은 2.3 아날로그와 디지털, 2.4 펄스 폭 변조를 참고합니다.)

 

시프트레지스터의 용도로서 대표적인 것은 데이터의 직렬-병렬변환(SIPO : Serial In Parallel Out)으로 직렬입력으로 다중 출력을 만들어 낼 수 있습니다. 이 예제에서는 오렌지보드의 핀 3개를 사용하여 8개의 LED 를 제어 해 봅니다.
 

 

 

 

 

시프트 레지스터 사용방법



시프트 레지스터는 핀마다 고유의 기능이 있으므로 연결시 방향에 주의 합니다.

홈이 파진 부분을 위로 향하게 했을때를 기준으로 좌측 상단에 있는 핀이 1번 핀이 되며,  총 16개의 핀으로 구성되어 있습니다.
 


 

 

 

 

 

부품 목록

NO 부품명 수량 상세설명
1 오렌지 보드 1  
2 시프트 레지스터 1 SN74HC595N
3 LED 8 LED 색상 무관
4 브레드 보드 1  
5 점퍼케이블  18  

 

부품명 오렌지 보드 시프트 레지스터 LED 브레드 보드 점퍼케이블
파트

 

 

 

 

 

 

하드웨어 making



1. 오렌지보드의  5V핀을 브레드보드의 +버스에 연결합니다.

2. 오렌지보드의 GND핀을 브레드보드의 -버스에 연결합니다.

3. 시프트 레지스터를 그림과 깉이 홈이 위로가게하여, 양쪽 IC영역에 걸치도록 꽂습니다.

4. LED 8개를 캐소드(짧은 단자)가 반대쪽의 -버스에 연결되도록 꽂습니다.

5. 각 LED의 애노드(긴 단자)에 330Ω 저항을 연결합니다.

6. 시프트 레지스터의 15, 1, 2, 3, 4, 5, 6, 7번핀을 8개의 LED 애노드에 각각 연결합니다.

7. 시프트 레지스터의 8번핀과 13번을 -버스에 연결합니다.

8. 시프트 레지스터의 10번핀과 16번핀을 +버스에 연결합니다.

9. 시프트 레지스터의 12번핀을 오렌지보드 2번핀에 연결합니다.

10. 시프트 레지스터의 11번핀을 오렌지보드 3번핀에 연결합니다.

11. 시프트 레지스터의 14번핀을 오렌지보드 4번핀에 연결합니다.

12. 8개의 LED 캐소드가 연결된 -버스를 오렌지보드 GND와 연결된 -버스와 연결합니다. 



 

 

 

소프트웨어 coding


 

  1. /*
  2.   제목    : 시프트 레지스터로 다수 LED 깜빡이기
  3.   내용   : 시프트 레지스터로 8개의 LED를 한번에 깜빡이게 해봅니다.
  4. */
  5.  
  6. // 클럭 입력이 활성화되면, 입력을 받아 저장하고, 클럭 입력이 비활성화되면 출력 측으로 전달합니다.
  7. // 출력은 클록이 다시 활성화될 때까지 그 값을 유지할 것이다.
  8. int latch = 2;
  9.  
  10. // 클럭펄스를 발생시켜 데이터 값이 레지스터에 저장되도록 합니다.
  11. int clock = 3;
  12.  
  13. // 이 데이터 핀을 통해 시프트 레지스터에 원하는 동작을 수행하게 합니다.
  14. int data = 4;
  15.  
  16. // 실행시 가장 먼저 호출되는 함수이며, 최초 1회만 실행됩니다.
  17. // 변수를 선언하거나 초기화를 위한 코드를 포함합니다.
  18. void setup() {
  19.   // latch, clock, data부분이 연결된 핀을 OUTPUT으로 설정합니다.
  20.   pinMode(latch, OUTPUT);
  21.   pinMode(clock, OUTPUT);
  22.   pinMode(data, OUTPUT);
  23. }
  24.  
  25. // setup() 함수가 호출된 이후, loop() 함수가 호출되며,
  26. // 블록 안의 코드를 무한히 반복 실행됩니다.
  27. void loop() {
  28.   //8개의 LED를 한 개씩 켜고 끕니다.
  29.   for (int i = 0 ; i < 8 ; i++) {
  30.     // latch의 비활성화하여 데이터를 입력받도록 설정합니다.
  31.     digitalWrite(latch, LOW);
  32.     // 데이터로 입력된 값을 클럭 펄스로 동기화하여 시프트 레지스터에 저장합니다.
  33.     shiftOut(data, clock, MSBFIRST, 1 << i);
  34.     // latch를 활성화하여 저장된 입력된 데이터를 출력핀으로 전달합니다.
  35.     digitalWrite(latch, HIGH);
  36.     // 1초간 대기합니다.
  37.     delay(1000);
  38.   }

 

TIP 

MSBFIRST - Most Significant Bit First의 약자로 가장 중요한 비트(자릿수가 가장 큰 왼쪽) 라는 뜻입니다.

LSBFIRST - Least Significant Bit First의 약자로 가장 중요도가 낮은 비트 먼저(자릿수가 가장 낮은 오른쪽) 라는 뜻입니다.

 

 

 

 

 

 

 

 

비트연산자(>>, <<)

 

시프트레지스터는 1비트씩 제어를 통해 여러 핀을 동시에 제어하게되는데 이때 비트를 제어하기 위해서는 비트연산자를 사용합니다.

위 코드에서는 비트이동연산자라고 불리는 <<, >>를 사용합니다.

 

<<는 왼쪽으로 비트를 이동하라는 명령어이고

>>는 오른쪽으로 비트를 이동하라는 명령어입니다.

 

 

예를 들어 1<<2라면 1을 왼쪽으로 2칸 이동하라는 의미로 결과값은 100이 출력됩니다.

이동하면서 생기는 공간은 0으로 채워집니다.

 

 

주의할 점은 8<<1이라해서 8이 한 칸 왼쪽으로 이동해서 80이 되는것이 아닌 비트는 이진수 단위이기 때문에

8을 이진수로 변환하면 0b1000이고 그래서 결과값은 0b1000이 왼쪽으로 한 칸 이동한 0b10000 = 16이 됩니다.

 

 

결국 왼쪽으로 한칸씩 이동할때마다 원래값에서 x2가 된다고 이해가 되면 편합니다. 

반대로 오른쪽으로 한칸씩 이동하면 /2가 됩니다.

 

 

 

 

 

 

코드실행

 

코드에서는 for문에 의해 i값이 0부터 7까지 증가하고 증가한 값만큼 1의 비트가 왼쪽으로 이동합니다.(1<<i)

 

따라서 위의 코드를 실행하면 다음과 같은 LED의 깜빡임을 볼 수 있습니다.

 

 

MSB          LED1     LED2     LED3     LED4     LED5     LED6     LED7     LED8             LSB
꺼짐     꺼짐      꺼짐      꺼짐      꺼짐      꺼짐      꺼짐     켜짐
꺼짐     꺼짐      꺼짐      꺼짐      꺼짐      꺼짐      켜짐     꺼
꺼짐     꺼짐      꺼짐      꺼짐      꺼짐      켜짐      꺼짐     꺼
꺼짐     꺼짐      꺼짐      꺼짐      켜짐      꺼짐      꺼짐     꺼
꺼짐     꺼짐      꺼짐      켜짐      꺼짐      꺼짐      꺼짐     꺼
꺼짐     꺼짐      켜짐      꺼짐      꺼짐      꺼짐      꺼짐     꺼
꺼짐     켜짐      꺼짐      꺼짐      꺼짐      꺼짐      꺼짐     꺼
켜짐     꺼짐      꺼짐      꺼짐      꺼짐      꺼짐      꺼짐     꺼
 

 

 

 

※ 아래의 영상은 위 코드에서 LED의 깜빡임 delay()수치를 조정하였습니다.

 

 

 

 

 

 

kocoafabeditor

항상 진취적이고, 새로운 것을 추구하는 코코아팹 에디터입니다!

시프트 레지스터, 아두이노, 오렌지보드

물공 2016-02-17 13:57:39

shiftOut(data, clock, MSBFIRST, 1 << i);
여기서 이 뜼이 data와 clock 핀은 이용한 오른쪽 부터 시작을 한건데 왼쪽으로 1비트씩 이동시킨다는 뜻 인가요??????

kocoafab 2019-01-07 18:05:21

1<<1이면 왼쪽으로 1칸, 1<<2면 왼쪽으로 2칸씩 이동합니다.
for문을 통해 i가 계속 증가하니 LED는 한칸씩 왼쪽으로 이동하게 됩니다.

Alice6988 2021-06-30 01:28:09

저항은 어떤걸 쓰셨나요?