라즈베리 파이 피코 버튼 디바운스
라즈베리 파이 파이코로 버튼이 눌렸을 때 이를 감지하는 프로그램을 작성하면, 한 번의 버튼 누름이 여러 번 읽히는 것을 볼 수 있습니다. 이는 버튼의 설계로 인해 ON과 OFF 상태가 빠르게 번갈아 나타날 수 있기 때문인데, 이런 번쩍임 현상을 "채터링"이라고 합니다. 채터링은 버튼이 여러 번 눌린 것처럼 보이게 만들어, 일부 프로그램에서는 오류를 발생시킬 수 있습니다. 이 안내서는 버튼의 채터링 문제를 해결하는 방법, 즉 디바운싱 기법에 대해 설명합니다.
아래 다섯 가지 예시를 살펴보고, 그 차이점을 설명할 것입니다.
디바운싱 처리 없이 버튼을 사용하는 Raspberry Pi Pico.
Raspberry Pi Pico는 버튼 디바운싱을 위해 utime.sleep_ms() 함수를 사용합니다.
Raspberry Pi Pico는 버튼 디바운싱에 비차단(non-blocking) 방식을 사용합니다.
Raspberry Pi Pico는 버튼 디바운싱을 위해 DIYables-MicroPython-Button 라이브러리를 사용합니다.
Raspberry Pi Pico는 세 개의 버튼 디바운싱을 위해 DIYables-MicroPython-Button 라이브러리를 사용합니다.
1 | × | 라즈베리 파이 피코 W | 아마존 | |
1 | × | 라즈베리 파이 피코 (또는) | 아마존 | |
1 | × | 마이크로 USB 케이블 | 아마존 | |
1 | × | 캡이 있는 버튼 | 쿠팡 | 아마존 | |
1 | × | 버튼 키트 | 쿠팡 | 아마존 | |
1 | × | 패널 장착 푸시 버튼 | 아마존 | |
1 | × | 푸시 버튼 모듈 | 아마존 | |
1 | × | 브레드보드 | 쿠팡 | 아마존 | |
1 | × | 점퍼케이블 | 쿠팡 | 아마존 | |
1 | × | (추천) 라즈베리 파이 피코용 스크루 터미널 확장 보드 | 아마존 | |
공개: 이 섹션에서 제공된 링크 중 일부는 제휴 링크입니다. 이 링크를 통해 구매한 경우 추가 비용없이 수수료를 받을 수 있습니다. 지원해 주셔서 감사합니다.
버튼의 레이아웃, 사용법, 프로그래밍 방법 등을 포함한 작동 원리를 알아보려면 이 가이드들을 확인해 보세요.
![라즈베리 파이 피코 버튼 배선도](https://newbiely.kr/images/tutorial/raspberry-pi-pico-button-wiring-diagram.jpg)
이 이미지는 Fritzing을 사용하여 만들어졌습니다. 이미지를 확대하려면 클릭하세요.
라즈베리 파이 피코 코드를 디바운스 없이와 디바운스 적용 후로 살펴보고 비교해보자, 그리고 이들이 어떻게 동작하는지 확인해보자.
먼저, 디바운싱 없이 코드를 살펴보고 그것이 어떻게 작동하는지 이해해 봅시다.
/*
* 이 라즈베리 파이 피코 코드는 newbiely.kr 에서 개발되었습니다
* 이 라즈베리 파이 피코 코드는 어떠한 제한 없이 공개 사용을 위해 제공됩니다.
* 상세한 지침 및 연결도에 대해서는 다음을 방문하세요:
* https://newbiely.kr/tutorials/raspberry-pico/raspberry-pi-pico-button-debounce
*/
from machine import Pin
import time
BUTTON_PIN = 0
button = Pin(BUTTON_PIN, Pin.IN, Pin.PULL_UP)
prev_button_state = 1
while True:
button_state = button.value()
if prev_button_state == 0 and button_state == 1:
print("The button is released")
if prev_button_state == 1 and button_state == 0:
print("The button is pressed")
prev_button_state = button_state
다음 지침을 단계별로 따르십시오:
컴퓨터에 Thonny IDE가 설치되어 있는지 확인하세요.
Raspberry Pi Pico에 MicroPython 펌웨어가 설치되어 있는지 확인하세요.
제공된 다이어그램에 따라 버튼을 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에 저장하세요:
녹색 Run 버튼을 클릭하거나 F5 키를 눌러 스크립트를 실행하세요. 스크립트가 실행될 것입니다.
버튼을 몇 초간 누른 후 놓으세요.
Thonny 하단의 Shell에 표시되는 메시지를 확인하세요.
>>> %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는 그것이 여러 번 수행된 것으로 인식합니다.
/*
* 이 라즈베리 파이 피코 코드는 newbiely.kr 에서 개발되었습니다
* 이 라즈베리 파이 피코 코드는 어떠한 제한 없이 공개 사용을 위해 제공됩니다.
* 상세한 지침 및 연결도에 대해서는 다음을 방문하세요:
* https://newbiely.kr/tutorials/raspberry-pico/raspberry-pi-pico-button-debounce
*/
from machine import Pin
import utime
BUTTON_PIN = 0
DEBOUNCE_TIME = 100
button = Pin(BUTTON_PIN, Pin.IN, Pin.PULL_UP)
prev_button_state = 1
while True:
button_state = button.value()
if prev_button_state == 0 and button_state == 1:
print("The button is released")
utime.sleep_ms(DEBOUNCE_TIME)
if prev_button_state == 1 and button_state == 0:
print("The button is pressed")
utime.sleep_ms(DEBOUNCE_TIME)
prev_button_state = button_state
위의 MicroPython 코드를 복사하여 Thonny의 에디터에 붙여넣습니다.
코드를 Raspberry Pi Pico에 저장합니다.
녹색 Run 버튼을 클릭하거나 F5 키를 눌러 스크립트를 실행합니다.
버튼을 몇 초간 누른 후 놓습니다.
Thonny 하단의 Shell에서 출력을 확인합니다.
>>> %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
DEBOUNCE_TIME = 100
button = Pin(BUTTON_PIN, Pin.IN, Pin.PULL_UP)
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()
if current_state != last_flickerable_state:
last_debounce_time = current_time
last_flickerable_state = current_state
if time.ticks_diff(current_time, last_debounce_time) > DEBOUNCE_TIME:
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")
last_steady_state = current_state
time.sleep(0.01)
디바운싱 코드는 복잡해 보일 수 있으며, 특히 여러 버튼을 사용할 때 더욱 그렇습니다. 다행히도 여러 버튼을 관리해야 하는 초보자들을 위한 더 쉬운 방법이 있습니다. 이 방법은 DIYables_MicroPython_Button이라는 라이브러리를 사용합니다. DIYables_MicroPython_Button 라이브러리에 대해 여기에서 자세히 알아볼 수 있습니다.
몇 가지 예제 코드를 살펴보자.
/*
* 이 라즈베리 파이 피코 코드는 newbiely.kr 에서 개발되었습니다
* 이 라즈베리 파이 피코 코드는 어떠한 제한 없이 공개 사용을 위해 제공됩니다.
* 상세한 지침 및 연결도에 대해서는 다음을 방문하세요:
* https://newbiely.kr/tutorials/raspberry-pico/raspberry-pi-pico-button-debounce
*/
from DIYables_MicroPython_Button import Button
import time
button = Button(0)
button.set_debounce_time(100)
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개의 버튼 간의 배선도입니다:
![라즈베리 파이 피코 버튼 라이브러리 배선도](https://newbiely.kr/images/tutorial/raspberry-pi-pico-multiple-button-wiring-diagram.jpg)
이 이미지는 Fritzing을 사용하여 만들어졌습니다. 이미지를 확대하려면 클릭하세요.
/*
* 이 라즈베리 파이 피코 코드는 newbiely.kr 에서 개발되었습니다
* 이 라즈베리 파이 피코 코드는 어떠한 제한 없이 공개 사용을 위해 제공됩니다.
* 상세한 지침 및 연결도에 대해서는 다음을 방문하세요:
* https://newbiely.kr/tutorials/raspberry-pico/raspberry-pi-pico-button-debounce
*/
from DIYables_MicroPython_Button import Button
import time
button_1 = Button(7)
button_2 = Button(8)
button_3 = Button(9)
button_1.set_debounce_time(100)
button_2.set_debounce_time(100)
button_3.set_debounce_time(100)
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 채널 을 구독하여 알려 주시기 바랍니다. 비디오에 대한 높은 수요가 있다면, 비디오를 만들기 위해 노력하겠습니다.