라즈베리파이는 개발 보드인 만큼 당연히 여러 포트와 핀이 있고, 이를 제어할 수 있는 라이브러리도 개발되어 있다.
RPi.GPIO나 gpiozero와 같은 라이브러리들이 바로 그것이다.
Raspberry Pi OS에는 이러한 라이브러리들이 기본으로 포함되어 있지만, 필자의 라즈베리 파이에 설치한 Ubuntu Server에는 이러한 라이브러리들이 기본으로 포함되어 있지 않으므로, 추가적인 설치가 요구된다.
Raspberry Pi OS를 이용한다면 그냥 APT로 업그레이드나 시켜 주자.
gpiozero 라이브러리 설치
일단, 가장 쉽게 사용 가능한 라이브러리 중 하나인 gpiozero 라이브러리를 설치하자.
다음의 명령을 입력한다.
sudo apt install python3-gpiozero
설치는 간단하다.
gpiozero 라이브러리 활용
라이브러리가 정상적으로 설치되었는지 여부를 확인하는데 가장 좋은 방법은 gpiozero 라이브러리에 포함된 "pinout" 명령을 실행하는 것이다.
위 이미지와 같이 현재 라즈베리 파이의 핀 구성을 출력한다.
동일한 핀 구성임을 확인할 수 있다.
이제 간단한 회로와 코드를 작성해 보자.
간단한 회로 및 코드
회로를 설계하기에 앞서, 라즈베리 파이의 GPIO 핀의 정격 전압은 3.3V이다. 아두이노 생각하며 5V를 인가하다가는 핀과 보드를 망가트릴 수 있으므로 주의하자.
라즈베리 파이 5의 GPIO(General purpose input output) 핀은 총 40개이며, 이를 통해 외부 장치들을 연결해 사용할 수 있다.
문제는, 상술하였듯이, GPIO 핀의 정격 전압은 3.3V라는 것이다. 5V 핀이 따로 존재하기는 하지만, 이 때문에 아두이노의 주변 장치들을 바로 사용하면 정상 작동하지 않는 문제가 생길 수 있다.
하지만 단순히 LED 켜는 정도로는 문제없으니 안심하자. 대부분의 문제는 회로를 잘 짜면 문제가 없다.
간단하게 LED부터 켜보자.
LED 출력을 위해서는 먼저 OUTPUT 핀을 지정해주어야 한다.
이 글에서는 GPIO 14번 핀을 이용할 것이다.
앞서 첨부된 이미지에서, GPIO 14번 핀은 J8 GPIO Header의 #8 핀이기도 하다.
그래서 핀 지정을 다음과 같은 세 가지 방법으로 할 수 있다.
led = LED(14)
led = LED("GPIO14")
led = LED("J8:8")
자신에게 편한 방법으로 하면 된다.
사용한 코드는 아래와 같다.
#LED.py
from gpiozero import LED
led = LED(14) # LED 핀 OUTPUT 지정: GPIO 14
# 반복문
while True:
number_input=int(input("Please enter 0 or 1: ")) # 코드 실행 시 0을 입력하면 LED off, 1을 입력하면 LED on.
if number_input==1: # 1을 입력 시 LED ON
led.on()
print("led on")
if number_input==0: # 0을 입력 시 LED OFF
led.off()
print("led off")
led 자리에 그냥 LED(14)를 넣어도 되지만, 그러면 많이 귀찮고, 생각지도 못한 오류가 발생할 수 있다. 필자의 경우, 회로가 의도한 대로 동작하지 않는 것을 확인하였다. 그러니 그냥 얌전히 선언하고 코드를 작성하자.
회로 구성은 아래와 같다.
자동으로 깜박거리게 만들 수도 있다.
아래는 그 예제이다.
#LED.py
from gpiozero import LED
from time import sleep
led = LED(14) # LED 핀 OUTPUT 지정: GPIO 14
# 반복문
while True:
led.on()
print("led on")
sleep(1)
led.off()
print("led off")
sleep(1)
조금 더 활용할 수도 있다.
7-segment를 사용해 보자.
모델은 common anode WDUR-1039A이다.
위 이미지에서 왼쪽 모델이다.
회로 구성은 아래 이미지와 같다.
7-segment 구성은 기본적으로 아래와 같다.
필자가 사용한 소자와는 모델이 다른데, 대부분의 세그먼트 소자는 A 노드를 기준으로 시계 방향으로 돌아가면서 핀이 구성되므로, A 핀의 위치만 찾으면 된다.
코드 구성은 아래와 같다.
#7seg.py
from gpiozero import LED
ledA = LED(24) # LED 핀 OUTPUT 지정: GPIO 24 --> A
ledB = LED(25) # LED 핀 OUTPUT 지정: GPIO 25 --> B
ledC = LED(8) # LED 핀 OUTPUT 지정: GPIO 8 --> C
ledD = LED(14) # LED 핀 OUTPUT 지정: GPIO 14 --> D
ledE = LED(15) # LED 핀 OUTPUT 지정: GPIO 15 --> E
ledF = LED(18) # LED 핀 OUTPUT 지정: GPIO 18 --> F
ledG = LED(23) # LED 핀 OUTPUT 지정: GPIO 23 --> G
# 반복문
while True:
number_input=int(input("Please enter number 0-9: ")) # 코드 실행 시 0-9를 입력하면 켜진다.
if number_input==0:
ledA.off()
ledB.off()
ledC.off()
ledD.off()
ledE.off()
ledF.off()
ledG.on()
print("0")
if number_input==1:
ledA.on()
ledB.off()
ledC.off()
ledD.on()
ledE.on()
ledF.on()
ledG.on()
print("1")
if number_input==2:
ledA.off()
ledB.off()
ledC.on()
ledD.off()
ledE.off()
ledF.on()
ledG.off()
print("2")
if number_input==3:
ledA.off()
ledB.off()
ledC.off()
ledD.off()
ledE.on()
ledF.on()
ledG.off()
print("3")
if number_input==4:
ledA.on()
ledB.off()
ledC.off()
ledD.on()
ledE.on()
ledF.off()
ledG.off()
print("4")
if number_input==5:
ledA.off()
ledB.on()
ledC.off()
ledD.off()
ledE.on()
ledF.off()
ledG.off()
print("5")
if number_input==6:
ledA.off()
ledB.on()
ledC.on()
ledD.off()
ledE.off()
ledF.off()
ledG.off()
print("6")
if number_input==7:
ledA.off()
ledB.off()
ledC.off()
ledD.on()
ledE.on()
ledF.on()
ledG.on()
print("7")
if number_input==8:
ledA.off()
ledB.off()
ledC.off()
ledD.off()
ledE.off()
ledF.off()
ledG.off()
print("8")
if number_input==9:
ledA.off()
ledB.off()
ledC.off()
ledD.off()
ledE.on()
ledF.off()
ledG.off()
print("9")
무식하지만 가장 편한 코드이다.
물론 더 다듬을 수도 있다:
from gpiozero import LED
# LED 핀 설정 (GPIO 핀 번호와 세그먼트 매핑)
ledA = LED(24) # 세그먼트 A
ledB = LED(25) # 세그먼트 B
ledC = LED(8) # 세그먼트 C
ledD = LED(14) # 세그먼트 D
ledE = LED(15) # 세그먼트 E
ledF = LED(18) # 세그먼트 F
ledG = LED(23) # 세그먼트 G
# 숫자에 따라 세그먼트의 on/off 상태를 정의
def display_number(number):
# 숫자 0~9에 해당하는 세그먼트 상태
segment_states = {
0: [False, False, False, False, False, False, True],
1: [True, False, False, True, True, True, True],
2: [False, False, True, False, False, True, False],
3: [False, False, False, False, True, True, False],
4: [True, False, False, True, True, False, False],
5: [False, True, False, False, True, False, False],
6: [False, True, True, False, False, False, False],
7: [False, False, False, True, True, True, True],
8: [False, False, False, False, False, False, False],
9: [False, False, False, False, True, False, False],
}
# 세그먼트 상태 업데이트
if number in segment_states:
states = segment_states[number]
ledA.value, ledB.value, ledC.value, ledD.value, ledE.value, ledF.value, ledG.value = states
print(number)
else:
print("Invalid number! Please enter a number between 0 and 9.")
# 메인 루프: 사용자 입력 처리
while True:
try:
number_input = int(input("Please enter a number (0-9): "))
display_number(number_input)
except ValueError:
print("Invalid input! Please enter a valid integer.")
자신에게 더 편리한 것을 사용하면 된다.
여담으로, 해당 코드는 SPI와 핀을 공유하므로, GPIO busy 문제가 발생할 수 있다.
이 글을 참고하여 조치하자.
여담
이 글에서는 Python을 프로그래밍에 사용하였다.
물론, Python 외에도 다른 다양한 언어를 이용하여 GPIO를 제어할 수 있다.
다음 글에서는 C/C++를 이용하여 GPIO를 제어하는 방법을 알아보자.
참고 자료
라즈베리파이 GPIO제어하기(파이썬 GPIO Zero사용하기)
라즈베리파이 GPIO제어하기(파이썬 GPIO Zero사용하기)
라즈베리파이 GPIO제어하기: GPIO Zero라이브러리 사용 이전에 sys파일을 사용하는 방법과 Wirin...
blog.naver.com
라즈베리파이의 핀 제어 - RPi.GPIO와 gpiozero 라이브러리 기본 사용법
라즈베리파이의 핀 제어 - RPi.GPIO와 gpiozero 라이브러리 기본 사용법
라즈베리파이 또는 아두이노와 같은 제어기는 각각의 핀에 연결된 센서의 값을 읽어 들이고, 모터나 LED...
blog.naver.com
라즈베리파이 GPIO 입출력 전압/전류에 대해
라즈베리파이의 한쪽편엔 확장을 위한 GPIO 핀이 40개 배열되어 있다. 이 40개 핀엔 확장할 부품의 전...
blog.naver.com
라즈베리파이5 GPIO 40핀 헤더 기능 뜯어보기
라즈베리파이5 GPIO 40핀 헤더용 GPIO 이 그래픽은 라즈베리파이 5의 연결 핀아웃을 보여주며, 기본 장치 트리 오버레이가 있는 기본 구성입니다. 기본 구성은 대부분 아래 표의 'F1'과 일치합니
fishpoint.tistory.com
RP1 Datasheet - Peripheral Controller Datasheet Draft
RP1 Datasheet - Peripheral Controller Datasheet Draft
RP1 is a peripheral controller, designed by Raspberry Pi for use on Raspberry Pi 5. It connects to an application processor (AP) via a PCIe 2.0 x4 bus, and aggregates many digital controllers and analog PHYs for Raspberry Pi 5’s external interfaces. In t
community.element14.com
Raspberry Pi 시리즈
Raspberry Pi #1 - 설치
최근 라즈베리 파이 5를 구매하게 되었다. 그래서 그냥 이 친구를 가지고 하는 일들을 적당히 정리해 올리기로 했다.라즈베리 파이를 사용하기 위해서는 라즈베리 파이에서 구동할 운영 체제가
sprout13.tistory.com
Raspberry Pi #2 - 스왑 설정
Oracle Cloud #5에서, 인스턴스를 처음 만들면 운영체제에서 디스크 스왑을 사용하도록 설정되어 있지 않다고 한 바 있다. Oracle Cloud #5 - 스왑 파일 만들기이전 글에서, 인스턴스를 처음 만들면 운
sprout13.tistory.com
Raspberry Pi #3 - Raspberry Pi 5에서 DeepSeek-R1 AI 모델을 로컬로 실행
#5 - gpiozero 라이브러리를 이용한 핀 제어
'Raspberry Pi' 카테고리의 다른 글
Raspberry Pi #4 - raspi-config (0) | 2025.02.15 |
---|---|
Raspberry Pi #3 - Raspberry Pi 5에서 DeepSeek-R1 AI 모델을 로컬로 실행 (4) | 2025.02.01 |
Raspberry Pi #2 - 스왑 설정 (1) | 2025.01.15 |
Raspberry Pi #1 - 설치 (1) | 2025.01.01 |
댓글