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
'Raspberry Pi > Raspberry Pi 활용' 카테고리의 다른 글
C언어로 Raspberry Pi 3의 GPIO 레지스터 접근하여 버튼값 읽어오기 (0) | 2023.10.09 |
---|---|
C언어로 Raspberry Pi 3의 GPIO 레지스터 접근하여 LED켜보기 (0) | 2023.10.09 |
Raspberry Pi 4에서 캐릭터 LCD 사용하는 방법 ( wiringpi ) (6) | 2021.02.05 |
Node.js를 이용하여 Raspberry Pi 3에 연결된 LED 제어하기 (4) | 2019.08.13 |
Raspberry Pi 3에서 Servo Motor 제어하기 (15) | 2019.06.03 |
시간날때마다 틈틈이 이것저것 해보며 블로그에 글을 남깁니다.
블로그의 문서는 종종 최신 버전으로 업데이트됩니다.
여유 시간이 날때 진행하는 거라 언제 진행될지는 알 수 없습니다.
영화,책, 생각등을 올리는 블로그도 운영하고 있습니다.
https://freewriting2024.tistory.com
제가 쓴 책도 한번 검토해보세요 ^^
그렇게 천천히 걸으면서도 그렇게 빨리 앞으로 나갈 수 있다는 건.
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!