라즈베리 파이 피코 버튼 디바운스

라즈베리 파이 파이코로 버튼이 눌렸을 때 이를 감지하는 프로그램을 작성하면, 한 번의 버튼 누름이 여러 번 읽히는 것을 볼 수 있습니다. 이는 버튼의 설계로 인해 ON OFF 상태가 빠르게 번갈아 나타날 수 있기 때문인데, 이런 번쩍임 현상을 "채터링"이라고 합니다. 채터링은 버튼이 여러 번 눌린 것처럼 보이게 만들어, 일부 프로그램에서는 오류를 발생시킬 수 있습니다. 이 안내서는 버튼의 채터링 문제를 해결하는 방법, 즉 디바운싱 기법에 대해 설명합니다.

라즈베리 파이 파이코 채터링 현상

아래 다섯 가지 예시를 살펴보고, 그 차이점을 설명할 것입니다.

준비물

1×라즈베리 파이 피코 W 아마존
1×라즈베리 파이 피코 (또는) 아마존
1×마이크로 USB 케이블 아마존
1×캡이 있는 버튼 쿠팡 | 아마존
1×버튼 키트 쿠팡 | 아마존
1×패널 장착 푸시 버튼 아마존
1×푸시 버튼 모듈 아마존
1×브레드보드 쿠팡 | 아마존
1×점퍼케이블 쿠팡 | 아마존
1×(추천) 라즈베리 파이 피코용 스크루 터미널 확장 보드 아마존
공개: 이 섹션에서 제공된 링크 중 일부는 제휴 링크입니다. 이 링크를 통해 구매한 경우 추가 비용없이 수수료를 받을 수 있습니다. 지원해 주셔서 감사합니다.

버튼 소개

버튼의 레이아웃, 사용법, 프로그래밍 방법 등을 포함한 작동 원리를 알아보려면 이 가이드들을 확인해 보세요.

선연결

라즈베리 파이 피코 버튼 배선도

이 이미지는 Fritzing을 사용하여 만들어졌습니다. 이미지를 확대하려면 클릭하세요.

라즈베리 파이 피코 코드를 디바운스 없이와 디바운스 적용 후로 살펴보고 비교해보자, 그리고 이들이 어떻게 동작하는지 확인해보자.

라즈베리 파이 피코 - 디바운스 없는 버튼

먼저, 디바운싱 없이 코드를 살펴보고 그것이 어떻게 작동하는지 이해해 봅시다.

/* * 이 라즈베리 파이 피코 코드는 newbiely.kr 에서 개발되었습니다 * 이 라즈베리 파이 피코 코드는 어떠한 제한 없이 공개 사용을 위해 제공됩니다. * 상세한 지침 및 연결도에 대해서는 다음을 방문하세요: * https://newbiely.kr/tutorials/raspberry-pico/raspberry-pi-pico-button-debounce */ from machine import Pin import time BUTTON_PIN = 0 # The Raspberry Pi Pico pin connected to the button (GP0) # Setup the button pin. The Pin.PULL_UP enables the internal pull-up resistor. button = Pin(BUTTON_PIN, Pin.IN, Pin.PULL_UP) # Initialize the previous state of the button prev_button_state = 1 # Assuming the button is unpressed initially while True: # Read the current state of the button button_state = button.value() # Check if button was released if prev_button_state == 0 and button_state == 1: print("The button is released") # Check if button was pressed if prev_button_state == 1 and button_state == 0: print("The button is pressed") # Save the current state as the previous state for the next loop iteration prev_button_state = button_state

자세한 사용 방법

다음 지침을 단계별로 따르십시오:

  • 컴퓨터에 Thonny IDE가 설치되어 있는지 확인하세요.
  • Raspberry Pi Pico에 MicroPython 펌웨어가 설치되어 있는지 확인하세요.
  • Raspberry Pi Pico를 처음 사용하는 경우, 자세한 지침은 라즈베리 파이 피코 - 시작하기 튜토리얼을 참조하세요.
  • 제공된 다이어그램에 따라 버튼을 Raspberry Pi Pico에 연결하세요.
  • USB 케이블을 사용하여 Raspberry Pi Pico를 컴퓨터에 연결하세요.
  • 컴퓨터에서 Thonny IDE를 실행하세요.
  • Thonny IDE에서 Tools Options로 이동하여 MicroPython (Raspberry Pi Pico) 인터프리터를 선택하세요.
  • Interpreter 탭에서 드롭다운 메뉴에서 MicroPython (Raspberry Pi Pico)를 선택하세요.
  • 올바른 포트가 선택되어 있는지 확인하세요. Thonny IDE는 포트를 자동으로 감지하지만, 수동으로 선택해야 할 수도 있습니다 (예: Windows에서는 COM3, Linux에서는 /dev/ttyACM0).
  • 위의 코드를 복사하여 Thonny IDE의 편집기에 붙여넣으세요.
  • 아래 단계에 따라 스크립트를 Raspberry Pi Pico에 저장하세요:
    • 저장 버튼을 클릭하거나 Ctrl+S 키를 사용합니다.
    • 저장 대화상자에 '이 컴퓨터'와 'Raspberry Pi Pico' 두 섹션이 표시되면 Raspberry Pi Pico를 선택하세요.
    • 파일명을 main.py로 저장하세요.
  • 녹색 Run 버튼을 클릭하거나 F5 키를 눌러 스크립트를 실행하세요. 스크립트가 실행될 것입니다.
  • 버튼을 몇 초간 누른 후 놓으세요.
  • Thonny 하단의 Shell에 표시되는 메시지를 확인하세요.
Shell x
>>> %Run -c $EDITOR_CONTENT
MPY: soft reboot The button is pressed The button is pressed The button is pressed The button is released The button is released
MicroPython (Raspberry Pi Pico) • Board CDC @ COM29 ≡

버튼을 단 한 번 누르고 떼었지만, Raspberry Pi Pico는 그것이 여러 번 수행된 것으로 인식합니다.

Raspberry Pi Pico - 디바운스 기능이 있는 버튼

/* * 이 라즈베리 파이 피코 코드는 newbiely.kr 에서 개발되었습니다 * 이 라즈베리 파이 피코 코드는 어떠한 제한 없이 공개 사용을 위해 제공됩니다. * 상세한 지침 및 연결도에 대해서는 다음을 방문하세요: * https://newbiely.kr/tutorials/raspberry-pico/raspberry-pi-pico-button-debounce */ from machine import Pin import utime BUTTON_PIN = 0 # The Raspberry Pi Pico pin connected to the button (GP0) DEBOUNCE_TIME = 100 # debounce time in milliseconds # Setup the button pin. The Pin.PULL_UP enables the internal pull-up resistor. button = Pin(BUTTON_PIN, Pin.IN, Pin.PULL_UP) # Initialize the previous state of the button prev_button_state = 1 # Assuming the button is unpressed initially while True: # Read the current state of the button button_state = button.value() # Check if button was released if prev_button_state == 0 and button_state == 1: print("The button is released") utime.sleep_ms(DEBOUNCE_TIME) # Check if button was pressed if prev_button_state == 1 and button_state == 0: print("The button is pressed") utime.sleep_ms(DEBOUNCE_TIME) # Save the current state as the previous state for the next loop iteration prev_button_state = button_state

자세한 사용 방법

  • 위의 MicroPython 코드를 복사하여 Thonny의 에디터에 붙여넣습니다.
  • 코드를 Raspberry Pi Pico에 저장합니다.
  • 녹색 Run 버튼을 클릭하거나 F5 키를 눌러 스크립트를 실행합니다.
  • 버튼을 몇 초간 누른 후 놓습니다.
  • Thonny 하단의 Shell에서 출력을 확인합니다.
Shell x
>>> %Run -c $EDITOR_CONTENT
MPY: soft reboot The button is pressed The button is released
MicroPython (Raspberry Pi Pico) • Board CDC @ COM29 ≡

버튼을 한 번 클릭했고, Raspberry Pi Pico는 추가 잡음 없이 정확하게 한 번 누르고 뗀 것으로 인식했습니다.

※ 주의:

애플리케이션마다 서로 다른 DEBOUNCE_TIME 값을 사용합니다. 각 애플리케이션은 특정 값을 가질 수 있습니다.

위 코드에서는 utime.sleep_ms()를 사용하여 버튼의 디바운스를 처리합니다. 이 함수는 슬립 시간 동안 Raspberry Pico가 다른 작업을 수행하지 못하게 합니다. 다음에는 다른 작업들을 중단하지 않고 디바운스를 처리하는 방법을 보여주는 또 다른 예제를 살펴보겠습니다.

라즈베리 파이 피코 - 논블로킹 디바운스 버튼

/* * 이 라즈베리 파이 피코 코드는 newbiely.kr 에서 개발되었습니다 * 이 라즈베리 파이 피코 코드는 어떠한 제한 없이 공개 사용을 위해 제공됩니다. * 상세한 지침 및 연결도에 대해서는 다음을 방문하세요: * https://newbiely.kr/tutorials/raspberry-pico/raspberry-pi-pico-button-debounce */ from machine import Pin import time BUTTON_PIN = 0 # The Raspberry Pi Pico pin connected to the button (GP0) DEBOUNCE_TIME = 100 # debounce time in milliseconds # Setup the button pin with internal pull-up resistor button = Pin(BUTTON_PIN, Pin.IN, Pin.PULL_UP) # Initialize variables to track the debounce status last_steady_state = button.value() last_flickerable_state = button.value() last_debounce_time = time.ticks_ms() while True: current_state = button.value() current_time = time.ticks_ms() # Check if the current state is different from the last flickerable state if current_state != last_flickerable_state: # Reset the debounce timer last_debounce_time = current_time # Update the last flickerable state last_flickerable_state = current_state # Check if the debounce period has passed since the last state change if time.ticks_diff(current_time, last_debounce_time) > DEBOUNCE_TIME: # If the steady state is different from the current state after the debounce time, update it if current_state != last_steady_state: if last_steady_state == 1 and current_state == 0: print("The button is pressed") elif last_steady_state == 0 and current_state == 1: print("The button is released") # Update the steady state last_steady_state = current_state # Short delay to prevent the loop from running too quickly time.sleep(0.01)

라즈베리 파이 피코 - 라이브러리를 사용한 디바운스

디바운싱 코드는 복잡해 보일 수 있으며, 특히 여러 버튼을 사용할 때 더욱 그렇습니다. 다행히도 여러 버튼을 관리해야 하는 초보자들을 위한 더 쉬운 방법이 있습니다. 이 방법은 DIYables_MicroPython_Button이라는 라이브러리를 사용합니다. DIYables_MicroPython_Button 라이브러리에 대해 여기에서 자세히 알아볼 수 있습니다.

몇 가지 예제 코드를 살펴보자.

Raspberry Pi Pico 단일 버튼을 위한 버튼 디바운스 코드

/* * 이 라즈베리 파이 피코 코드는 newbiely.kr 에서 개발되었습니다 * 이 라즈베리 파이 피코 코드는 어떠한 제한 없이 공개 사용을 위해 제공됩니다. * 상세한 지침 및 연결도에 대해서는 다음을 방문하세요: * https://newbiely.kr/tutorials/raspberry-pico/raspberry-pi-pico-button-debounce */ from DIYables_MicroPython_Button import Button import time # Initialize buttons connected to GPIO pins GP0 button = Button(0) button.set_debounce_time(100) # Set debounce time to 100 milliseconds while True: button.loop() if button.is_pressed(): print("The button is pressed") if button.is_released(): print("The button is released")
빠른 단계
  • Thonny IDE에서 Thonny IDE의 도구 패키지 관리로 이동합니다.
  • “DIYables-MicroPython-Button”을 검색한 후, DIYables에서 만든 Button 라이브러리를 찾습니다.
  • DIYables-MicroPython-Button을 클릭하고, Button 라이브러리를 설치하려면 Install 버튼을 클릭합니다.
라즈베리 파이 피코 버튼 라이브러리
  • 위 코드를 복사하여 Thonny IDE의 편집기에 붙여넣습니다.
  • 스크립트를 Raspberry Pi Pico에 저장합니다.
  • 녹색 Run 버튼을 클릭하거나 (또는 F5 키를 눌러) 스크립트를 실행합니다. 스크립트가 실행될 것입니다.
  • 버튼을 누릅니다.
  • Thonny 하단에 있는 Shell에서 메시지를 확인합니다.

라즈베리 파이 피코 버튼 디바운스 코드 (다중 버튼용)

3개의 버튼에 대해 디바운싱해 봅시다. 아래는 Raspberry Pi Pico와 3개의 버튼 간의 배선도입니다:

라즈베리 파이 피코 버튼 라이브러리 배선도

이 이미지는 Fritzing을 사용하여 만들어졌습니다. 이미지를 확대하려면 클릭하세요.

/* * 이 라즈베리 파이 피코 코드는 newbiely.kr 에서 개발되었습니다 * 이 라즈베리 파이 피코 코드는 어떠한 제한 없이 공개 사용을 위해 제공됩니다. * 상세한 지침 및 연결도에 대해서는 다음을 방문하세요: * https://newbiely.kr/tutorials/raspberry-pico/raspberry-pi-pico-button-debounce */ from DIYables_MicroPython_Button import Button import time # Initialize buttons connected to GPIO pins 7, 8, and 9 button_1 = Button(7) button_2 = Button(8) button_3 = Button(9) button_1.set_debounce_time(100) # Set debounce time to 100 milliseconds button_2.set_debounce_time(100) # Set debounce time to 100 milliseconds button_3.set_debounce_time(100) # Set debounce time to 100 milliseconds while True: button_1.loop() button_2.loop() button_3.loop() if button_1.is_pressed(): print("The button 1 is pressed") if button_1.is_released(): print("The button 1 is released") if button_2.is_pressed(): print("The button 2 is pressed") if button_2.is_released(): print("The button 2 is released") if button_3.is_pressed(): print("The button 3 is pressed") if button_3.is_released(): print("The button 3 is released")

동영상

비디오 제작은 시간이 많이 걸리는 작업입니다. 비디오 튜토리얼이 학습에 도움이 되었다면, YouTube 채널 을 구독하여 알려 주시기 바랍니다. 비디오에 대한 높은 수요가 있다면, 비디오를 만들기 위해 노력하겠습니다.