반응형

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

반응형

문제 발생시 지나치지 마시고 댓글 남겨주시면 가능한 빨리 답장드립니다.

도움이 되셨다면 토스아이디로 후원해주세요.
https://toss.me/momo2024


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

+ Recent posts