기술자료

DBMS, DB 구축 절차, 빅데이터 기술 칼럼, 사례연구 및 세미나 자료를 소개합니다.

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

기술자료
DBMS별 분류
Etc
작성자
dataonair
작성일
2016-03-07 00:00
조회
6427



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



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

7세그먼트(7 Segment)는 7개의 획으로 숫자나 문자를 나타낼 수 있는 표시장치로 FND(Flexible Numeric Display)라고도 불린 다. 일반적으로 작고 단순한 구조를 가지기 때문에 전자시계, 게이 지또는전자회로의내부수치를보여주는곳에주로사용된다.

대부분의 7세그먼트 표시 장치는 LED를 통해 각 획을 표시하지 만일부는음극방전관이나진공관, LCD가사용되는경우도있다.

tech_img4353.jpg

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



7세그먼트 사용방법

7세그먼트는 동작하는 방식에 따라 애노드 형과 캐소드 형으로 나누어진다. 애노드 형은 -V(Off) 신호로 LED가 켜지며, 캐소드 형은+V(On) 신호로 LED가 켜진다.

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

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



tech_img4354.jpg

tech_img4355.jpg

소스코드

// 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] =



위 배열은 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를 방문해보길바란다.