라즈베리파이(Raspberrypi)

[라즈베리파이] Polling과 Interrupt로 입력 신호 받기(폴링, 인터럽트)

끄적끄적아무거나 2022. 12. 23. 08:51
반응형

 

Raspbeery Pi Polling으로 입력 신호 받기

 

폴링(Polling) 방식은 지속적으로 해당 입력 신호쪽에 값을 기다리면서 값이 들어올때 값을 처리하는 방식입니다. 그렇기 때문에 비효율적인 방식입니다. 아래는 폴링(Polling) 방식의 특징입니다.

 

  • 폴링을 시행하면 보드의 다른 코드를 진행할 수 없음
  • 지속적으로 모니터링하여서 전력을 상대적으로 많이 사용

 

실제 폴링으로 동작하는 예제 코드를 통해 쉽게 이해해 보도록 하겠습니다.

 

해당 코드는 라즈베리파이 보드에서 나가는 5V신호와 접지(Ground) 신호를 저항 10kohm으로 GPIO23번 핀에 연결했다가 떨어뜨렸다가 하는 식으로 마치 버튼을 동작하는 것처럼 조작해서 이를 카운트하는 코드 입니다.

 

카운트 값은 print로 보드에서 확인할 수 있습니다. 

 

 

전체 구성은 아래와 같습니다. 

GPIO23번 핀을 저항으로 접지(Ground)와 연결해서 Pull down해주었습니다. 그리고 3.3V 전원의 선을 GPIO23번 핀에 한번씩 연결해주었습니다. 

 

 

전체 코드>>

import RPi.GPIO as GPIO
import time

GPIO.setmode(GPIO.BCM)
GPIO.setup(23, GPIO.IN, pull_up_down=GPIO.PUD_DOWN)

cnt = 0
while True:
    connected = GPIO.input(23)
    if connected == True:
        cnt = cnt + 1
        print("the no of switch on : ", cnt)
    time.sleep(0.2)

 

 

동작 화면>>

 

결과>>

 

 

 

 

 

 

 

 

Raspbeery Pi Interrupt 방식으로 입력 신호 받기

앞서의 폴링 방식의 문제로 인해 인터럽트(Interrupt) 방식이 나오게 되었습니다. 인터럽트(Interrupt)는 영문 그대로 방해하다로 메인 PC는 다른 동작을 하고 입출력 관련 인터럽트가 입출력 관련 모니터링을 하고 이벤트(Event)가 발생하는 경우에만 메인 PC에 알려주는 방식입니다.

 

이와 같은 방식을 콜백(Callback) 방식이라고도 합니다. 콜백이란 특정 이벤트 발생 시 특정 함수가 동작하게 하는 것입니다. 이때 특정 함수를 콜백 함수 또는 이벤트 핸들러(Event Handler)라고도 합니다. 

 

예제를 통해 쉽게 이해해보도록 하겠습니다. 예제는 메인 PC는 Hello 라는 문구를 2초 간격으로 동작시키고 그 동안 이벤트가 발생하면 event handler에서 앞서 폴링 처럼 입력으로 3.3V가 들어올때마다 카운팅 하겠습니다.

 

 

전체 코드>>

import RPi.GPIO as GPIO
import time

cnt = 0
def cnt_inc(channel):
    global cnt
    cnt = cnt + 1
    print("no of switch on : ", cnt)


GPIO.setmode(GPIO.BCM)
GPIO.setup(23, GPIO.IN, pull_up_down=GPIO.PUD_DOWN)
GPIO.add_event_detect(23, GPIO.RISING, callback=cnt_inc)

while True:
    print("Hello")
    time.sleep(2)

 

 

 

결과>>

cnt_inc 함수에 time.sleep을 넣지 않아서 한번 접촉으로 빠르게 카운팅 되고 있음을 알 수 있습니다.

 

 

 

 

주석>>

cnt = 0
def cnt_inc(channel):
    global cnt
    cnt = cnt + 1
    print("no of switch on : ", cnt)

 

event handler 함수를 미리 설정해서 나중에 불러 올 수 있게 합니다. 함수 실행 시 카운팅을 합니다. 

 

 

GPIO.setmode(GPIO.BCM)
GPIO.setup(23, GPIO.IN, pull_up_down=GPIO.PUD_DOWN)
GPIO.add_event_detect(23, GPIO.RISING, callback=cnt_inc)

GPIO23을 입력으로 만들고 Pulldown으로 연결합니다. add_event_detect 함수를 사용해서 전압이 문턱을 넘어가면 cnt_inc 함수를 콜백함수로 실행해줍니다.

 

 

while True:
    print("Hello")
    time.sleep(2)

이벤트와는 별도로 메인은 위와 같이 while문으로 잡아놓습니다.

 

 

 

 

반응형