오렌지보드를 사용하여 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로 구성이 되어 있습니다. // 각 숫자에 대한 LED 설정 값을 정의합니다. // 실행시 가장 먼저 호출되는 함수이며, 최초 1회만 실행됩니다. // setup() 함수가 호출된 이후, loop() 함수가 호출되며, |
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를 방문해 보길 바란다.
코코아팹은 한국 메이커 문화를 만들어가는 온라인 메이커포털이다. 오픈소스 하드웨어 오렌지보드의 생산과 활용법 공개 등 많은 활동을 진행하고 있다. |