7 Segment LED 제어(아두이노)

in #kr-newbie2 years ago (edited)

7 Segment LED 제어(아두이노)



오늘은 LED 제어의 연장선상으로 7 Segment LED를 제어해 보도록 하겠습니다. 사용될 함수는 LED 제어때 사용한 pinMode( ), digitalWrite( )만 이해하시면 쉽게 제어를 할 수 있습니다.

1. 7 Segment LED

A,B,C,D,E,F,G,DP 핀으로 총 8개의 핀으로 구성되어 있습니다. 각 핀은 위 그림에서 보는것 같지 해당 위치의 LED에 불을 제어하는 핀으로 생각하시면 됩니다. 실제로 구매하시면 애노드형과 캐소드형이 있는데 위아래핀이 애노드 7 Segment LED이고 좌우고 캐소드였나 암튼 가상시뮬레이터에서 사용하는게 애노드형 초기 기본으로 되어 있는데 속성창에서 캐소드형으로 바꿔서 실험할 수 있습니다.

애소드와 캐소드 차이

7 Segment LED핀들이 가상시뮬레이터에서는 핀에서 COM1, COM2 핀이 있는데 아무핀이나 하나에 5V(+)핀이면 애노드형이고 Gnd(-)핀이면 캐소드형이 됩니다.

  1. 애노드 : A~G,DP핀이 0V이고 COM1 or COM2가 5V이면 해당 핀 LED에 불이 들어옵니다.
  2. 캐소드 : A~G,DP핀이 5V이고 COM1 or COM2가 Gnd이면 해당 핀 LED에 불이 들어옵니다.

쉽게 말해서 서로 반대라고 생각하시면 됩니다. 애노드형은 출력핀이 0일때 LED에 불이 들어오고 캐소드형은 출력핀이 1일때 LED에 불이 들어온다는 것만 이해하시면 됩니다. 참고로 7 Segment LED를 구매하실때 제품이 애노드형인지 캐소드형인지 확실히 확인하시고 구매하세요. 그래야 햇갈리는 핀연결과 코딩을 하지 않습니다.

2. 회로도 구성


  • 준비물 : 7 Segment LED 1개, 저항 330옴 1개, 아두이노우노
  • 내용 : 알파벳과 숫자를 출력해보자.

애노드형모델캐소드형모델

대충 붉은선이 5V에 연결되어 있고 검은선이 Gnd에 연결된 모습을 보면 대충 알겠죠.

##3. 코딩

  • 사용함수 : pinMode( ), digitalWrite( )
  • 내용 : 애노드형모델 기반으로 알파벳과 숫자를 순차적으로 출력하는 코딩을 해보자.

  • 7 Segment LED의 각 led 제어 :
    pinMode(핀, 모드)으로 전류를 출력할 핀들을 출력모드(OUTPUT) 사용하겠다고 선언
    digitalWrite(핀, 상태)은 HIGH(5V) or LOW(0V)로 전류를 출력할지 말지를 결정(여기서, 1은 5V, 0은 0V)

7 Segment LED도 내부에 LED들을 제어하기 때문에 LED 제어할때랑 동일합니다. 애노드형이기 때문에 0일때 불이 들어고 1일때 불이 꺼진다는 것만 생각하시고 코딩에 들어가세요. LED 제어의 복습차원이라고 생각하시면 됩니다. 참고로 알파벳과 숫자를 만드는 수작업인 노가다가 필요합니다.

설계

(1) 알파벳(A,B,C,D,E,F)과 숫자(0,1,2,3,4,5,6,7,8,9) 만들기


A글자 만들려면 LED D핀이 꺼지고 나머지 핀들이 켜져야 겠죠.(켜기=0, 꺼지기=1)

00010000

배열로 A[8]={0,0,0,1,0,0,0,0} 이 된다. 이건 하나의 A글자의 패턴입니다. 그러면 각 글자와 숫자의 패턴을 배열변수로 만들어야겠죠. 참고로, 앞에 7개는 글자나 숫자를 만드는 핀이고 마지막 8번째는 DP핀으로 점 LED 입니다. 0을 설정한 이유는 그냥 점 LED를 켜지는 것을 테스트 목적인것이지 의미는 없다는 점 참고하세요. 점 LED 빼고 싶다면 00010001 이러면 되겠죠.
아래 2차배열로 표현할때 점 LED은 글자가 출력할때 그냥 같이 켜지게 했고 숫자가 출력할때에 그냥 꺼지게 했어요. 원래 여러개 연결한다면 소숫점으로 사용하면 좋겠는데 한개 7 Segment LED라서 그냥 테스트로 켜지는지 보기위한 실험으로 의미는 없습니다.

int segValue[16][8] = {
   {0,0,0,1,0,0,0,0}, //A
   {1,1,0,0,0,0,0,0}, //B
   {1,1,1,0,0,1,0,0}, //C
   {1,0,0,0,0,1,0,0}, //D
   {0,1,1,0,0,0,0,0}, //E
   {0,1,1,1,0,0,0,0}, //F
   {0,0,0,0,0,0,1,1}, //0
   {1,0,0,1,1,1,1,1}, //1
   {0,0,1,0,0,1,0,1}, //2
   {0,0,0,0,1,1,0,1}, //3
   {1,0,0,1,1,0,0,1}, //4
   {0,1,0,0,1,0,0,1}, //5
   {0,1,0,0,0,0,0,1}, //6
   {0,0,0,1,1,1,1,1}, //7
   {0,0,0,0,0,0,0,1}, //8
   {0,0,0,0,1,0,0,1}  //9  
};

(2) 알파벳과 숫자를 만들었다면 실제 출력해야겠죠.

  • 핀배열 변수 선언 :
int segPin[8]={2,3,4,5,6,7,8,9}; 
  • 출력핀모드 선언 :
for(int i=0;i<9;i++){
    pinMode(segPin[i], OUTPUT);
  }
  • 출력 : 이부분이 실제 코딩 로직의 전부입니다. 각 패턴를 for문으로 루프 도는게 전부임
for(int i=0;i<16;i++){ //16패턴
  for(int j=0;j<8;j++){ //패턴값
   digitalWrite(segPin[j], segValue[i][j]);        
}
  delay(1000);
}  

애노드형모델 코딩을 실제 하면은

int segValue[16][8] = {
   {0,0,0,1,0,0,0,0}, //A
   {1,1,0,0,0,0,0,0}, //B
   {1,1,1,0,0,1,0,0}, //C
   {1,0,0,0,0,1,0,0}, //D
   {0,1,1,0,0,0,0,0}, //E
   {0,1,1,1,0,0,0,0}, //F
   {0,0,0,0,0,0,1,1}, //0
   {1,0,0,1,1,1,1,1}, //1
   {0,0,1,0,0,1,0,1}, //2
   {0,0,0,0,1,1,0,1}, //3
   {1,0,0,1,1,0,0,1}, //4
   {0,1,0,0,1,0,0,1}, //5
   {0,1,0,0,0,0,0,1}, //6
   {0,0,0,1,1,1,1,1}, //7
   {0,0,0,0,0,0,0,1}, //8
   {0,0,0,0,1,0,0,1}  //9  
};
int segPin[8]={2,3,4,5,6,7,8,9}; //사용핀{a,b,c,d,e,f,g,dp} 순서대로임

void setup() {

  for(int i=0;i<9;i++){
    pinMode(segPin[i], OUTPUT);
  }
}
void loop() {
  for(int i=0;i<16;i++){
    for(int j=0;j<8;j++){
     digitalWrite(segPin[j], segValue[i][j]);        
  }
    delay(1000);
  }  
}

for문에 대해서 저번에 설명을 했으며 for문을 이해해야만 왜 이렇게 코딩이 되었는지 이해가 되실꺼에요.
혹시 이해가 안되시는 분들은 LED 제어(아두이노)를 다시 한번 보시고 간단히 소개된 for문을 보시고 대충 어떤 느낌인지 살펴보세요.

여기서 캐소드형 경우는

패턴배열변수값들을 반대로 하시면 됩니다.

int segValue[16][8] = {
   {1,1,1,0,1,1,1,1}, //A
   {0,0,1,1,1,1,1,1}, //B
   {0,0,0,1,1,0,1,1}, //C
   {0,1,1,1,1,0,1,1}, //D
   {1,0,0,1,1,1,1,1}, //E
   {1,0,0,0,1,1,1,1}, //F
   {1,1,1,1,1,1,0,0}, //0
   {0,1,1,0,0,0,0,0}, //1
   {1,1,0,1,1,0,1,0}, //2
   {1,1,1,1,0,0,1,0}, //3
   {0,1,1,0,0,1,1,0}, //4
   {1,0,1,1,0,1,1,0}, //5
   {1,0,1,1,1,1,1,0}, //6
   {1,1,1,0,0,0,0,0}, //7
   {1,1,1,1,1,1,1,0}, //8
   {1,1,1,1,0,1,1,0}  //9  
};

코딩에서는 for문을 사용해서 led 출력핀들의 모드와 출력상태를 표현하는 것과 2차배열로 7 Segment LED패턴을 표현하는 것 두개뿐이 없습니다. 패턴을 2차배열로 표현하는 노가다 작업만 있을 뿐이죠.

4. 결과


애노드형 모델을 실험 동영상입니다.

마무리


LED 제어의 연장선상의 7 Segment LED제어를 해 보았습니다. 한개짜리지만 실제 4개짜리로 묶여진 부품도 있어서 좀 더 다양한 표현을 할 수 있습니다. 글자나 숫자를 출력할 수 있으면 이걸로 많은걸 표현이 가능합니다.

실생활에서 보면 시계를 떠오르시는분들이 많겠죠. 또는 거리에 나가면 가장 가깝게 신호등에 숫자가 출력되는걸 보실 수 있을꺼에요. 그러면 아두이노로 신호등을 만들고 7 Segment LED로 신호등의 타이머로 현실과 비슷하게 표현을 가능하겠죠. 이걸 대충요 종이로 신호등을 만들어서 제어하면 아이들에게 재밌는 교통 교육용이 될 수 있겠죠.

오늘 배운 패턴 배열변수는 무척 중요합니다. 꽤 많이 사용하는 2차배열변수인데요. 다음에 LED CUBE나 8x8 도트매트릭스를 소개할지 모르겠지만 계속해서 사용합니다. 배열변수를 혹시 모르시겠다면 관련글들을 검색해서 꼭 공부해주세요.

Sort:  

스스로 홍보하는 프로젝트에서 나왔습니다.
오늘도 좋은글 잘 읽었습니다.
오늘도 여러분들의 꾸준한 포스팅을 응원합니다.

방문해주셔서 감사합니다.

If You Follow upvote comment and resteem me i will do same

I'm sorry
Looks like the order is wrong.

아두이노에 대해서 아예 몰랐었는데 7 segment LED가 저런것이군요. 말 그대로 7개의 성분으로 표현할 수 있게끔 되어있네요! 불린값으로 불빛이 남과 안남을 결정할 수 있었다니 정말 신기합니다.
에노드는 0일때 불이 들어오니 반대인 경우의 캐소드의 경우는 1일 때 불이 들어오는군요.
유용한 포스팅 감사합니다^^

핀마다 각 자리 LED를 제어할 수 있고 아두이노에서 핀으로 출력 전류만 보내면 해당 LED를 켜고 나타낼 수 있어요.
타이머을 이용하면 시계도 제작 가능해 져요.
특정 회로가 1초 단위로 클럭이 발생하고 그걸 1초단위로 카운터를 아두이노에서 세고 그 값을 7 Segment LED로 출력하면 시계가 완성되지요.

코드를 이용해서 실생활에서 이용되는 시계를 만들수 있다니 정말 흥미롭습니다.

우와 정말 다른 세계네요 ㄷㄷ

대단하세요 코딩맨님!!

그냥 기초적인거라서 대단하지 않아요. ^^

저도 잘 은 모르지만 이런 실험 자체는 보는것만으로도 흥미진진해요

1학년 이였나 4시간짜리 실험수업에서 교수님이 7세그먼트 회로 구성 하라길래 20분컷 하고 교수님이랑 밥먹으러 갔던 기억이..

2학년이였나 그때 전자회로 시간에 어셈블리어로 참 힘들게 배웠네요.

전 뭔 gui 로 배우는 걸로 했는데 c언어로 후다다닥 하소 나왔었네요 어셈블리라니 듣기만 해도 어렵네요

하드웨어설계할때는 c언어로 하드웨어 설계 후다닥 했죠.
참 쉽게 그 당시 교수님이 랩실로 스카웃할려고 했는데 하드웨어는 좀 싫어해서 안갔지만요.
c가 참 편함!
자바보다도 전 c가 참 편한것 같아요.

저는 랩뷰라는 프로그램으로 짜는 수업이였는데 그 프로그램 안에서 c언어 편집기 기능으로 했었네요 어셈블리언어로 배우셨다니 난이도가 상상이 안가네요..

c가 참 편하죠. 어셈블리언어가 기계어에 가깝기 때문에 코딩하기가 참 힘들죠. LED 하나 켜는것도 코딩이 길고 로직을 짜더라도 불편한게 한두가지가 아닌게 너무 힘들게 배웠어요.

1일 1회 포스팅!
1일 1회 짱짱맨 태그 사용!
^^ 즐거운 스티밋의 시작!

1일 1회 짱짱맨 태그 화이팅!