[Raspberry PI] GPIO 사용하기

스윗포테이토·2022년 12월 22일
4

GPIO란

General Purpose Input Output의 약자로, 말 그대로 범용 입출력을 의미한다.

라즈베리파이에 나와 있는 이 핀들이 GPIO핀인데, 이 핀들을 활용해서 간단한 회로를 구성해볼 수 있다. 아두이노와 비슷하지만, 라즈베리파이에서는 파이썬 패키지를 활용하여 조금 더 간단하게 구현할 수 있다.
pin 관련 정보는 아래 명령어를 통해 볼 수 있다.

pinout

gpiozero

gpiozero는 라즈베리파이에서 gpio를 파이썬으로 제어하기 쉽도록 만든 패키지이다.
GPIO document

LED, 버튼 등 자주 쓰는 부품에 대해서 클래스 등이 제공된다.

  • LED 깜빡이기
# 패키지 import
from gpiozero import LED
from time import sleep

led = LED(2) # gpio 번호
while True:
    led.on()
    sleep(1)
    led.off()
    sleep(1)

아두이노와의 차이점은 아두이노는 기본적으로 loop함수가 있기 때문에 반복문을 사용할 필요가 없지만, 파이썬은 기본적으로 한번만 실행되기 때문에 반복하도록 코드를 짜야 한다.

  • 버튼 사용하기
from gpiozero import Button # button import

button = Button(2) # GPIO2에 버튼 연결
button.wait_for_press() # 버튼이 눌릴 때까지 대기
print("pushed!!")

wait_for_press()는 gpiozero에서 제공하는 버튼 클래스의 메소드로, 버튼이 눌릴 때까지 기다리는 함수이다. 따라서, 이 메소드를 사용하면 버튼이 눌릴 때까지 다음 줄이 실행되지 않는다. 만약 버튼 입력을 기다리면서 다른 로직이 돌아가는 코드를 짜고 싶다면 다른 방법을 써야 한다.

버튼 클래스 살펴보기
버튼 클래스에는 다양한 필드가 있는데, 그 중 when_pressedwhen_released를 사용하면 버튼을 누르는 순간과 버튼에서 손을 떼는 상황을 감지할 수 있다.
when_pressedwhen_released에 해당 이벤트가 발생했을 때 실행할 함수를 지정해주면 된다.

from gpiozero import Button
button = Button(2)

def on():
    print("on")

def off():
    print("off")
button.when_pressed = on
button.when_released = off

이렇게 하면 버튼이 눌렸을 때 on 함수가 실행되고 버튼에서 손을 떼면 off 함수가 실행된다. 그러나 이렇게만 하고 실행을 하면 문제가 생긴다. 바로 마지막 줄까지 실행된 이후 프로그램이 종료된다는 것이다. 함수를 등록한 후에도 계속 프로그램이 돌면서 버튼 이벤트를 감지해야 하기 때문에 프로그램이 멈추는 것을 방지해주어야 한다.

from signal import pause
pause()

최종코드는 다음과 같다.

from gpiozero import Button
from signal import pause
button = Button(2)

def on():
    print("on")

def off():
    print("off")
button.when_pressed = on
button.when_released = off

pause()
profile
나의 삽질이 미래의 누군가를 구할 수 있다면...

0개의 댓글