본문으로 바로가기

라즈베리파이를 스트레스 해소용 장난감으로 사용하다보니 이것 저것 잡다한 지식만 늘어가는 단점이 있네요^^ 뭐 아무튼 오늘은 그렇게 이것저것 뒤지다가 라즈베리파이에서 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) 했는데 눌러졌으니 프로그램이 종료하는 거죠. 이렇게 오늘도 장나감가지고 기능 하나를 학습해 보았습니다.^^


댓글을 달아 주세요

  1. BlogIcon 핑구야 날자 2016.04.18 08:15 신고

    재미있는 테스트를 해보셨군요. 잘 보고 갑니다.

  2. 2016.04.18 09:51

    비밀댓글입니다

  3. BlogIcon kakawood 2016.04.18 10:04 신고

    잘 보고갈게요. 기분 좋은 하루 보내세요 ㅎㅎ

  4. BlogIcon 스마트걸 2016.04.18 13:42 신고

    완전고차원적으로노시는군요..전뭐가뭔지모르겠어요 ㅋㅋ

  5. BlogIcon 봉리브르 2016.04.19 07:40 신고

    필요할 때 잘 활용할 수 있는 정보
    잘 알고 갑니다.
    좋은 하루 보내세요^^

  6. BlogIcon 스마트걸 2016.04.19 18:09 신고

    뭔지모르지만잘보고갑니다

  7. BlogIcon ☆Unlimited☆ 2016.04.19 21:53 신고

    잘 보고 갑니다

  8. 오늘 하루도 행복하세요^^

  9. BlogIcon 아쿠나 2016.04.20 07:27 신고

    유용한 정보에 대해서 알아보시려는분께 유용한 글인듯 해요~
    잘 보고 가요 ^^

  10. 공모전 2016.09.03 17:23 신고

    안녕하세요 공모전준비중인 대학생인데 위의 글이 도움이 될거같아서 몇가지 여쭤봐도될까요ㅎㅎㅎ
    지정된 함수(my_callback)를 불러온다는게 그 함수를 따로 짜놓은걸 불러온다는건가요????

    • BlogIcon PinkWink 2016.09.05 07:15 신고

      네.. 인터럽트는 인터럽트가 발생했을때 수행될 함수를 준비해두어야하는데요. 그게 본문에서는 my_callback 함수입니다.

  11. BlogIcon 이레 2016.10.16 23:54 신고

    죄송합니다다만 혼자공부중인데
    검색해도 잘안나오는부분이있어서 여쭙니다
    Pull_up_down 지정할때 지정해주는이유와 up과 down의 차이좀 물어봐도 될까요?

    • BlogIcon PinkWink 2016.10.17 09:11 신고

      GPIO 출력을 pull-up으로 할 건지, down으로 할 건지를 선택하는 것이며...
      아주아주 잘 설명되어 있는 곳은
      http://pincoin.info/%EB%9D%BC%EC%A6%88%EB%B2%A0%EB%A6%AC-%ED%8C%8C%EC%9D%B4-%EC%8A%A4%EC%9C%84%EC%B9%98%EB%A1%9C-%EC%82%AC%EC%9A%A9%EC%9E%90-%EC%9E%85%EB%A0%A5-%EB%B0%9B%EA%B8%B0/
      입니다.^^