오렌지보드를 사용하여 7세그먼트로 숫자 표시하기

[컴퓨터월드] 아두이노는 이탈리어로 ‘친한 친구’라는 뜻을 가진 대표적인 오픈소스 하드웨어다. 딱딱하고 접근하기 힘들었던 임베디드 분야를 누구나 쉽게 접근할 수 있도록 만든 미니 기판이라 할 수 있다. 이번 강좌에 사용하는 오렌지보드는 한국형 아두이노라 할 수 있다.

아두이노의 보급은 오픈소스 하드웨어의 확산을 불러일으켰고 메이커 문화의 확산에도 큰 기여를 했다. 최근에는 인텔, 마이크로소프트 등 대형 기업들도 이런 오픈소스 하드웨어시장에 뛰어들기 시작했다. 그 만큼 오픈소스 하드웨어 시장의 잠재력이 커졌다는 얘기이다.


7세그먼트로 숫자 표시하기

7세그먼트(7 Segment)는 7개의 획으로 숫자나 문자를 나타낼 수 있는 표시장치로 FND (Flexible Numeric Display)라고도 불린다. 일반적으로 작고 단순한 구조를 가지기 때문에 전자시계, 게이지 또는 전자회로의 내부수치를 보여주는 곳에 주로 사용된다. 대부분의 7세그먼트 표시 장치로는 LED를 통해 각 획을 표시하지만 일부는 음극방전관이나 진공관, LCD가 사용되는 경우도 있다.

아두이노-오렌지보드에서 사용하는 7세그먼트는 각각의 획이 LED로 구성되어 있으며, 이들 LED의 일부를 켜고 끄는 것으로 숫자나 문자를 표시할 수 있다. 예를 들어 모든 LED가 켜지면 숫자 8과 같이 표시되고, 오른쪽 LED만 켜지면 숫자 1과 같이 표시된다.
 

▲ 7세그먼트
 

7세그먼트 사용방법

7세그먼트는 동작하는 방식에 따라 애노드 형과 캐소드 형으로 나누어진다. 애노드 형은 -V (Off) 신호로 LED가 켜지며, 캐소드 형은 +V (On) 신호로 LED가 켜진다. 7세그먼트는 총 10개의 단자가 있으며, 상/하단 가운데 단자는 타입에 따라 전원의 +V(On) 또는 -V(Off)가 연결되고 나머지 단자는 오렌지보드의 디지털 핀에 연결한다. 7세그먼트도 LED를 사용하므로 과전류 방지용 저항과 함께 사용해야 된다.
 

본 가이드에서는 공통 애노드 타입(common-anode type)을 사용한다. 따라서 전류를 보내지 않도록 설정(-V) 한 LED 만 켜지게 된다.

▲ 필요한 부품 목록

 

하드웨어 연결하기


7세그먼트는 오렌지보드 핀 번호 연결 그림과 같이 연결한다.

 
 
 


1. 오렌지보드의 5V 전원 핀을 브레드보드의 +버스에 연결한다.
2. 7세그먼트를 가로 방향으로 양쪽 IC영역에 걸치게 꽂는다.
3. 7세그먼트의 LED 단자들을 각각 저항을 연결한다.
4. 7세그먼트의 전원 단자를 +버스에 연결한다.
5. 7세그먼트의 a단자를 오렌지보드 2번 핀에 연결한다.
6. 7세그먼트의 b단자를 오렌지보드 3번 핀에 연결한다.
7. 7세그먼트의 c단자를 오렌지보드 4번 핀에 연결한다.
8. 7세그먼트의 d단자를 오렌지보드 5번 핀에 연결한다.
9. 7세그먼트의 e단자를 오렌지보드 6번 핀에 연결한다.
10. 7세그먼트의 f단자를 오렌지보드 7번 핀에 연결한다.
11. 7세그먼트의 g단자를 오렌지보드 8번 핀에 연결한다.
12. 7세그먼트의 dp단자를 오렌지보드 9번 핀에 연결한다.

 
 



 

소스코드

// 7세그먼트는 총 8개의 LED로 구성이 되어 있습니다.
// 본 예제에서는 공통 애노드(Common Anode) 타입의 7세그먼트를 사용함으로,
// 켜고자 하는 LED의 핀에 LOW(0) 값을 보내도록 설정합니다.
// 반대로, 공통 캐소드(Common Cathode) 타입을 사용할 경우, HIGH(1) 값으로 설정합니다.
// 7세그먼트 각각 LED에 핀을 할당합니다. {A, B, C, D, E, F, G, H}
int segmentLEDs[] = {2, 3, 4, 5, 6, 7, 8, 9};
// 지정된 LED 개수
int segmentLEDsNum = 8;

// 각 숫자에 대한 LED 설정 값을 정의합니다.
// 숫자에 매칭되는 LED의 로직레벨을 LOW(0) 상태로 설정합니다.
int digitForNum[10][8] = {
{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
};

// 실행시 가장 먼저 호출되는 함수이며, 최초 1회만 실행됩니다.
// 변수를 선언하거나 초기화를 위한 코드를 포함합니다.
void setup() {
// 7세그먼트 각각 LED에 연결된 핀을 OUTPUT으로 설정합니다.
for (int i = 0 ; i < segmentLEDsNum ; i++) {
pinMode(segmentLEDs[i], OUTPUT);
}
}

// setup() 함수가 호출된 이후, loop() 함수가 호출되며,
// 블록 안의 코드를 무한히 반복 실행됩니다.
void loop() {
// 0부터 9까지 숫자를 순서대로 표시합니다.
for (int i = 0 ; i < 10 ; i++) {
// 각 숫자에 대한 각각 LED의 로직레벨을 설정합니다.
for (int j = 0 ; j < segmentLEDsNum ; j++) {
digitalWrite(segmentLEDs[j], digitForNum[i][j]);
}
// 1초 동안 대기합니다.
delay(1000);
}
}

 7세그먼트는 위에서도 설명했지만 하나의 모듈에 7개의 LED가 들어있는 형태이다. LED막대 7개가 모여서 하나의 7세그먼트를 이루고 있는 것이다. 하나의 모듈 안에 7개의 LED로 나눌 수 있기 때문에 소스코드에서는 2차원 배열을 사용하여 7세그먼트를 제어한다.

int segmentLEDs[] = {2, 3, 4, 5, 6, 7, 8, 9};

위 배열은 아두이노-오렌지보드에 연결된 LED 핀 번호를 나타낸다. 예를 들어 segmentLEDs[3]일 경우에는 5번 핀을 제어하게 된다. 그래서 digitalWrite(segmentLEDs[3], HIGH)로 선언하면 5번 핀에 연결된 7세그먼트의 LED가 켜지게 된다.

int digitForNum[10][8] = {
{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차원 배열로 0부터 9까지의 10개의 수를 8개의 LED(7세그먼트는 보통 7개의 LED를 가지고 있지만 소수점을 포함할 경우 8개의 LED를 지니게 된다.)를 이용하여 표현하기 위해 사용하는 배열이다. 첫 번째 있는 배열의 크기로 나타낼 숫자를 지정할 수 있고 두 번째 있는 배열의 크기로 각 획의 LED를
제어할 수 있다.

for (int i = 0 ; i < 10 ; i++) {
// 각 숫자에 대한 각각 LED의 로직레벨을 설정합니다.
for (int j = 0 ; j < segmentLEDsNum ; j++) {
digitalWrite(segmentLEDs[j], digitForNum[i][j]);
}

loop()함수 내에서는 2중 for문을 통해 7세그먼트를 제어하게 되는데 for문은 조건만큼 블록안의 코드를 반복하는 반복문이다.

첫 번째 있는 for문은 0부터 9까지 10번 반복하는데 이 반복은 7세그먼트를 통해 0부터 9까지의 숫자를 1초마다 표현하기 위한 반복문이고, 두 번째 for문은 표현할 숫자를 7세그먼트로 나타내기 위해 각각의 7세그먼트 내 LED를 제어하는 반복문이다.

위의 loop()문이 반복하게 되면 7세그먼트에서는 0부터 9까지 숫자를 1초마다 출력하는 행동을 반복하게 된다.

마치며

7세그먼트의 경우에는 단일로 1개만 있는 모듈이 주로 사용되지만 7세그먼트가 2개,3개,4개 등 여러 가지가 같이 달려있는 모듈들도 존재한다.

7세그먼트의 경우에는 각각의 LED를 제어하기 때문에 GND나 5V핀을 포함 최소 8개 이상의 상당히 많은 핀을 사용하게 되는데 이때 시프트레지스터(74HC595)를 사용하면 아두이노-오렌지보드와 직접 연결되는 핀을 상당량 줄일 수 있다. 또 PCB에 모듈화 되어있는 7세그먼트도 있으니 이를 활용한다면 적은 핀을 사용하여좀 더 쉽게 사용할 수 있다.

프로젝트에 대한 더 자세한 내용을 알고 싶다면 Kocoafab.cc를 방문해 보길 바란다.

 

 코코아팹은 한국 메이커 문화를 만들어가는 온라인 메이커포털이다. 오픈소스 하드웨어 오렌지보드의 생산과 활용법 공개 등 많은 활동을 진행하고 있다.

 

저작권자 © 아이티데일리 무단전재 및 재배포 금지