아두이노 7 세그먼트 표시 장치는 8자 모양의 7개의 LED에 전류를 보내서 0부터 9까지 숫자를 표시할 수 있는 부품인데 다음과 같이 생긴 녀석이다.
일상에서 흔히 볼 수 있는 건데 손목에 차고 있는 전자시계의 숫자를 표시하는 원리와 똑같은 녀석이라고 생각하면 이해하기가 쉬울 거고... 사진처럼 총 7개의 직선 모양의 LED로 이루어져 있는데 이것들이 다 켜지면 숫자 8이 될 것이다. 그리고 이 LED들은 각각의 이름을 갖고 있는데 가장 위쪽 가로 모양의 LED부터 오른쪽 시계 방향으로 A, B, C, D, E, F 그리고 가운데 부분 가로 직선이 G이다. 마지막으로 오른쪽 아래에 있는 점은 DP라고 하며 이 DP를 기준으로 세븐 세그먼트의 위아래를 구분할 수 있다.
이 녀석을 이용하면 다음과 같이 숫자를 표시할 수 있는데...
▲ 이번 글에서는 아두이노 7 세그먼트 표시 장치를 이용해서 이와 같이 0부터 9까지 숫자가 1초 단위로 바뀌는 예제를 만들어보고자 한다.
이 녀석을 이용해서 숫자를 만들기 위해서는 각각의 LED를 연결하고 있는 핀에 전류를 흘려보내면 되는데 그 핀 이름은 다음과 같다.
▲ 앞에서 잠깐 정리했듯이 이렇게 각각 LED는 이름을 갖고 있으며 그에 해당하는 핀들이 있다. 그런데 이 7 세그먼트 표시 장치의 LED를 켜기 위해서는 전압을 끊어줘야 한다. 즉 해당 LED를 켜기 위해서는 전압을 0V로 설정해줘야 하는 것이다. 예를 들어 숫자 8을 만들려면 모든 LED의 전압을 0V(LOW)로 해야 하며 숫자 1을 만들고 싶다면 B와 C의 전압을 0V로 설정해야 할 것이다. 반대로 꺼야 한다면 5V의 전류를 보내야 할 것이다.(HIGH)
조금 헷갈리긴 하는데 예제에서 그 내용을 살펴보기로 하고 빵판에 이 녀석을 설치한 후 아두이노보드와 연결을 해보자.
▲ 먼저 디지털 핀 2번부터 8번까지 각 LED의 A~G까지 순서대로 연결을 했으며 9번은 DP에 연결을 했다. 그리고 5V 전류를 빨간 선을 이용해서 빵판으로 보내고 있는 모습이다.
▲ 빵판에서는 양극과 7 세그먼트 VCC 사이에 저항을 연결해서 이 녀석을 보호하면서 전압을 공급하고 있는 모습이다. 이제 이 회로를 제어할 수 있는 프로그램 소스 코드를 작성해본다.
▲ 먼저 A~G까지 7개의 LED에 전류를 보내서 1~9까지의 숫자를 표시할 수 있는 2차원 배열을 선언하고 초기화했는데 조금만 집중해서 보면 어떻게 해당 숫자가 표시되는지 알 수 있다. 예로 숫자 0은 A~F까지 전류를 끊어서(0) 모두 켜지게 한 후 마지막 중간에 있는 G에만 전류를 보내서(1) 그 부분만 꺼지도록 하고 있다. 반대로 숫자 8 같은 경우 모든 LED의 전류를 단절시켜서(0) 켜지도록 하고 있는 모습이다. (전류를 보내면 해당 LED가 꺼진다는 걸 기억하자.)
다음은 함수들의 내용을 살펴보자.
▲ setup() 함수에서는 for 문을 이용해서 2번 핀부터 9번 핀까지 핀 모드를 OUTPUT으로 설정하고 있으며 digitalWrite() 함수의 인자로 9번핀 즉, DP의 전류를 보냄으로써(HIGH) DP를 끄도록 하고 있다. (전류를 보내면 꺼진다는 걸 다시 한 번 되새기자.)
그리고 loop() 함수에서는 역시 for 문을 이용해서 1초 단위로 count() 함수를 호출하면서 0~9까지의 값을 전달하고 있다. 여기서 호출하는 count()는 우리가 임의로 만든 함수이며 바로 아래쪽에 정의를 하고 있다.
count()에서는 디지털 핀에 연결한 8개의 케이블 중 처음 시작하는 핀번호(2)의 값을 pin 변수에 int 값으로 저장하고 있으며 for 문을 이용해서 그 2에 0부터 6까지 숫자를 더하면서 dititalWrite() 함수에 핀 번호를 전달해주고 두 번째 인자인 2차원 배열에도 각각의 값을 전달해주고 있다.
이렇게 소스 코드를 작성한 후 아두이노 보드에 올리면 앞쪽에서 봤던 영상처럼 전원을 인가하는 순간 모든 LED가 켜졌다가 0부터 9까지 숫자를 1초 단위로 만드는 걸 확인할 수 있다.
개인적으로 프로그램 언어를 조금은 읽을 줄 알고 2차원 배열을 어느 정도는 이해하고 있기 때문에 무리 없이 이 소스 코드가 눈에 들어오기는 하는데... 프로그램 언어의 기초를 모른 상태라면 이 소스 코드를 지금 당장 이해하는 데는 한계가 있지 않을까 싶다는 생각이 든다.