아두이노 강좌 #23 4-Digit 7Segment 기본 동작 원리
Lucy Archive
Lucy / Facilitate4U
2020. 8. 16. 01:17

Arduino Uno 4Digit FND Basic PrincipleArduino Uno 4Digit FND Basic Principle

Arduino Uno 4-Digit FND 사용 방법

지난 포스트에서 7-Segment 의 원리와 사용 방법에 대해 소개하였습니다. 이번에는

4자리 7-Segment 의 구조를 알아보고, 기초적인 사용법을 설명

합니다. 본 포스트에서는 7Segment 의 구조를 안다고 가정하고 설명을 진행합니다. 7Segement 의 구조를 먼저 알고 싶으신 분은 하단의 링크를 참조해주세요.

4Digit 7Segment

4자리 FND(7-Segment)는 7Segment가 4개가 있는 방식으로 기본 구조는 비슷합니다. 4자리 FND도 공통-애노드, 공통-캐소드 타입이 있지만, 이번 포스트에서는 공통 애노드 타입만 설명하도록 하겠습니다. 공통 캐소드 타입은 동작이 반대로 된다고 이해하시면 됩니다.

아래 그림은 Common-Anode 타입의 4자리 FND의 외형과 내부 회로도를 나타낸 그림입니다. 이 부품은 총 12개의 핀을 가지고 있으며, 7개의 문자 SEGMENT 핀, 1개의 DP핀, 4개의 DIGIT 핀으로 구성됩니다.

4Digit 7Segment4Digit 7Segment

7-Segment 개가 붙어 있어서 핀이 4배가 되는 것이 아니라, 8개의 SEGMENT는 공유하고, 4개의 공통 애노드 단자만 분리하여 사용합니다. 

FND 4자리에 모두 데이터를 표시하기 위해, Digit1만 켜서 데이터를 표시 -> Digit2만 켜서 데이터를 표시 -> Digit3만 켜서 데이터를 표시 -> Digit4만 켜서 데이터를 표시하는 방법으로 숫자 또는 문자를 표시합니다.

아두이노에서 4자리 FND 사용하기

Hardware

아두이노 우노 보드에서 4-Digit 7Segment 를 사용하기 위해 아래와 같이 회로를 연결 합니다.

Arduino Uno 4자리 FND 연결 회로도 및 연결 예시Arduino Uno 4자리 FND 연결 회로도 및 연결 예시

본 예제에서 사용한 4Digit 7Segment 의 모델명은 HS410561K-32 로 Common-Anode 타입의 FND입니다. 개인에 따라 핀 매핑은 편하신대로 진행하셔도 됩니다. 코드에서 수정이 가능합니다.


예제1 : 1자리씩 천천히 출력

4자리 FND의 기본 사용 방법을 이해하기 위해 1초 간격으로 한 자리씩 FND를 켜는 예제를 소개합니다. 이해를 코드를 풀어서 작성하였습니다. 회로도 연결이 다른 경우 상단의 선언문에서 수정이 가능합니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
#define segA 12  // 'a' 세그먼트 연결 핀 번호
#define segB 2  // 'b' 세그먼트 연결 핀 번호
#define segC 7  // 'c' 세그먼트 연결 핀 번호
#define segD 9  // 'd' 세그먼트 연결 핀 번호
#define segE 10  // 'e' 세그먼트 연결 핀 번호
#define segF 11  // 'f' 세그먼트 연결 핀 번호
#define segG 6  // 'g' 세그먼트 연결 핀 번호
#define segDP 8 // 'dp' 세그먼트 연결 핀 번호
 
#define digit1 13 // 1st digit 연결 핀번호
#define digit2 4 // 2nd digit 연결 핀번호
#define digit3 3 // 3rd digit 연결 핀번호
#define digit4 5 // 4th digit 연결 핀번호
 
// main 함수에서 처리 편하게 하기 위해 핀번호 배열을 생성
int fndPort[8= {segA, segB, segC, segD, segE, segF, segG, segDP};
// index 0-9 -> 숫자 1~9
// index 10 -> Blank
int fndData[11][8= {
                    { 00000011 }, // 0
                    { 10011111 }, // 1
                    { 00100101 }, // 2
                    { 00001101 }, // 3
                    { 10011001 }, // 4
                    { 01001001 }, // 5
                    { 01000001 }, // 6
                    { 00011011 }, // 7
                    { 00000001 }, // 8
                    { 00001001 }, // 9
                    { 11111111 }, // 10 - blank
                };   
 
void setup(){
    // SEGMENT 핀 출력모드로 설정
    for(int i = 0 ; i < 8 ; i++)
    {
        pinMode(fndPort[i],OUTPUT);
    }
    // 공통 Digit 핀 출력 모드로 설정
    pinMode(digit1, OUTPUT);
    pinMode(digit2, OUTPUT);
    pinMode(digit3, OUTPUT);
    pinMode(digit4, OUTPUT);
    // FND 모두 끄기 - 공통-애노드 타입으로 LOW 출력시 OFF
    digitalWrite(digit1, LOW);
    digitalWrite(digit2, LOW);
    digitalWrite(digit3, LOW);
    digitalWrite(digit4, LOW);
}
 
void loop(){
    // 첫째 자리 FND 숫자 1출력
    for(int j = 0 ; j < 8 ; j++){
        digitalWrite(fndPort[j], fndData[1][j]); 
    }
    digitalWrite(digit1, HIGH);
    delay(1000);
 
    fndOff(); //fnd 모두 끄기
 
    // 둘째 자리 FND 숫자 2출력
    for(int j = 0 ; j < 8 ; j++){
        digitalWrite(fndPort[j], fndData[2][j]); 
    }
    digitalWrite(digit2, HIGH);
    delay(1000);
 
    fndOff(); //fnd 모두 끄기
 
    // 셋째 자리 FND 숫자 3출력
    for(int j = 0 ; j < 8 ; j++){
        digitalWrite(fndPort[j], fndData[3][j]); 
    }
    digitalWrite(digit3, HIGH);
    delay(1000);
 
    fndOff(); //fnd 모두 끄기
 
    // 넷째 자리 FND 숫자 4출력
    for(int j = 0 ; j < 8 ; j++){
        digitalWrite(fndPort[j], fndData[4][j]); 
    }
    digitalWrite(digit4, HIGH);
    delay(1000);
 
    fndOff(); //fnd 모두 끄기
}
 
void fndOff(){ // FND 모두 끄기
    digitalWrite(digit1, LOW);
    digitalWrite(digit2, LOW);
    digitalWrite(digit3, LOW);
    digitalWrite(digit4, LOW);
}
cs

위의 코드를 실행하면 아래 영상과 같이 1초 간격으로 1자리씩 숫자가 출력 되는 것을 확인 할 수 있습니다.

예제2 : FND 4자리 모두 출력

이번 예제는 예제1에서 순환하는 스피드를 점점 올리면서, 4자리 7세그먼트가 동시에 출력되는 것처럼 보여주는 예제입니다. 예제1에서 시간 조정을 하고 코드의 줄 수를 줄이는 수정을 진행하였습니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
#define segA 12  // 'a' 세그먼트 연결 핀 번호
#define segB 2  // 'b' 세그먼트 연결 핀 번호
#define segC 7  // 'c' 세그먼트 연결 핀 번호
#define segD 9  // 'd' 세그먼트 연결 핀 번호
#define segE 10  // 'e' 세그먼트 연결 핀 번호
#define segF 11  // 'f' 세그먼트 연결 핀 번호
#define segG 6  // 'g' 세그먼트 연결 핀 번호
#define segDP 8 // 'dp' 세그먼트 연결 핀 번호
 
#define digit1 13 // 1st digit 연결 핀번호
#define digit2 4 // 2nd digit 연결 핀번호
#define digit3 3 // 3rd digit 연결 핀번호
#define digit4 5 // 4th digit 연결 핀번호
 
// main 함수에서 처리 편하게 하기 위해 핀번호 배열을 생성
int fndPort[8= {segA, segB, segC, segD, segE, segF, segG, segDP};
int fndDigit[4= {digit1, digit2, digit3, digit4};
 
int delayTime = 500;
 
// index 0-9 -> 숫자 1~9
// index 10 -> Blank
int fndData[11][8= {
                    { 00000011 }, // 0
                    { 10011111 }, // 1
                    { 00100101 }, // 2
                    { 00001101 }, // 3
                    { 10011001 }, // 4
                    { 01001001 }, // 5
                    { 01000001 }, // 6
                    { 00011011 }, // 7
                    { 00000001 }, // 8
                    { 00001001 }, // 9
                    { 11111111 }, // 10 - blank
                };   
 
void setup(){
    // SEGMENT 핀 출력모드로 설정
    for(int i = 0 ; i < 8 ; i++)
    {
        pinMode(fndPort[i],OUTPUT);
    }
    // Digit 핀 출력 모드로 설정
    for(int i = 0 ; i < 4 ; i++)
    {
        pinMode(fndDigit[i],OUTPUT);
        digitalWrite(fndDigit[i],LOW);
    }
}
 
void loop(){
    for(int i = 0 ; i < 4 ; i++){
        for(int j = 0 ; j < 8 ; j++){
            digitalWrite(fndPort[j], fndData[i+1][j]); 
        }
        digitalWrite(fndDigit[i], HIGH);
        delay(delayTime);
        digitalWrite(fndDigit[i], LOW);
    }
    if(delayTime > 1)
        delayTime = delayTime * 0.9;
    else
        delayTime = 1;
}
cs

위의 코드를 실행하면 아래 영상과 같이 순환하는 타이밍이 서서히 줄어 들면서 4자리 숫자 모두 동시에 나오는 것처럼 보여지는 것을 볼 수 있습니다. 


마무리

본 포스트에서는

4자리 FND의 내부 회로 구성 및 동작 방법을 알아보고, Arduino Uno를 사용하여 4자리 FND를 구동하는 방법

에 대해 소개하였습니다.

끝까지 읽어 주셔서 감사합니다.🤣

관련포스트

👉 아두이노 FND 관련글 목록 보기

👉 아두이노 디스플레이 장치 관련글 목록 보기

👉 아두이노 관련글 전체 목록 보기