1. 머리말
시프트 레지스터(74HC595)와 7-segemts 모듈을 사용하여 시계를 만드는 과정과 회로, 코드를 소개한다.
2. 사전 연구
시프트 레지스터(shift register)는 데이터를 저장하거나 데이터를 옆으로 이동할 때 사용하는 회로이다. 디지털 시스템에서 시프트 레지스터와 같이 데이터 및 정보를 저장하고 이동하는 기능을 발전시켜 메모리라는 부품이 개발되고 프로세서와 CPU 등이 개발된다. 시프트 레지스터 중 실습에 사용한 74HC595에 대해 데이터 시트를 참고하여 핀번호와 기능에 대해서 알아본다.
1. 74HC595
그림 1은 74HC595의 핀 맵과 로직 다이어그램이다. 시프트 레지스터는 단방향 또는 양방향으로 매 클록마다 한 단씩 이진 정보를 이동시킬 수 있는 레지스터이다. 일련의 플립플롭 구조를 가지고 있다. 아래는 74HC595의 함수 기능도이다.
아두이노 함수 중 ShiftOut() 함수를 이용하여 Shift Register를 제어한다.
shiftOut()은 한 번에 한 비트씩 바이트를 옮긴다. 최고(가장 왼쪽)또는 최저(가장 오른쪽)비트부터 각 비트에 클락(clock)핀은 하이(High)로 풀(Pull)되고, 다음 비트는 데이터 라인에서 읽히고 클락 핀은 로우(Low)된다. 각 비트는 차례대로 핀에 써지며, 각 클락 핀이 펄스되어(High이면 Low) 비트가 사용 가능함을 가리킨다. shiftOut()으로 데이터를 레지스터에 넣은 후 Latch를 Low에서 High로 변경하면 레지스터의 데이터가 보여지는 것이다.
shiftOut()을 사용하기 위해 비트를 쓰는 함수인 bitWrite()의 인자는 3개를 가지며 첫 번째는 변수, 두 번째는 Bit 정보, 세 번째는 High 또는 Low이다. 2개의 74HC595를 이용하여 16개의 디지털 핀을 제어하기 위해서는 595의 Serial out이 Serial in에 연결되어야 하고 래치끼리도 서로 연결이 되어야 한다. 하지만 아두이노에는 3개의 시리얼 핀만 연결하면 된다.
2. 7-segment
7-segment는 표시 장치의 일종으로, 7개의 파편(segmet)로 숫자나 문자를 나타낼 수 있다. 각 파편에는 LED가 내장되어 있어 점등으로 표시를 한다. A부터 G까지 7개, DP 1개, 총 8개의 LED가 내장되어 있다.
[그림 3]과 같이 어떤 파편에 LED를 점등하느냐에 따라서 인간이 식별할 수 있는 숫자나 문자를 표현할 수 있다. 연결하는 핀의 번호와 위치에 따라 순서는 달라질 수 있다. 위의 그림을 참고하여 아래와 같은 코드로 숫자를 완성하였다.
3. 회로 구성
74HC595를 직렬로 구성하기 위해서 먼저 첫 번째 레지스터와 아두이노를 연결한다.
아두이노의 2번 출력이 clockpin, 3번은 latch pin, 4번은 data pin과 연결해 준다. 두 번째 레지스터와 직렬로 연결하기 위해 clock pin과 latch pin은 그대로 연결해 주고 첫 번째 레지스터의 반전된 출력을 두 번째 입력으로 연결한다. 3개 이상의 레지스터를 연결하기 위해서는 위의 과정을 반복해주면 된다. 레지스터의 출력 핀과 7-segment를 위치에 맞게 연결하고 전원을 연결해주면 회로가 완성된다.
왼쪽 두개의 7-segment부터 두 개씩 시, 분, 초를 뜻하는 시계가 된다. 작성한 코드는 아래와 같다.
int clockpin = 2;
int latchpin = 3;
int datapin = 4;
int speed = 1000; // 1초
int hour, min, sec, hour_t, min_t, sec_t, tmp;
int seg[10] = {
0b10000001,
0b11110010,
0b01001001,
0b01100000,
0b00110011,
0b00100100,
0b00000101,
0b11110000,
0b00000001,
0b00100000,
};
void setup()
{
pinMode(latchpin, OUTPUT);
pinMode(clockpin, OUTPUT);
pinMode(datapin, OUTPUT);
}
void loop(){
for (int z=0; z<86400; z++){
digitalWrite(latchpin, LOW); //전체 디스플레이 초기화
shiftOut(datapin, clockpin, MSBFIRST, 0);
shiftOut(datapin, clockpin, MSBFIRST, 0);
shiftOut(datapin, clockpin, MSBFIRST, 0);
shiftOut(datapin, clockpin, MSBFIRST, 0);
shiftOut(datapin, clockpin, MSBFIRST, 0);
shiftOut(datapin, clockpin, MSBFIRST, 0);
digitalWrite(latchpin, HIGH);
tmp = z; //초 -> 시, 분 ,초
hour = int(tmp/3600);
hour_t = int(hour/10);
hour = hour % 10;
tmp = tmp % 3600;
min = int(tmp/60);
min_t = int(min / 10);
min = min % 10;
sec = tmp %60;
sec_t = int(sec / 10);
sec = sec % 10;
digitalWrite(latchpin, LOW);
shiftOut(datapin, clockpin, MSBFIRST, seg[hour_t]); //시의 10자리
shiftOut(datapin, clockpin, MSBFIRST, seg[hour]); //시의 1자리
shiftOut(datapin, clockpin, MSBFIRST, seg[min_t]); //분의 10자리
shiftOut(datapin, clockpin, MSBFIRST, seg[min]); //분의 1자리
shiftOut(datapin, clockpin, MSBFIRST, seg[sec_t]); //초의 10자리
shiftOut(datapin, clockpin, MSBFIRST, seg[sec]); //초의 1자리
digitalWrite(latchpin, HIGH);
delay(speed); //1초씩 up
}
}
작동하는 모습은 다음과 같다. tinkercad에서 time.h 헤더를 include할 수 없어 z에 현재 시간을 초로 나타낸 것을 대입하면 시계처럼 동작한다. 아래는 3시 5분 40초를 나타낸 것이다.
다음으로 3시 6분 0초를 나타낸 것이다.
4. Reference
[1] “2개의74HC595 (쉬프트레지스터IC) 이용하여LED 제어”, https://m.blog.naver.com/rlrkcka/220853507849
'Security > System' 카테고리의 다른 글
모의해킹 관점에서 본 Active Directory (0) | 2021.10.01 |
---|