본문 바로가기

메이커 이야기/아두이노

[아두이노] 아두이노로 점수판 만들어 보기 part 2 _ 세븐세그먼트 이해

반응형

◎ 세븐세그먼트 이해하기


 세븐 세그먼트란?


전광판의 핵심은 뭐니 해도 세븐세그먼트를 잘다뤄야 한다. 우선, 세븐세그먼트에는 상당히 많은 종류가 존재한다.  1 자리수 표현하는 세그먼트, 2자리, 3자리, 4자리 까지는 쉽게 구할 수 있는 것 같다.

네이버에 쉽게 찾아만 봐도 세븐 세그먼트를 구할 수 있다.



     



일단, 내가 만들고자 하는 부분은 정확한 컨셉이 있기 때문에 2자리 숫자를 표현하는 세그먼트로 선정!


세그먼트를 잘 살펴 보자. 세븐 세그먼트는  a~g같이 7개의 신호를 통해서 모든 숫자가 표현 가능하다. 그래서 세븐 세그먼트 인 셈이다. 각 명칭은 아래와 같이 형성되어 있다.




여기서 LED의 경우에는 Cathode Type과 Anode Type이 존재하므로, 세븐 세그먼트를 구매 하거나 혹은 전압을 걸어보면 다이오드의 방향을 확인 할 수 있다.


내가 선택한 세븐세그먼트는 Cathode Type !!! 


Cathode type의 경우 10 pin, 5 pin의 경우 GND로 연결 하고 a~f 신호에 HIGH값을 주게 되면 불이 켜지는 구조이기 때문에, Type은 꼭 체크를 해야한다!!




 세븐 세그먼트 구조



세그먼트는 위와 같은 구조로 되어 있다. 여기서 숫자는 뭘의미하는지 처음에는 왼쪽에서 아래에서 부터 1이 A를 의미하나 싶었지만, 그게 아니다. 덕분에 하나하나 내가 찍어보면서 들어오는 불로 체크를 진행했다.

나의 세그먼트의 경우 위와 같이 핀이 구성되어 있었다. 



 회로 연결 하기


회로의 연결은 생각보다 간단하다. A~F까지 모두 Digital Pin에 연결하고, 나머지 Digit 1, Digit 2만 연결해보면 된다. 




 
물론 위와 같이 해서 끝나는 것은 아니지만, 우선 2자리 값들이 잘 나오는지 확인 하는 것이 중요!! 

세븐세그먼트의 회로 특성상 전체에 값이 동일하게 표현이 되기 때문에, 약간의 눈속임이 필요하다. 2자리를 표현한다고하면, 앞에 숫자가 나올때는 뒷 세그먼트 불빛을 HIGH로 바꾸고, 반대로 뒷자리가 나올때는 앞의 불빛을 끈다. 

이를 빠르게 하면 두 자리 숫자가 잘 보이는 걸 확인 할 수 있다.

1차 불빛이 나오는지 테스트 해보기 
코드는 허접하지만 ;; 잘 나온다!~! 
하지만 여기에 맹점이 있다. Delay 함수를 사용해서 값의 변화를 표현하기에는 한계가 있다. 따라서, mill()함수를 사용해서 delay 없이 값을 표현하는 방법을 선택해보자 !!! 
#define A 2
#define B 3
#define C 4
#define D 5
#define E 6
#define F 7
#define G 8

#define digit1 11
#define digit2 10

const int segs[7] = { A, B, C, D, E, F, G };

const int numbers[10][7] = { 
  {1,1,1,1,1,1,0},
  {0,1,1,0,0,0,0},
  {1,1,0,1,1,0,1},
  {1,1,1,1,0,0,1},
  {0,1,1,0,0,1,1},
  {1,0,1,1,0,1,1},
  {1,0,1,1,1,1,1},
  {1,1,1,0,0,1,0},
  {1,1,1,1,1,1,1},
  {1,1,1,1,0,1,1},
 };
void setup() {
  for(int i=0; i<7; i++){
    pinMode(segs[i],OUTPUT);
  }
    pinMode(digit1, OUTPUT);
    pinMode(digit2, OUTPUT);
}
 
int number = 51;
int num1 = number/10;
int num2 = number%10;

void loop() {
  lightnumber1(num1);
  delay(10);
  lightnumber2(num2);
  delay(10);
}

void lightnumber1(int num1){
   digitalWrite(digit1, LOW);
   digitalWrite(digit2, HIGH);
   for(int i=0; i<7; i++){
      digitalWrite(segs[i],numbers[num1][i]);
   }
}
void lightnumber2(int num2){
   digitalWrite(digit1, HIGH);
   digitalWrite(digit2, LOW);
   for(int i=0; i<7; i++){
      digitalWrite(segs[i],numbers[num2][i]);
   }
}





반응형