아두이노 나노 - 버튼 | Arduino Nano - Button

이 튜토리얼은 버튼을 사용하여 아두이노 나노를 사용하는 방법에 대해 지시합니다. 자세히 보면, 우리는 다음을 배우게 될 것입니다:

버튼은 푸시버튼, 택타일 버튼 또는 순간 스위치라고 불립니다. 이것은 기본적인 구성 요소이며 아두이노 프로젝트에서 자주 사용됩니다. 사용하기 쉽습니다. 그러나 기계적, 물리적 측면과 사용할 수 있는 다양한 방법 때문에 초보자에게 혼란스러울 수 있습니다. 이 튜토리얼은 초보자가 더 쉽게 이해할 수 있게 도와줍니다.

준비물

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
공개: 이 섹션에서 제공된 링크 중 일부는 제휴 링크입니다. 이 링크를 통해 구매한 경우 추가 비용없이 수수료를 받을 수 있습니다. 지원해 주셔서 감사합니다.

버튼에 대해

초보자들이 버튼을 사용할 때 보통 두 가지 공통된 어려움에 직면하게 됩니다:

1. 부동 입력 문제:

  • 증상: 입력 핀의 읽기 값이 버튼의 눌림 상태와 일치하지 않습니다.
  • 원인: 입력 핀에 풀업 또는 풀다운 저항이 사용되고 있지 않습니다.
  • 해결책: 풀업 또는 풀다운 저항을 사용하십시오, 그리고 그 방법은 이 튜토리얼에서 설명할 것입니다.

2. 채터링 현상:

  • 증상: 버튼을 한 번만 눌렀음에도 불구하고, 아두이노 코드는 여러 번 눌린 것으로 감지합니다.
  • 원인: 기계적 및 물리적 문제로 인해 버튼(또는 스위치)의 상태가 여러 번에 걸쳐 빠르게 LOWHIGH 사이를 전환합니다.
  • 해결책: 이 문제를 해결하기 위해, 아두이노 나노-버튼-디바운스 튜토리얼에서 디바운스 기술을 다룰 예정입니다.

정밀한 횟수 감지가 필요한 애플리케이션만이 이를 고려해야 합니다.

※ NOTE THAT:

다음과 혼동하지 마십시오:

버튼 핀배열

푸시 버튼, 촉각 버튼, 순간 스위치라고도 하는 푸시 버튼은 버튼을 누르고 있을 때 닫히고 놓으면 열리는 스위치의 한 종류입니다. 다양한 종류의 푸시 버튼이 존재하는데, 이들은 크게 두 그룹으로 분류할 수 있습니다:

  • 빵판에 장착하기에 적합한 PCB용 푸시 버튼
  • 패널 장착용 푸시 버튼
Push button

PCB 마운트 버튼에는 일반적으로 네 개의 핀이 있습니다.

Button pinout

그럼에도 불구하고, 이 핀들은 짝지어 연결되어 있습니다. 따라서 내부적으로 연결되어 있지 않은 네 개의 핀 중 두 개만 사용해야 합니다.

버튼에 연결할 수 있는 네 가지 가능한 방법이 있으며, 그중 두 가지는 대칭적입니다(이미지에서 볼 수 있듯이).

How To Use Button

버튼에 4개의 핀이 있는데, 왜 오직 2개의 핀만 사용되나요?

PCB(인쇄 회로 기판)에 안전하게 장착되어 있으며 모든 압력을 견딜 수 있도록 하기 위해.

패널 장착 버튼에는 보통 2개의 핀이 있습니다.

two-pin push button Pinout
image source: diyables.io

작동 원리

  • 버튼이 눌리지 않았을 때, 핀 A와 핀 B는 연결되어 있지 않습니다.
  • 그러나 버튼이 눌렸을 때, 핀 A와 핀 B는 연결됩니다.
How Button Works

아두이노 나노 - 버튼

한 버튼의 핀은 VCC 또는 GND에 연결됩니다. 동일한 버튼의 다른 핀은 Arduino Nano 보드의 핀에 연결됩니다. 입력으로 설정된 Arduino Nano 핀의 상태를 조사함으로써 버튼이 눌렸는지 여부를 판단할 수 있습니다.

버튼 상태와 누르는 상태

버튼과 아두이노 나노 간의 연결, 그리고 아두이노 핀의 구성이 버튼 상태와 누르는 상태 사이의 관계를 결정할 것입니다.

아두이노에서 버튼을 사용하는 방법은 두 가지가 있습니다:

  1. 한 버튼의 핀이 VCC와 연결되어 있고, 다른 하나는 풀다운 저항기를 가진 아두이노의 핀에 연결되어 있습니다.
    • 버튼이 눌리면 아두이노의 핀 상태는 HIGH가 됩니다. 그렇지 않으면 아두이노의 핀 상태는 LOW가 됩니다.
    • 이 경우에는 외부 저항기가 필요합니다.
  • 한 버튼의 핀이 GND와 연결되어 있고, 다른 하나는 풀업 저항기를 가진 아두이노의 핀에 연결되어 있습니다.
    • 버튼이 눌리면 아두이노의 핀 상태는 LOW가 됩니다. 그렇지 않으면 아두이노의 핀 상태는 HIGH가 됩니다.
    • 내부 또는 외부 저항기를 사용할 수 있습니다. 내부 저항기는 이미 아두이노 나노에 내장되어 있으며 아두이노 나노 코드를 통해 설정할 수 있습니다.

    ※ NOTE THAT:

    • 외부 풀다운/풀업 저항을 사용하지 않으면 버튼을 누르지 않았을 때 입력 핀의 상태는 "플로팅" 상태가 됩니다. 이는 상태가 HIGH 또는 LOW(불안정, 고정되지 않음)가 될 수 있으며, 이는 잘못된 감지를 초래합니다.
    • 가장 나쁜 방법: 외부 풀다운 또는 풀업 저항을 활용하지 않고 아두이노 핀을 입력으로 초기화합니다 (pinMode(BUTTON_PIN, INPUT)).
    • 가장 좋은 방법: 아두이노 핀을 내부 풀업 입력으로 초기화합니다 (pinMode(BUTTON_PIN, INPUT_PULLUP)를 사용함). 외부 풀다운/풀업 저항을 사용할 필요가 없습니다.

    이 튜토리얼은 처음 시작하는 사람들을 위해 단순함을 위해 가장 직관적인 접근 방식을 사용합니다: 외부 저항이 필요 없이 아두이노 나노 핀을 내부 풀업 입력으로 초기화하는 것입니다. 초보자들이 풀업/풀다운 저항을 어떻게 연결해야 하는지에 대해 걱정할 필요가 없습니다. 그들이 해야 할 일은 아두이노 나노 코드를 사용하는 것뿐입니다.

    선연결

    아두이노 나노와 PCB 마운트 버튼 간의 배선도

    Arduino Nano Button Wiring Diagram

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

    아두이노 나노와 패널 마운트 버튼 간의 배선 다이어그램

    Arduino Nano two-pin push button Wiring Diagram

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

    버튼 프로그래밍 방법

    • pinMode() 함수를 사용하여 아두이노 나노 핀을 내부 풀업 입력으로 설정하세요.
    • 예를 들어, 2번 핀:
    pinMode(2, INPUT_PULLUP);

    digitalRead() 함수를 사용하여 Arduino Nano 핀의 상태를 확인합니다.

    int button_state = digitalRead(BUTTON_PIN);

    ※ NOTE THAT:

    다음과 같이 두 가지 주요 사용 사례가 있습니다:

    • 첫 번째: 입력 상태가 HIGH일 경우 하나의 작업을 수행하고, 입력 상태가 LOW일 경우 반대 작업을 수행합니다.
    • 두 번째: 입력 상태가 LOW에서 HIGH로 (또는 HIGH에서 LOW로) 변경되면 무언가를 수행합니다.

    이들 중 하나를 애플리케이션에 따라 선택합니다. 예를 들어, 버튼을 사용하여 LED를 제어할 때:

    • 버튼이 눌렸을 때 LED가 켜지고, 버튼이 눌리지 않았을 때 LED가 꺼지길 원한다면, 첫 번째 사용 사례를 사용해야 합니다.
    • 버튼을 누를 때마다 LED가 켜지고 꺼지게 하고 싶다면, 두 번째 사용 사례를 사용해야 합니다.

    LOW에서 HIGH로 상태 변경 감지하는 방법

    const int BUTTON_PIN = 2; // 푸시버튼 핀의 번호 int prev_button_state = HIGH; // 입력 핀으로부터의 이전 상태 int button_state; // 입력 핀으로부터의 현재 읽기 void setup() { // 시리얼 모니터와 소통하기 위해 시리얼을 초기화한다. Serial.begin(9600); // 푸시버튼 핀을 풀업 입력으로 초기화한다. // 풀업 입력 핀은 스위치가 열려 있을 때 HIGH 상태이고, 스위치가 닫혀 있을 때 LOW 상태이다. pinMode(BUTTON_PIN, INPUT_PULLUP); } void loop() { // 스위치/버튼의 상태를 읽는다: button_state = digitalRead(BUTTON_PIN); if(prev_button_state == LOW && button_state == HIGH) Serial.println("The state changed from LOW to HIGH"); // 마지막 상태를 저장한다 prev_button_state = button_state; }

    아두이노 나노 코드

    사용 방법

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

    Arduino IDE에서 코드를 Arduino Nano로 컴파일하고 업로드하기 위해 Upload 버튼을 클릭하세요.

    How to upload code to Arduino Nano
    • 시리얼 모니터를 엽니다.
    • 버튼을 여러 번 눌렀다 놓습니다.
    • 시리얼 모니터에 표시된 결과를 확인하세요.
    COM6
    Send
    1 1 1 0 0 0 0 0 0 1 1 1
    Autoscroll Show timestamp
    Clear output
    9600 baud  
    Newline  

    1은 HIGH이고, 0은 LOW입니다.

    코드 설명

    소스 코드의 주석에 포함된 줄별 설명을 확인하세요!

    아두이노 나노 코드 수정하기

    코드를 수정하여 누름 이벤트와 해제 이벤트를 인식할 수 있도록 합시다.

    사용 방법

    아래와 같이 코드를 수정하십시오:

    /* * 이 Arduino Nano 코드는 newbiely.kr 에서 개발되었습니다 * 이 Arduino Nano 코드는 어떠한 제한 없이 공개 사용을 위해 제공됩니다. * 상세한 지침 및 연결도에 대해서는 다음을 방문하세요: * https://newbiely.kr/tutorials/arduino-nano/arduino-nano-button */ #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; }

    Arduino IDE에서 Upload 버튼을 클릭하여 코드를 컴파일하고 Arduino Nano 보드에 업로드하십시오.

    Arduino IDE Upload Code
    • 시리얼 모니터를 엽니다.
    • 버튼을 누르고 계속 누르고 있습니다.
    • 버튼을 놓고 시리얼 모니터에서 결과를 관찰합니다.
    COM6
    Send
    The button is pressed The button is released
    Autoscroll Show timestamp
    Clear output
    9600 baud  
    Newline  

    ※ NOTE THAT:

    버튼을 한 번만 누르고 놓아도 시리얼 모니터에는 여러 번 눌림과 놓임 이벤트가 표시될 수 있습니다. 이는 버튼의 전형적인 동작이며 "채터링 현상"으로 알려져 있습니다. 이 문제를 해결하려면 Arduino Nano - 버튼 디바운스 튜토리얼을 참조하십시오.

    ※ NOTE THAT:

    우리는 막 시작하는 사람들, 특히 여러 버튼을 다룰 때 과정을 단순화하기 위해 ezButton이라는 라이브러리를 개발했습니다. ezButton 라이브러리에 대한 자세한 정보는 여기서 확인할 수 있습니다.

    동영상

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

    스스로에게 도전하세요

    • 버튼을 누르면 LED가 켜집니다.
    • 버튼이 눌리지 않으면 LED가 꺼집니다.
    • 버튼을 누를 때마다 LED는 켜짐과 꺼짐 사이를 전환합니다.

    추가 지식

    입력 핀에 풀다운/풀업 저항을 사용하는 것이 적절한 경우는 언제입니까? 입력 핀에 풀다운/풀업 저항을 사용하는 것이 적합하지 않은 경우는 언제입니까?

    센서가 닫히거나 열린 상태를 가지는 경우, LOWHIGH 상태로 만들기 위해 풀업(pull-up) 또는 풀다운(pull-down) 저항이 필요합니다. 이러한 센서의 예로는 푸시 버튼(push-button), 스위치(switch), 자기 접촉 스위치(문 센서)가 있습니다.

    반면에 센서가 두 가지 정의된 전압 수준(LOW와 HIGH)을 가지는 경우, 풀업(pull-up) 또는 풀다운(pull-down) 저항이 필요하지 않습니다. 이러한 센서의 예로는 모션 센서(motion sensor)와 터치 센서(touch sensor)가 있습니다.

    ※ 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!