아두이노 우노 Q 버튼

푸시 버튼은 Arduino 프로젝트에서 가장 기본적인 부품 중 하나입니다. 이 튜토리얼은 Arduino UNO Q에서 버튼을 올바르게 사용하는 데 필요한 모든 것을 알려줍니다. 상태 읽기, 눌림 및 해제 이벤트 감지, 심지어 Telegram을 통한 원격 버튼 상태 확인까지 다룹니다.

※ 주의:

시작하기 전에, 초보자가 자주 범하는 두 가지 실수를 알아두세요:

  1. 부동(Floating) 입력 문제:
  • 증상: 버튼이 눌리지 않았는데도 버튼 핀이 예측 불가능한 값을 읽습니다.
  • 원인: 풀-업 또는 풀-다운 저항이 연결되어 있지 않습니다.
  • 해결책: Arduino 코드에서 INPUT_PULLUP 모드를 사용하세요. 이는 내부 풀-업 저항을 활성화하며 외부 부품이 필요하지 않습니다.
  1. 채터링(Chattering) 현상:
  • 증상: 한 번의 물리적 누름이 여러 번의 누름 이벤트로 등록됩니다.
  • 원인: 기계적 반동으로 인해 빠른 HIGH/LOW 전환이 발생합니다.
  • 해결책: 디바운싱을 구현하세요. 아두이노 우노 Q - 버튼 디바운싱 튜토리얼을 참조하세요.

채터링은 누름 횟수를 정확히 세어야 하는 애플리케이션에만 영향을 미칩니다. 간단한 ON/OFF 제어의 경우 보통 문제가 되지 않습니다.

Arduino UNO Q - 버튼

필요한 하드웨어

1×Arduino UNO Q 아마존
1×Arduino Uno Q용 USB 케이블 아마존
1×브레드보드 마운트 버튼(캡 포함) 쿠팡 | 아마존
1×브레드보드 마운트 버튼 키트 쿠팡 | 아마존
1×패널 마운트 버튼 아마존
1×푸시 버튼 모듈 아마존
1×브레드보드 쿠팡 | 아마존
1×점프 와이어 쿠팡 | 아마존
1×(추천) 아두이노 우노용 스크루 터미널 블록 쉴드 쿠팡 | 아마존
1×(추천) Sensors/Servo Expansion Shield for Arduino Uno 쿠팡 | 아마존
1×(추천) 아두이노 우노용 브레드보드 쉴드 쿠팡 | 아마존
1×(추천) 아두이노 우노용 케이스 쿠팡 | 아마존
1×(추천) 아두이노 우노용 프로토타이핑 베이스 플레이트 & 브레드보드 키트 아마존
공개: 이 포스팅 에 제공된 일부 링크는 아마존 제휴 링크입니다. 이 포스팅은 쿠팡 파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다.

버튼에 대해

푸시 버튼(택타일 버튼 또는 모멘터리 스위치라고도 함)은 누르고 있는 동안 닫혀 있고 놓으면 열립니다. 일반적인 유형은 다음과 같습니다:

  • PCB 마운트 버튼 — 브레드보드에서 사용할 수 있습니다
  • 패널 마운트 버튼 — 인클로저에 설치하기 위한 버튼입니다
Arduino UNO Q 푸시 버튼

핀아웃

PCB 마운트 버튼은 보통 4개의 핀을 가지고 있으며 내부적으로 쌍으로 연결되어 있습니다. 두 개의 핀만(내부 연결 쌍이 아닌) 필요합니다.

버튼 핀아웃
버튼 사용 방법

패널 마운트 버튼은 2개의 핀을 가집니다:

2핀 푸시 버튼 핀아웃

작동 원리

  • 버튼을 누르지 않을 때: A핀과 B핀이 연결되지 않습니다
  • 버튼을 누를 때: A핀과 B핀이 연결됩니다
버튼 작동 원리

버튼 연결 및 논리

한 버튼 핀을 GND에 연결하고 다른 핀을 INPUT_PULLUP으로 설정된 Arduino UNO Q 핀에 연결합니다:

  • 버튼을 누르지 않음 → 핀이 HIGH 읽음
  • 버튼을 누름 → 핀이 LOW 읽음

※ 주의:

INPUT_PULLUP을 사용하면 내부 풀-업 저항이 활성화됩니다. 외부 저항이 필요하지 않습니다. 이것이 초보자에게 권장되는 방식입니다.

배선도

  • PCB 마운트 버튼의 배선:
Arduino UNO Q 버튼 배선도

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

  • 패널 마운트 버튼의 배선:
Arduino UNO Q 패널 버튼 배선도

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

버튼을 프로그래밍하는 방법

버튼 핀을 내부 풀-업을 가진 입력으로 설정합니다:

pinMode(7, INPUT_PULLUP);

버튼 상태를 읽습니다:

int button_state = digitalRead(BUTTON_PIN); // LOW = 눌림, HIGH = 눌리지 않음

※ 주의:

두 가지 일반적인 사용 사례:

  • 레벨 기반: HIGH이면 동작 A 수행; LOW이면 동작 B 수행 (예: 누르는 동안 LED 켜기)
  • 엣지 기반: 상태가 HIGH에서 LOW로 변함 → 누름 이벤트; LOW에서 HIGH로 변함 → 해제 이벤트 (예: 누를 때마다 LED 토글)

MCU 코드 — 버튼 상태 읽기

Arduino UNO Q는 두 개의 프로세서를 가집니다: STM32 MCU(실시간 하드웨어 제어 담당)와 Qualcomm MPU(Debian Linux 실행). 이 섹션에서는 STM32 MCU만 프로그래밍됩니다. Linux 측은 유휴 상태입니다. 나중 섹션에서 두 프로세서가 함께 작동하는 방식을 보여줄 것입니다.

이 스케치는 버튼 상태를 읽고 사용 가능하게 만듭니다 (예: LED 제어 또는 Bridge를 통한 보고):

/* * 이 Arduino UNO Q 코드는 newbiely.kr 에서 개발되었습니다 * 이 Arduino UNO Q 코드는 어떠한 제한 없이 공개 사용을 위해 제공됩니다. * 상세한 지침 및 연결도에 대해서는 다음을 방문하세요: * https://newbiely.kr/tutorials/arduino-uno-q/arduino-uno-q-button */ #define BUTTON_PIN 7 // The Arduino UNO Q pin connected to the button void setup() { // initialize the pushbutton pin as a pull-up input // (no external resistor needed — internal pull-up is used) pinMode(BUTTON_PIN, INPUT_PULLUP); } void loop() { // read the state of the button (LOW = pressed, HIGH = not pressed) int button_state = digitalRead(BUTTON_PIN); // TO DO: use button_state here (e.g., control an LED or send via Bridge) delay(100); }

빠른 단계

  • Arduino UNO Q 처음 사용? 진행하기 전에 아두이노 우노 Q 시작하기 튜토리얼을 따라 개발 환경을 준비하세요.
  • 버튼 배선: 배선도에 따라 한 버튼 핀을 GND에, 다른 핀을 7번 핀에 연결합니다.
  • 연결: Arduino UNO Q를 USB-C 케이블로 컴퓨터에 연결합니다.
  • Arduino App Lab 열기: Arduino App Lab을 시작하고 Arduino UNO Q를 감지할 때까지 기다립니다.
  • 새 앱 생성: Create New App 버튼을 클릭합니다.
Arduino UNO Q의 아두이노 app lab에서 새 앱 만들기
  • 앱에 이름을 지정합니다. 예: DIYables_Button
  • Create를 클릭하여 확인합니다.
  • 새 앱 내에서 생성된 폴더 및 파일 세트를 볼 수 있습니다.
Arduino UNO Q의 아두이노 app lab 앱 폴더 및 파일
  • sketch/sketch.ino 파일을 찾습니다. MCU 스케치를 여기에 붙여넣을 것입니다.
  • 스케치 붙여넣기: 위의 MCU 코드를 복사하여 스케치 파일에 붙여넣습니다. 다른 파일은 기본값으로 유지합니다.
    • Install the library: Click the Add sketch library button (the open book icon with a + sign) in the left sidebar.
    add sketch 라이브러리 in 아두이노 app lab on Arduino UNO Q
    • Search for Arduino_RouterBridge created by Arduino and click the Install button.
    My Apps / DIYables Apps
    Run
    Bricks
    No bricks added...
    Sketch Libraries
    No sketch libra...
    Files
    python
    sketch
    .gitignore
    README.md
    app.yaml
    sketch.ino
    Add sketch library
    Arduino_RouterBridge Arduino

    This library provides a simple RPC bridge for Arduino UNO Q boards, allowing communication between the board and other devices using MsgPack serialization.

    0.4.1
    Install
    More Info
    • 업로드: Arduino App Lab의 Run 버튼을 클릭하여 STM32에 컴파일하고 업로드합니다.
    Arduino UNO Q의 아두이노 app lab에서 run 버튼 클릭
    • 버튼 누르기: 버튼을 누르고 있다가 놓습니다.
    • 상태 보기: 실시간으로 버튼 상태 출력을 보려면 아래의 Bridge 섹션을 참조하세요. get_button_state() 함수를 추가하고 MCU Monitor 콘솔을 통해 상태를 표시합니다.
    • Pro Tip: button_state == LOW를 사용하여 버튼이 눌려 있는지 확인하세요 (INPUT_PULLUP이 논리를 반전시키기 때문).

    MCU 코드 — 버튼 눌림 및 해제 이벤트 감지

    개별 눌림 및 해제 이벤트를 감지하려면 HIGHLOW 사이의 상태 전환을 추적합니다:

    /* * 이 Arduino UNO Q 코드는 newbiely.kr 에서 개발되었습니다 * 이 Arduino UNO Q 코드는 어떠한 제한 없이 공개 사용을 위해 제공됩니다. * 상세한 지침 및 연결도에 대해서는 다음을 방문하세요: * https://newbiely.kr/tutorials/arduino-uno-q/arduino-uno-q-button */ #define BUTTON_PIN 7 // The Arduino UNO Q pin connected to the button int button_state; int prev_button_state = HIGH; // HIGH = not pressed (pull-up) void setup() { // initialize the pushbutton pin as a pull-up input pinMode(BUTTON_PIN, INPUT_PULLUP); } void loop() { // read the state of the button (LOW = pressed, HIGH = not pressed) button_state = digitalRead(BUTTON_PIN); if (prev_button_state == HIGH && button_state == LOW) { // button was just pressed (HIGH → LOW transition) // TO DO: add your press action here } else if (prev_button_state == LOW && button_state == HIGH) { // button was just released (LOW → HIGH transition) // TO DO: add your release action here } // save the last state prev_button_state = button_state; }
    • 작동 원리: HIGHLOW 전환(버튼 누름)과 LOWHIGH 전환(버튼 해제)을 감지합니다.
    • Pro Tip: if 블록 내에 동작 코드를 추가합니다. 예를 들어, 누를 때 LED를 토글하거나 해제할 때 이벤트를 기록합니다.

    ※ 주의:

    • 기계적 반동(채터링) 때문에 한 번의 누름이 여러 이벤트를 트리거할 수 있습니다. 깨끗한 솔루션은 아두이노 우노 Q - 버튼 디바운싱을 참조하세요.
    • 다중 버튼 프로젝트의 경우 ezButton 라이브러리를 사용하세요. 이는 풀-업, 디바운싱 및 엣지 감지를 자동으로 처리합니다. ezButton 자세히 알아보기.

    Linux + MCU Bridge 프로그래밍

    Arduino UNO Q는 함께 작동하는 두 개의 프로세서를 가집니다: MPU(Qualcomm, Debian Linux 실행)와 MCU(STM32, Arduino 스케치와 함께 Zephyr OS 실행). 이들은 Arduino_RouterBridge 라이브러리를 통해 RPC를 사용하여 통신합니다. 원시 직렬 포트로는 절대 통신하지 않습니다.

    • 버튼이 MCU(STM32)에 연결됨 — STM32의 디지털 입력 핀에 배선됩니다. MCU는 digitalRead()를 사용하여 버튼 상태를 읽습니다.
    • MPU는 버튼을 직접 읽을 수 없습니다Bridge.call()을 통해 MCU에서 현재 상태를 요청해야 합니다. MCU는 등록된 Bridge.provide() 함수를 실행하고 응답합니다.
    • MPU에는 Wi-Fi가 있습니다 — MPU가 Wi-Fi를 가진 전체 Debian Linux를 실행하기 때문에 필요에 따라 버튼 상태를 확인하고 Telegram을 통해 전달할 수 있습니다.
    • 통신: Linux 측의 Bridge.call()이 MCU 측의 Bridge.provide() 함수를 호출합니다
    • ⚠️ 예약됨: /dev/ttyHS1(Linux)과 Serial1(MCU)은 Arduino Router에서 사용됩니다. 절대 직접 열지 마세요

    요약: MPU가 버튼 상태를 요청 → MCU가 핀을 읽음 → MCU가 결과를 보고 → MPU가 기록하거나 전달합니다.

    MCU 스케치 — Bridge 및 Monitor 출력이 있는 버튼:

    /* * 이 Arduino UNO Q 코드는 newbiely.kr 에서 개발되었습니다 * 이 Arduino UNO Q 코드는 어떠한 제한 없이 공개 사용을 위해 제공됩니다. * 상세한 지침 및 연결도에 대해서는 다음을 방문하세요: * https://newbiely.kr/tutorials/arduino-uno-q/arduino-uno-q-button */ #include "Arduino_RouterBridge.h" #define BUTTON_PIN 7 int button_state; int prev_button_state = HIGH; void get_button_state() { button_state = digitalRead(BUTTON_PIN); int pressed = (button_state == LOW) ? 1 : 0; Monitor.println("Button state: " + String(pressed) + " (1=pressed, 0=released)"); } void setup() { pinMode(BUTTON_PIN, INPUT_PULLUP); Bridge.begin(); Monitor.begin(); Bridge.provide("get_button_state", get_button_state); Monitor.println("Button Bridge ready"); } void loop() { button_state = digitalRead(BUTTON_PIN); if (prev_button_state == HIGH && button_state == LOW) Monitor.println("Button PRESSED"); else if (prev_button_state == LOW && button_state == HIGH) Monitor.println("Button RELEASED"); prev_button_state = button_state; }

    Python 스크립트(Arduino App Lab) — Linux에서 버튼 상태 폴링:

    /* * 이 Arduino UNO Q 코드는 newbiely.kr 에서 개발되었습니다 * 이 Arduino UNO Q 코드는 어떠한 제한 없이 공개 사용을 위해 제공됩니다. * 상세한 지침 및 연결도에 대해서는 다음을 방문하세요: * https://newbiely.kr/tutorials/arduino-uno-q/arduino-uno-q-button */ from arduino.app_utils import * import time def loop(): while True: result = Bridge.call("get_button_state") print(f"Polled: {result}") time.sleep(0.5) App.run(user_loop=loop)
    • 참고: MCU 스케치에서 Bridge.begin()이 호출되고 Python 스크립트를 Linux 측에서 실행하기 전에 스케치가 업로드되어야 합니다.
    • ⚠️ 경고: 코드에서 /dev/ttyHS1(Linux) 또는 Serial1(MCU)을 직접 열지 마세요. 이들은 Arduino Router에서 예약되어 있으며 접근하면 Bridge가 손상됩니다.

    빠른 단계

    • MCU 스케치 업로드: Arduino App Lab을 열고 새 앱을 만든 다음 위의 Bridge MCU 스케치를 sketch/sketch.ino에 붙여넣고 기본 라이브러리를 유지한 후 Run을 클릭합니다.
    • Python 스크립트 추가: 위의 Python 코드를 동일한 앱의 Python 탭에 붙여넣습니다.
    • 앱 실행: Run을 클릭합니다. Python 측이 0.5초마다 버튼 상태를 폴링합니다.
    • 버튼 누르기: 버튼을 누르고 있다가 놓습니다.
    • 콘솔 확인: Console 탭 → MCU Monitor 서브탭을 열어 실시간 누름/해제 이벤트를 확인합니다.
    • Pro Tip: Python Console 서브탭도 열어서 폴링된 상태 값을 확인합니다.

    App Lab 콘솔 출력

    DIYables_Apps
    Stop
    sketch.ino
    1#include "Arduino_RouterBridge.h"
    Serial Monitor
    Python
    Message (Enter to send a message to "Newbiely" on usb(2820070321))
    New Line
    9600 baud
    Button Bridge ready Button PRESSED Button RELEASED Button PRESSED Button RELEASED

    Telegram 통합

    세계 어디서나 Telegram 메시지를 보내서 버튼이 현재 눌려 있는지 확인할 수 있습니다.

    아직 Telegram 봇이 없다면, 계속하기 전에 아두이노 우노 Q - 텔레그램 봇을 참조하여 봇 토큰을 얻으세요.

    이 섹션에서 다룹니다:

    • Arduino UNO Q의 Linux 측에서 Python 스크립트를 실행하여 Telegram 메시지를 수신합니다
    • 요청 시 Bridge.call()을 통해 MCU에서 버튼 상태를 폴링합니다
    • 버튼 상태를 Telegram에 회신으로 보냅니다

    MCU 스케치: 이전 Bridge 섹션의 동일한 MCU 스케치 유지 — 변경 없음. 진행하기 전에 STM32에 이미 업로드되고 실행 중인지 확인하세요.

    Python 스크립트(Arduino App Lab) — 버튼 상태용 Telegram 봇:

    /* * 이 Arduino UNO Q 코드는 newbiely.kr 에서 개발되었습니다 * 이 Arduino UNO Q 코드는 어떠한 제한 없이 공개 사용을 위해 제공됩니다. * 상세한 지침 및 연결도에 대해서는 다음을 방문하세요: * https://newbiely.kr/tutorials/arduino-uno-q/arduino-uno-q-button */ from arduino.app_utils import * import requests import time BOT_TOKEN = "YOUR_BOT_TOKEN" API_URL = f"https://api.telegram.org/bot{BOT_TOKEN}" last_update_id = 0 def send_message(chat_id, text): requests.post(f"{API_URL}/sendMessage", json={"chat_id": chat_id, "text": text}) def get_updates(): global last_update_id resp = requests.get(f"{API_URL}/getUpdates", params={"offset": last_update_id + 1, "timeout": 5}) return resp.json().get("result", []) def loop(): global last_update_id updates = get_updates() for update in updates: last_update_id = update["update_id"] msg = update.get("message", {}) chat_id = msg.get("chat", {}).get("id") text = msg.get("text", "").strip() if text == "/state": result = Bridge.call("get_button_state") # result contains "1" (pressed) or "0" (not pressed) if "1" in str(result): send_message(chat_id, "Button is currently PRESSED") else: send_message(chat_id, "Button is currently NOT pressed") else: send_message(chat_id, "Commands:\n/state — check if the button is pressed") time.sleep(0.5) App.run(user_loop=loop)
    • 참고: YOUR_BOT_TOKEN을 Telegram에서 @BotFather로부터 얻은 토큰으로 바꾸세요.
    • /state를 보내서 버튼이 현재 눌려 있는지 확인합니다.

    빠른 단계

    • MCU 스케치 업로드: 이전 섹션의 Bridge MCU 스케치를 사용합니다 (아직 업로드하지 않았다면 먼저 업로드합니다).
    • Telegram 스크립트 붙여넣기: 위의 Python 코드를 Arduino App Lab의 앱 Python 탭에 복사합니다.
    • 토큰 설정: 스크립트의 YOUR_BOT_TOKEN을 실제 봇 토큰으로 바꿉니다.
    • 앱 실행: Run을 클릭합니다. 봇이 즉시 Telegram 메시지 수신을 시작합니다.
    • 테스트: Telegram을 열고 봇을 찾은 다음 Arduino UNO Q의 물리적 버튼을 누르고 /state를 보내서 누름으로 감지되는지 확인합니다.
    • Pro Tip: LED와 결합합니다. Bridge를 통해 누름으로 감지되면 LED를 켜세요.

    App Lab 콘솔 출력

    DIYables_Apps
    Stop
    sketch.ino
    1#include "Arduino_RouterBridge.h"
    Serial Monitor
    Python
    [2026-04-29 12:00:01] Telegram: /state [2026-04-29 12:00:01] Button is currently NOT pressed [2026-04-29 12:01:30] Telegram: /state [2026-04-29 12:01:30] Button is currently PRESSED
    Telegram
    Telegram 12:45
    Welcome to Telegram!
    ArduinoBot 10:19
    Chatting with Arduino...
    telegram-botfather
    BotFather Yesterday
    Your bot has been created.

    ArduinoBot

    bot
    Today
    /state
    10:15 AM ✓✓
    Button is currently NOT pressed
    10:16 AM
    /state
    10:17 AM ✓✓
    Button is currently PRESSED
    10:18 AM

    OpenClaw 통합

    이 튜토리얼을 OpenClaw에 적응시킬 수 있습니다. 아두이노 우노 Q - OpenClaw 튜토리얼의 지시사항을 참조하세요.

    애플리케이션/프로젝트 아이디어

    Arduino UNO Q에서 버튼을 사용한 프로젝트 아이디어는 다음과 같습니다:

    • 원격 초인종: 버튼을 누르면 → Telegram이 "누군가 문 앞에 있습니다!"를 휴대폰으로 전송
    • 긴급 알림: 3초 동안 누르고 있으면 → Telegram이 알림 메시지 전송
    • 이벤트 카운터: MCU에서 버튼 누름을 세고 요청 시 Telegram을 통해 총합 전송
    • 라이트 스위치: 버튼을 누르면 → 연결된 라이트 켜기; 다시 누르면 → 끄기
    • 2가지 모드 시스템: 짧게 누르면 모드 A 선택, 길게 누르면 모드 B 선택. 각각 다른 Python 동작 트리거

    직접 도전해보세요

    Arduino UNO Q의 버튼으로 이 도전 과제들을 시도해보세요:

    • 쉬움: Bridge 스케치를 수정하여 버튼을 누르면 내장 LED를 켜고 해제하면 끕니다
    • 중간: Bridge 스케치를 확장하여 전원 공급 이후 버튼이 눌려진 횟수를 반환하는 get_press_count() 함수를 노출합니다
    • 어려움: 버튼이 눌릴 때마다 자동으로 메시지를 보내는 Telegram 봇을 만듭니다 (폴링하지 않고). Python의 배경 루프를 사용하여 Bridge를 통해 상태 변경을 모니터링합니다

    함수 참조