반응형

Python의 RPi.GPIO 모듈을 사용하여 Raspberry Pi 4에 연결한 7 Segment에 0 ~ 9 숫자를 표시하는 방법을 다룹니다.



2021. 6. 13 최초작성




우선 필요한 패키지를 설치해줍니다.

sudo apt install rpi.gpio



설치에 문제가 있는 경우에는 패키지 목록을 업데이트한 후 다시 해보세요

sudo apt update




다음처럼 GPIO 핀 번호(= GPIO x)를 보고 연결해줍니다. 핀번호를 보고 연결하면 안됩니다.
예를 들어 a를 위해 연결하는 17번은 GPIO 17을 의미합니다.

pins = { 'a': 17, 'b': 27, 'c': 22, 'd': 10, 'e': 9, 'f': 11, 'g': 0}




7 SEGMENT의 나머지 핀(COM, DP)은 타입에 따라 연결해줘야 합니다.

세븐 세그먼트에는 두 가지 타입이 있는데 연결방식이 차이가 있습니다.
Anode 타입의 경우 COM 2개와 DP(=P)를 5V Power에 연결하고 Cathode의 경우에는 Ground에 연결해주면 됩니다.





동작방식의 차이는 Cathode의 경우 HIGH 신호를 준 곳이 켜지지만 Anode의 경우에는 LOW신호를 준 경우에 켜집니다.





아래 코드의 딕셔너리 digitBitmap에 0~9 숫자별로 정의된 값입니다.
표 왼쪽에 보이는 숫자를 만들기 위해 위 그림에서 a~g 중에 켜져야 할 곳을 1로 설정하고 있습니다.

  g f e d c b a
0 0 1 1 1 1 1 1
1 0 0 0 0 1 1 0
2 1 0 1 1 0 1 1
3 1 0 0 1 1 1 1
4 1 1 0 0 1 1 0
5 1 1 0 1 1 0 1
6 1 1 1 1 1 0 1
7 0 0 0 0 1 1 1
8 1 1 1 1 1 1 1
9 1 1 0 0 1 1 1





Anode의 경우에 동작하도록 작성된 코드입니다.
Cathode라면 코드에서 GPIO.HIGH를 GPIO.LOW로, GPIO.LOW를 GPIO.HIGH로 변경하세요.

import time
import RPi.GPIO as GPIO



# GPIO 번호를 사용하여 핀번호를 지정하겠다는 의미입니다.
GPIO.setmode(GPIO.BCM)


# 포스트의 표를 참고하세요.
digitBitmap = { 0: 0b00111111, 1: 0b00000110, 2: 0b01011011, 3: 0b01001111, 4: 0b01100110, 5: 0b01101101, 6: 0b01111101, 7: 0b00000111, 8: 0b01111111, 9: 0b01100111 }


# 7 Segment의 a ~ g에 대응하는 비트를 정의합니다.
masks = { 'a': 0b00000001, 'b': 0b00000010, 'c': 0b00000100, 'd': 0b00001000, 'e': 0b00010000, 'f': 0b00100000, 'g': 0b01000000 }


# 7 세그먼트의 a ~ g 핀을 GPIO x에 연결합니다.
# 핀번호가 아니라 GPIO 번호 임에 유의하세요.
pins = { 'a': 17, 'b': 27, 'c': 22, 'd': 10, 'e': 9, 'f': 11, 'g': 0}



# 지정한 숫자 c가 보이도록 7 Segment를 제어하는 함수입니다.
def renderChar(c):


# 지정한 숫자 c를 보여주기 위해 7 Segment의 a~g 중 켜야할 것만
# LOW로 출력하도록하고 나머지는 HIGH를 출력하도록 합니다.
# 7 Segment 동작 방식이 Cathode라면 HIGH와 LOW 위치가 변경되어야 합니다.
val = digitBitmap[c]

GPIO.output(list(pins.values()), GPIO.HIGH)

for k,v in masks.items():
if val&v == v:
GPIO.output(pins[k], GPIO.LOW)

try:

# 딕셔너리 pins의 값만으로 리스트를 만들어 해당 핀들을 출력으로 설정합니다.
GPIO.setup(list(pins.values()), GPIO.OUT)


# 딕셔너리 pins의 값만으로 리스트를 만들어 해당 핀들을 출력으로 설정합니다.
GPIO.output(list(pins.values()), GPIO.HIGH)

val = 0

while True:

# 7 segment에 출력할 숫자 0 ~ 9를 넘겨줍니다.
renderChar(val)


# 0에서 9 사이 숫자를 반복하도록 합니다.
val = 0 if val == 9 else (val + 1)


# 1초 대기합니다.
time.sleep(1)

# Ctrl + C를 입력하면 프로그램이 중단됩니다.
except KeyboardInterrupt:
print("Goodbye")


finally:
GPIO.cleanup()






참고

https://www.noumansaleem.com/avr/2018/08/11/seven-segment-display-raspberry-pi-python.html

https://webnautes.tistory.com/666

반응형

해보고 확인한 것을 문서화하여 기록합니다.
최소 일주일에 한번 이상 포스트를 하려고 노력중입니다.

부족함이 있지만 도움이 되었으면 합니다.
잘못된 부분이나 개선점을 알려주시면 감사하겠습니다.



포스트 작성시에는 문제 없었지만 이후 문제가 생길 수 있습니다.
시간날때 마다 이전 포스트가 문제 있는지 확인을 해보려고 노력하고 있습니다.
질문을 남겨주면 가능한 빨리 답변드립니다.


제가 쓴 책도 한번 검토해보세요 ^^

  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기

댓글을 달아 주세요

">