아두이노 나노 - 버튼 - 디바운스 | Arduino Nano - Button - Debounce

버튼이 눌리거나 놓이거나 스위치가 전환될 때, 초보자들은 종종 그 상태가 LOW에서 HIGH 또는 HIGH에서 LOW로 변경된다고 가정합니다. 실제로는 항상 그런 것은 아닙니다. 기계적이고 물리적 특성으로 인해, 버튼(또는 스위치)의 상태가 단일 이벤트에 대해 LOWHIGH 사이에서 여러 번 빠르게 전환될 수 있습니다. 이 현상을 차터링이라고 합니다. 차터링은 단일 누름이 여러 번 눌린 것처럼 읽혀져 특정 응용 프로그램에서 오작동을 일으킬 수 있습니다.

chattering phenomenon

이 문제를 제거하는 방법은 디바운싱 혹은 디바운스로 언급됩니다. 이 튜토리얼에서는 아두이노 나노와 함께 버튼을 사용할 때 어떻게 하는지 알려드립니다. 아래 단계를 통해 배울 것입니다:

준비물

1×Arduino Nano Amazon
1×USB A to Mini-B USB cable 쿠팡 | Amazon
1×Push Button 쿠팡 | Amazon
1×(Optional) Panel-mount Push Button Amazon
1×Breadboard 쿠팡 | Amazon
1×Jumper Wires Amazon
1×(Optional) 9V Power Adapter for Arduino Nano Amazon
1×(Recommended) Screw Terminal Expansion Board for Arduino Nano 쿠팡 | Amazon
공개: 이 섹션에서 제공된 링크 중 일부는 제휴 링크입니다. 이 링크를 통해 구매한 경우 추가 비용없이 수수료를 받을 수 있습니다. 지원해 주셔서 감사합니다.

버튼 정보

버튼(핀배열, 기능, 프로그래밍 등)에 익숙하지 않다면, 다음 튜토리얼이 도움이 될 수 있습니다:

아두이노 나노 - 버튼 튜토리얼

선연결

Arduino Nano Button wiring diagram

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

데바운스가 있는 경우와 없는 경우를 비교하여 아두이노 나노 코드와 각각의 행동을 관찰해 봅시다.

디바운스 없는 읽기 버튼

디바운싱 개념에 들어가기 전에, 디바운싱 없이 작성된 코드를 보고 그 동작을 관찰해보세요.

사용 방법

  • 아두이노 나노와 PC에 USB 케이블을 연결하십시오.
  • 아두이노 IDE를 실행하고, 올바른 보드와 포트를 선택하십시오.
  • 아래의 코드를 복사하고 아두이노 IDE에서 열십시오.
/* * 이 Arduino Nano 코드는 newbiely.kr 에서 개발되었습니다 * 이 Arduino Nano 코드는 어떠한 제한 없이 공개 사용을 위해 제공됩니다. * 상세한 지침 및 연결도에 대해서는 다음을 방문하세요: * https://newbiely.kr/tutorials/arduino-nano/arduino-nano-button-debounce */ #define BUTTON_PIN 2 // 푸시버튼 핀의 번호 int prev_button_state = LOW; // 입력 핀에서의 이전 상태 int button_state; // 입력 핀에서의 현재 읽기 값 void setup() { // 시리얼 모니터와 통신하기 위해 Serial을 초기화합니다. Serial.begin(9600); // 아두이노 나노 핀을 풀업 입력으로 구성합니다 // 풀업 입력 핀은 버튼이 열려있을 때 HIGH이고, 눌렸을 때 LOW입니다. pinMode(BUTTON_PIN, INPUT_PULLUP); } void loop() { // 스위치/버튼의 상태를 읽습니다: button_state = digitalRead(BUTTON_PIN); if(prev_button_state == HIGH && button_state == LOW) Serial.println("The button is pressed"); else if(prev_button_state == LOW && button_state == HIGH) Serial.println("The button is released"); // 마지막 상태를 저장합니다 prev_button_state = button_state; }

아두이노 IDE에서 Upload 버튼을 클릭하여 코드를 컴파일하고 아두이노 나노 보드에 업로드하세요.

Arduino IDE Upload Code
  • 시리얼 모니터를 엽니다.
  • 몇 초 동안 버튼을 누르고 있었다가 놓습니다.
  • 몇 번 시도해보세요.
  • 시리얼 모니터에서 결과를 확인하세요.
COM6
Send
The button is pressed The button is pressed The button is pressed The button is released The button is released
Autoscroll Show timestamp
Clear output
9600 baud  
Newline  

때로는 버튼을 단 한 번만 눌렀다가 놓았을 뿐인데도, 아두이노 나노가 여러 번 누르고 놓은 것으로 해석합니다. 이것이 바로 튜토리얼 초반에 언급된 채터링 현상입니다. 다음 파트에서 이를 어떻게 해결하는지 살펴봅시다.

디바운스를 사용하는 읽기 버튼

아래 코드는 디바운스라는 방법을 적용하여 채터링 현상을 방지합니다.

/* * 이 Arduino Nano 코드는 newbiely.kr 에서 개발되었습니다 * 이 Arduino Nano 코드는 어떠한 제한 없이 공개 사용을 위해 제공됩니다. * 상세한 지침 및 연결도에 대해서는 다음을 방문하세요: * https://newbiely.kr/tutorials/arduino-nano/arduino-nano-button-debounce */ #define BUTTON_PIN 2 // 버튼 핀 번호 const int DEBOUNCE_DELAY = 50; // 디바운스 시간; 출력이 깜빡이면 시간을 늘리세요. int lastSteadyState = LOW; // 입력 핀의 이전 안정된 상태 int lastFlickerableState = LOW; // 입력 핀의 이전 깜빡이는 상태 int button_state; // 입력 핀에서의 현재 읽기 값 // 다음 변수들은 unsigned long 타입입니다 왜냐하면, 시간이 밀리초 단위로 측정되며, // int에 저장할 수 있는 것보다 빠르게 더 큰 숫자가 될 것이기 때문입니다. unsigned long lastDebounceTime = 0; // 출력 핀이 마지막으로 토글된 시간 void setup() { // 시리얼 모니터와 통신하기 위해 시리얼을 초기화합니다. Serial.begin(9600); // 아두이노 나노 핀을 풀업 입력으로 설정합니다 // 풀업 입력 핀은 버튼이 눌리지 않았을 때 HIGH이고, 눌렸을 때는 LOW입니다. pinMode(BUTTON_PIN, INPUT_PULLUP); } void loop() { // 스위치/버튼의 상태를 읽습니다: button_state = digitalRead(BUTTON_PIN); // 버튼을 방금 눌렀는지 확인합니다 // (즉, 입력이 LOW에서 HIGH로 바뀌었고), 마지막 누름 이후 충분한 시간이 지났는지 // 소음을 무시하기 위해 기다렸습니다: // 스위치/버튼이 변경되었다면, 소음 또는 누름 때문에: if (button_state != lastFlickerableState) { // 디바운싱 타이머를 리셋합니다. lastDebounceTime = millis(); // 마지막 깜빡일 수 있는 상태를 저장합니다. lastFlickerableState = button_state; } if ((millis() - lastDebounceTime) > DEBOUNCE_DELAY) { // 읽기 값이 디바운스 지연 시간보다 오래 있었다면, // 실제 현재 상태로 받아들입니다: // 버튼 상태가 바뀌었다면: if (lastSteadyState == HIGH && button_state == LOW) Serial.println("The button is pressed"); else if (lastSteadyState == LOW && button_state == HIGH) Serial.println("The button is released"); // 마지막 안정된 상태를 저장합니다. lastSteadyState = button_state; } }

사용 방법

  • 위의 코드를 복사하고 Arduino IDE로 열어주세요.
  • Arduino IDE에서 Upload 버튼을 클릭하여 코드를 컴파일하고 Arduino Nano에 업로드하세요.
  • 시리얼 모니터를 엽니다.
  • 몇 초 동안 버튼을 계속 누른 후에 놓습니다.
  • 시리얼 모니터에서 결과를 확인하세요.
COM6
Send
The button is pressed The button is released
Autoscroll Show timestamp
Clear output
9600 baud  
Newline  

당신이 관찰할 수 있듯이, 당신은 버튼을 한 번만 누르고 놓았습니다. Arduino Nano는 이를 단일 푸시와 릴리스로 감지합니다. 잡음이 제거되었습니다.

우리는 이것을 간단하게 만들었습니다 - 라이브러리를 사용한 아두이노 나노 버튼 디바운스 코드

우리는 특히 여러 개의 버튼을 다룰 때, 막 시작하는 사람들에게 더 간단하게 만들기 위해 ezButton이라는 라이브러리를 디자인했습니다. 여기에서 ezButton 라이브러리에 대해 더 알아볼 수 있습니다.

아두이노 나노 단일 버튼 디바운스 코드

#include <ezButton.h> ezButton button(2); // 핀 2에 대한 ezButton 객체를 생성한다. void setup() { Serial.begin(9600); button.setDebounceTime(50); // 디바운스 시간을 50 밀리초로 설정한다. } void loop() { button.loop(); // 반드시 loop() 함수를 먼저 호출해야 한다. if(button.isPressed()) Serial.println("The button is pressed"); if(button.isReleased()) Serial.println("The button is released"); }

아두이노 나노 멀티 버튼 디바운스 코드

/* * 이 Arduino Nano 코드는 newbiely.kr 에서 개발되었습니다 * 이 Arduino Nano 코드는 어떠한 제한 없이 공개 사용을 위해 제공됩니다. * 상세한 지침 및 연결도에 대해서는 다음을 방문하세요: * https://newbiely.kr/tutorials/arduino-nano/arduino-nano-button-debounce */ #include <ezButton.h> ezButton button1(6); // 6번 핀을 위한 ezButton 객체를 생성; ezButton button2(7); // 7번 핀을 위한 ezButton 객체를 생성; ezButton button3(8); // 8번 핀을 위한 ezButton 객체를 생성; void setup() { Serial.begin(9600); button1.setDebounceTime(50); // 디바운스 시간을 50밀리초로 설정 button2.setDebounceTime(50); // 디바운스 시간을 50밀리초로 설정 button3.setDebounceTime(50); // 디바운스 시간을 50밀리초로 설정 } void loop() { button1.loop(); // 반드시 loop() 함수를 먼저 호출해야 함 button2.loop(); // 반드시 loop() 함수를 먼저 호출해야 함 button3.loop(); // 반드시 loop() 함수를 먼저 호출해야 함 if(button1.isPressed()) Serial.println("The button 1 is pressed"); if(button1.isReleased()) Serial.println("The button 1 is released"); if(button2.isPressed()) Serial.println("The button 2 is pressed"); if(button2.isReleased()) Serial.println("The button 2 is released"); if(button3.isPressed()) Serial.println("The button 3 is pressed"); if(button3.isReleased()) Serial.println("The button 3 is released"); }

위의 코드에 대한 개략도: 코드의 배선을 나타낸 도해. 코드의 배선에 대한 시각적 표현:

Arduino Nano multiple buttons wiring diagram

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

동영상

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

추가 지식

DEBOUNCE_DELAY의 값은 각 버튼의 물리적 특성에 따라 달라질 수 있습니다. 다른 버튼들이 다른 값을 사용할 수도 있습니다.

확장성

디바운스 기법은 스위치, 터치 센서 등과 함께 사용될 수 있습니다.

※ OUR MESSAGES

  • Please feel free to share the link of this tutorial. However, Please do not use our content on any other websites. We invested a lot of effort and time to create the content, please respect our work!