General Purpose Input Output의 약자로, 말 그대로 범용 입출력을 의미한다.
라즈베리파이에 나와 있는 이 핀들이 GPIO핀인데, 이 핀들을 활용해서 간단한 회로를 구성해볼 수 있다. 아두이노와 비슷하지만, 라즈베리파이에서는 파이썬 패키지를 활용하여 조금 더 간단하게 구현할 수 있다.
pin 관련 정보는 아래 명령어를 통해 볼 수 있다.
pinout
gpiozero는 라즈베리파이에서 gpio를 파이썬으로 제어하기 쉽도록 만든 패키지이다.
GPIO document
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_pressed
와 when_released
를 사용하면 버튼을 누르는 순간과 버튼에서 손을 떼는 상황을 감지할 수 있다.
when_pressed
와 when_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()