라즈베리 파이 7 세그먼트 LED 문자 디스플레이 파이선 코딩
라즈베리 파이에서 7세그먼트 LED 각각을 GPIO 로 on OFF 하여 문자를 출력해 보자.
7세그먼트를 배선하려면 기본적으로 각각의 세그먼트 LED를 on OFF 할 수 있도록 8개의 배선을 라즈베리 파이의 GPIO 핀에 배선할 필요가 있다. 아울러 전원선 으로 3.3V 와 GND 가 필요하다.
라즈베리 파이는 자체적으로 인터페이스 핀을 제공하고 있으나 핀 별 배선 명칭이 인쇄되어 있지 않으며 촘촘하여 배선 작업이 상당히 불편하므로 납작 리본으로 연결된 T 바를 빵판에 설치하여 사용하기로 한다.
참고로 라즈베리 파이 3에서는 BCM 넘버(GPIO) 기준으로 0번에서 27번까지 핀을 제공한다. 나머지 12개의 핀은 전원 5V, 3.3V 와 GND 로 구성된다. 단 BCM 넘버 순서대로 핀이 배치되어 있지 않기 때문에 T 바에서 정확한 위치를 확인해야 할 필요가 있다.
한편 7세그먼트는 양그형과 음극형이 있는데 그림에 서술된 7 세그먼트는 양극형이다. 즉 공통 단자에 300옴 저항을 연결하고 +전압 예를 들면 3.3V를 가하고 공통이 아닌 A,B,C,⚫⚫⚫ 핀에 GND 즉 0V를 연결하면 on 된다.
동시에 8개의 LED를 on 하게 되면 8개의 LED 가 병렬로 연결이 되어 합성 저항 값이 대단히 작아지게 된다. 최종적으로 이 8개의 병렬 LED 와 300옴 전류 제한 저항이 직렬 연결이 되므로 최소 전류 제한 저항이 300옴 이상이 된다. 8개 LED 전체가 on 되어 병렬 연결되더라도 합성 저항 값은 0Ω 이상이므로 전류 제한 저항과 합하면 최소 300Ω 이상이 됨을 쉽게 알 수 있다.
만약 3.3V 전원을 사용할 경우 옴의 법칙을 적용하여 전류 제한 저항에 흐르게 되는 전류 값을 계산해 보자.
I = 3.3V/300Ω = 3300mV/300Ω = 11 mA
전류제한 저항에 흐르게 되는 총 전류가 11mA 이면 각가의 LED 에는 이 전체 전류의 (1/8) 정도가 흐르게 된다. 일반적으로 LED 허용 전류가 20 mA 선이므로 단 하나의 전류 제한 저항을 설치 하더러도 큰 문제없이 각 세그먼트 LED 들이 충분히 보호가 될 수 있다.
실제 전류제한 저항에 가해지는 전압을 멀티메터로 측정해 보면 1.7∼2.4V 의 전압이 가해짐을 알 수 있다. 이때의 총 전류는 11 mA 보다 작은 8 mA 선이 된다.
7세그먼트 LED 의 A,B,C,⚫⚫⚫ 핀에 BCM 2번에서 9번까지를 할당하기로 하자. BCM 넘버링은 GPIO 넘버링과 일치하는 개념이다.
RPI.GPIO 모듈과 time 모듈을 불러들인다. 모드세팅에서 BCM 넘버링 모드를 선택한다.
7세그먼트를 on OFF 하기 위한 GPIO 디지털 데이터 핀을 segments 어레이에 설정한다. 반드시 순차적일 필요는 없으나 워낙 배선해야 할 핀 수 가 많으므로 순차적으로 하는 것이 좋다.
GPIO.setup() 명령에서 데이터 핀을 루프 변수로 처리하면 코드가 간결해진다. 출력 모드로 정의하고 일단 LOW 즉 0 을 입력하여 OFF 해 둔다.
num[][] 어레이를 정의한다. 첫 번째 어레이 변수는 0에서 16까지의 경우를 지정한다. 즉 16진으로 F까지 외에 별도로 모든 세그먼트들이 켜지도록 X를 추가하여 정의한다. 두 번째 어레이 변수는 각가의 GPIO 핀 에 해당하는 HIGH LOW 상태 값이다.
필요하다면 몇가지 문자를 추가로 정의할 수 도 있다.
총 17가지 경우에 대해 index 라는 변수를 사용하여 for 루프를 설정한다.
srt() 명령을 사용하여 정수형 데이터 index를 문자로 변환하여 어레이 변수 s에 저장한다.
index 루프 내부에 지정된 하나의 어레이 변수 값 s[] 에 대해서 loop 라는 변수를 사용하여 for loop를 설정한다. 이렇게 되면 지정된 하나의 어레이 변수 값 s[] 에 대해서 “1”과 “0”으로 이루어진 8개의 어레이 데이터가 참조되어 어레이 segments 에 해당하는 데이터 핀에 설치된 LED 가 on OFF 되는 것이다.
Svnsegment_01.py
import RPi.GPIO as GPIO
import time
GPIO.setmode(GPIO.BCM)
GPIO.setwarnings(False)
# GPIO ports for the 7seg pins
segments = (2,3,4,5,6,7,8,9)
for segment in segments:
GPIO.setup(segment, GPIO.OUT)
GPIO.output(segment, 0)
num = {
'0':(0,0,0,0,0,0,1,1),
'1':(1,0,0,1,1,1,1,1),
'2':(0,0,1,0,0,1,0,1),
'3':(0,0,0,0,1,1,0,1),
'4':(1,0,0,1,1,0,0,1),
'5':(0,1,0,0,1,0,0,1),
'6':(0,1,0,0,0,0,0,1),
'7':(0,0,0,1,1,0,1,1),
'8':(0,0,0,0,0,0,0,1),
'9':(0,0,0,0,1,0,0,1),
'10':(0,0,0,1,0,0,0,1), #A
'11':(1,1,0,0,0,0,0,1), #B
'12':(0,1,1,0,0,0,1,1), #C
'13':(1,0,0,0,0,1,0,1), #d
'14':(0,1,1,0,0,0,0,1), #E
'15':(0,1,1,1,0,0,0,1), #F
'16':(0,0,0,0,0,0,0,0) #X
}
for index in range(0,17):
s=str(index)
for loop in range(0,8):
print (loop)
GPIO.output(segments[loop],num[s][loop] )
time.sleep(1)
GPIO.cleanup()