[Embedded] 아두이노와 7세그먼트로 시계만들기

1. 머리말

시프트 레지스터(74HC595)7-segemts 모듈을 사용하여 시계를 만드는 과정과 회로, 코드를 소개한다.

2. 사전 연구

  시프트 레지스터(shift register)는 데이터를 저장하거나 데이터를 옆으로 이동할 때 사용하는 회로이다. 디지털 시스템에서 시프트 레지스터와 같이 데이터 및 정보를 저장하고 이동하는 기능을 발전시켜 메모리라는 부품이 개발되고 프로세서와 CPU 등이 개발된다. 시프트 레지스터 중 실습에 사용한 74HC595에 대해 데이터 시트를 참고하여 핀번호와 기능에 대해서 알아본다.

1. 74HC595

[그림 1] 74HC595 pin map

 

  그림 174HC595의 핀 맵과 로직 다이어그램이다. 시프트 레지스터는 단방향 또는 양방향으로 매 클록마다 한 단씩 이진 정보를 이동시킬 수 있는 레지스터이다. 일련의 플립플롭 구조를 가지고 있다. 아래는 74HC595의 함수 기능도이다.

[그림 2] Function Table

아두이노 함수 중 ShiftOut() 함수를 이용하여 Shift Register를 제어한다.

shiftOut()은 한 번에 한 비트씩 바이트를 옮긴다. 최고(가장 왼쪽)또는 최저(가장 오른쪽)비트부터 각 비트에 클락(clock)핀은 하이(High)로 풀(Pull)되고, 다음 비트는 데이터 라인에서 읽히고 클락 핀은 로우(Low)된다. 각 비트는 차례대로 핀에 써지며, 각 클락 핀이 펄스되어(High이면 Low) 비트가 사용 가능함을 가리킨다. shiftOut()으로 데이터를 레지스터에 넣은 후 LatchLow에서 High로 변경하면 레지스터의 데이터가 보여지는 것이다.

  shiftOut()을 사용하기 위해 비트를 쓰는 함수인 bitWrite()의 인자는 3개를 가지며 첫 번째는 변수, 두 번째는 Bit 정보, 세 번째는 High 또는 Low이다. 2개의 74HC595를 이용하여 16개의 디지털 핀을 제어하기 위해서는 595Serial outSerial in에 연결되어야 하고 래치끼리도 서로 연결이 되어야 한다. 하지만 아두이노에는 3개의 시리얼 핀만 연결하면 .

2. 7-segment

  7-segment는 표시 장치의 일종으로, 7개의 파편(segmet)로 숫자나 문자를 나타낼 수 있다. 각 파편에는 LED가 내장되어 있어 점등으로 표시를 한다. A부터 G까지 7, DP 1, 8개의 LED가 내장되어 있다.

[그림 3] 7-segment 진리표

  [그림 3]과 같이 어떤 파편에 LED를 점등하느냐에 따라서 인간이 식별할 수 있는 숫자나 문자를 표현할 수 있다. 연결하는 핀의 번호와 위치에 따라 순서는 달라질 수 있다. 위의 그림을 참고하여 아래와 같은 코드로 숫자를 완성하였다.

[그림 4] segment 숫자 배열

 

3. 회로 구성

  74HC595를 직렬로 구성하기 위해서 먼저 첫 번째 레지스터와 아두이노를 연결한다.

[그림 5] 첫 번째 74HC595와 아두이노 연결

  아두이노의 2번 출력이 clockpin, 3번은 latch pin, 4번은 data pin과 연결해 준다. 두 번째 레지스터와 직렬로 연결하기 위해 clock pinlatch pin은 그대로 연결해 주고 첫 번째 레지스터의 반전된 출력을 두 번째 입력으로 연결한다. 3개 이상의 레지스터를 연결하기 위해서는 위의 과정을 반복해주면 된다. 레지스터의 출력 핀과 7-segment를 위치에 맞게 연결하고 전원을 연결해주면 회로가 완성된다.

[그림 6] 전체 회로도

  

  왼쪽 두개의 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에 현재 시간을 초로 나타낸 것을 대입하면 시계처럼 동작한다. 아래는 3540초를 나타낸 것이다.

 

다음으로 36 0초를 나타낸 것이다.


4. Reference

[1] 2개의74HC595 (쉬프트레지스터IC) 이용하여LED 제어, https://m.blog.naver.com/rlrkcka/220853507849

반응형

'Security > System' 카테고리의 다른 글

모의해킹 관점에서 본 Active Directory  (0) 2021.10.01