본문 바로가기

Hardware/SBC (rasp, jetson, latte panda)

라즈베리파이에서 Python 이용하여 GPIO 인터럽트 사용하기

라즈베리파이를 스트레스 해소용 장난감으로 사용하다보니 이것 저것 잡다한 지식만 늘어가는 단점이 있네요^^ 뭐 아무튼 오늘은 그렇게 이것저것 뒤지다가 라즈베리파이에서 Python으로 코드를 다룬다면 유용할 GPIO 인터럽트 Interrupt 사용하는 방법을 잘 정리해 준 블로그[바로가기]가 있길래, 제가 언제나 그렇듯 고대로~~ 따라해보기를 했습니다.^^

요즘 라즈베리파이랑 놀면서 친숙해진 fritzing으로 결선을 그립니다. 푸시버튼 두 개를 라즈베리파이에 살짝 물려 주었습니다.

사진은 다른 용도로 데리고 놀려고 3개를 달았지만 20번 21번 GPIO에 연결한 두 개만 오늘 사용할 생각입니다.^^

아무리 생각해도 저 확장 보드는 잘 잘 쓰고 있습니다^^

import RPi.GPIO as GPIO

GPIO.setmode(GPIO.BCM)
GPIO.setup(21, GPIO.IN, pull_up_down=GPIO.PUD_UP)
GPIO.setup(20, GPIO.IN, pull_up_down=GPIO.PUD_UP)

def my_callback(channel):
    print("Key(20) Pressed")
    
GPIO.add_event_detect(20, GPIO.FALLING, callback=my_callback)

try:
    print("Waiting f or falling edge on port 21")
    GPIO.wait_for_edge(21, GPIO.RISING)
    print("Falling edge detected. Here endeth the second lesson.")

except KeyboardInterrupt:
    GPIO.cleanup()       # clean up GPIO on CTRL+C exit
    
GPIO.cleanup()           # clean up GPIO on normal exit

일단 위 코드에서 21번과 20번을 풀업으로 세팅하는 과정을 두고, 20번에 연결한 버튼이 눌러질때 인터럽트가 실행됨을 확인하기 위해 Key Pressed라는 메세지를 뿌리도록 합니다. 그리고 다른 버튼인 21번 버튼이 눌러질 때까지 대기하다가 GPIO.wait_for_edge 눌러지면 프로그램이 종료하는 거죠^^. 뭐 키보드로 CTRL+C를 눌러도 프로그램이 종료를 하도록 되어 있습니다. 인터럽트를 thread방식으로 구현하도록 하는 코드는 GPIO.add_event_detect라는 것인데 callback 함수를 지정해 주면 됩니다.^^

처음에는 저렇게 대기 상태에 있다가...

20번에 연결된 버튼을 누르면 인터럽트가 발생하고 지정된 함수(my_callback)이 실행됩니다.

그리고 21번에 연결된 버튼을 눌러주면 종료~~^^ 왜냐면 21번에 연결된 버튼이 눌러질 때까지는 기다리라고(GPIO.wait_for_edge) 했는데 눌러졌으니 프로그램이 종료하는 거죠. 이렇게 오늘도 장나감가지고 기능 하나를 학습해 보았습니다.^^

반응형