본문 바로가기
라즈베리파이&아두이노

바운싱(Bouncing) 현상 방지

by minimax95 2020. 12. 23.

이번 포스팅에서는 버튼 동작시 발생하는 바운싱(Bouncing) 현상과 이를 방지하는 방법에 대해 정리해 보겠습니다.

 

바운싱(Bouncing)이란 기계적인 접점을 갖는 스위치들은 접점이 붙거나 떨어지는 시점에 접점이 여러 번 On/Off 되는 현상이 발생합니다. 이러한 현상은 약 100ms 정도 되는 순간에 여러 번 반복하기 때문에 의도하지 않는 인터럽트가 발생할 수 있습니다. 이러한 바운싱 현상을 제거해야 정상 동작을 할 수 있는데 이를 디바운싱(Debouncing)이라고 합니다.

 

이를 그림으로 나타내면 아래와 같습니다.

IoT 사물인터넷을 위한 라즈베리파이 4 정석 이미지 참조

디바운싱을 하는 방법에는 하드웨어적인 방법과 소프트웨어적인 방법이 있는데 여기서는 소프트웨어적으로 디바운싱 하는 방법에 대해 알아보겠습니다.

 

소프트웨어적으로 디바운싱을 하기 위해서 bouncetime을 설정하여 잘못된 신호 입력을 방지할 수 있습니다.

Event 알람 방식으로 푸시 버튼 스위치를 사용하기 위해 아래 사진과 같이 회로를 구성해 보았습니다.

 

아래의 파이썬 코드는 소프트웨어적으로 디바운싱을 하는 내용입니다.


import RPi.GPIO as GPIO

import time

 

button_pin = 15

led_pin = 4

GPIO.setwarnings(False)

GPIO.setmode(GPIO.BCM)

GPIO.setup(button_pin, GPIO.IN, pull_up_down=GPIO.PUD_DOWN)

GPIO.setup(led_pin, GPIO.OUT)

 

light_on = False

#button_callback 함수 정의

def button_callback(channel):

    global light_on

    if light_on == False:

        GPIO.output(led_pin, 1)

        print("Led On")

    else:

        GPIO.output(led_pin, 0)

        print("Led Off")

    light_on = not light_on

#Event 알림 방식으로 GPIO 핀의 Rising 신호를 감지하면 button_callback 함수 실행

GPIO.add_event_detect(button_pin, GPIO.RISING, callback=button_callback, bouncetime=300)

 

while 1:

    time.sleep(0.1)


(소스코드 참조 : IoT 사물인터넷을 위한 라즈베리파이 4 정석)

 

위 코드에서 가장 핵심은 아래서 세 번째 줄인 add_event_detect 설정 함수입니다.

여기에서 bounetime을 300ms로 설정하여 소프트웨어적으로 잘못된 신호를 걸러 낼 수 있습니다.

 

실행을 해보면 사람 눈으로는 식별이 안 되는 수준이지만 정밀한 동작을 요하는 프로젝트에서는 반드시 처리해 주어야 할 중요 사항입니다.

 

이상으로 바운싱(Bouncing)현상과 방지 방법에 대해서 알아보았습니다.

감사합니다.

댓글