대메뉴 바로가기 본문 바로가기

데이터 기술 자료

데이터 기술 자료 상세보기
제목 오렌지보드를 사용하여 7세그먼트로 숫자 표시하기
등록일 조회수 6442
첨부파일  

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



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

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

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



오렌지보드에서 사용하는 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만 켜지게 된다.







소스코드

// 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를 방문해보길바란다.



출처 : 컴퓨터월드 2월호

제공 : 데이터 전문가 지식포털 DBguide.net