【 아두이노 센서#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단 연결을 위해서는 괄호안의 수량 만큼 부품이 필요하다)
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)); // 15회 OFF ,1회 ON
// 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); //Data가 1신호에 하나씩 쉬프트됨
digitalWrite(CLK, LOW); //다음 클럭 신호 생성을 위해 OFF
digitalWrite(LATCH, HIGH); //Latch신호로 shift레지스터의 데이터를 출력함
delay(50); }
}
16개의 LED 중에 LED가 하나씩만 켜지도록 하기 위해 나머지 연산자(%)를 사용하였다. 따라서 프로그램에서 16으로 나누었기 때문에, 16번 째 LED마다 나머지 값은 '0'이 됨을 알 수 있다.
단, 이때 회로 연결 구조상 LED는 HIGH 신호가 들어와야 켜지기 때문에, 이 값을 반대로 뒤집는 것이 필요하여 !(부정-반대) 연산자를 사용하여 16번째 마다 '1' 이 나오고 다른 순서에는 '0'의 값이 출력 되도록 한 것이다.
▶ 실행 결과 :
(영상은 고화질로 설정하고 전체화면으로 보세요)
《천천히 동작》
《빠르게 동작》
※ LED 배열을 하트 모양으로 만들어 보면 , 아주 근사한 장식품이 될 것이다.
▶ 아두이노 파일(다운) :
'아두이노 > 2. 아두이노센서' 카테고리의 다른 글
【 아두이노 센서#13】 TC74 온도센서 활용하기 1 (0) | 2018.12.20 |
---|---|
【 아두이노 센서#12】 시프트레지스터 Bit(연산자)제어 실습 (0) | 2018.12.19 |
【 아두이노 센서#10】 나이트 라이더 만들어보기 (0) | 2018.12.14 |
【 아두이노 센서#9】 시프트 레지스터 이해하기 실습1 (0) | 2018.12.13 |
【 아두이노 센서#8】 시프트 레지스터 이해하기 (Shift Register) (0) | 2018.12.12 |