아두이노 우노 Q 버튼
푸시 버튼은 Arduino 프로젝트에서 가장 기본적인 부품 중 하나입니다. 이 튜토리얼은 Arduino UNO Q에서 버튼을 올바르게 사용하는 데 필요한 모든 것을 알려줍니다. 상태 읽기, 눌림 및 해제 이벤트 감지, 심지어 Telegram을 통한 원격 버튼 상태 확인까지 다룹니다.
※ 주의:
시작하기 전에, 초보자가 자주 범하는 두 가지 실수를 알아두세요:
- 부동(Floating) 입력 문제:
- 증상: 버튼이 눌리지 않았는데도 버튼 핀이 예측 불가능한 값을 읽습니다.
- 원인: 풀-업 또는 풀-다운 저항이 연결되어 있지 않습니다.
- 해결책: Arduino 코드에서 INPUT_PULLUP 모드를 사용하세요. 이는 내부 풀-업 저항을 활성화하며 외부 부품이 필요하지 않습니다.
- 채터링(Chattering) 현상:
- 증상: 한 번의 물리적 누름이 여러 번의 누름 이벤트로 등록됩니다.
- 원인: 기계적 반동으로 인해 빠른 HIGH/LOW 전환이 발생합니다.
- 해결책: 디바운싱을 구현하세요. 아두이노 우노 Q - 버튼 디바운싱 튜토리얼을 참조하세요.
채터링은 누름 횟수를 정확히 세어야 하는 애플리케이션에만 영향을 미칩니다. 간단한 ON/OFF 제어의 경우 보통 문제가 되지 않습니다.

필요한 하드웨어
| 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 마운트 버튼 — 브레드보드에서 사용할 수 있습니다
- 패널 마운트 버튼 — 인클로저에 설치하기 위한 버튼입니다

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


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

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

버튼 연결 및 논리
한 버튼 핀을 GND에 연결하고 다른 핀을 INPUT_PULLUP으로 설정된 Arduino UNO Q 핀에 연결합니다:
- 버튼을 누르지 않음 → 핀이 HIGH 읽음
- 버튼을 누름 → 핀이 LOW 읽음
※ 주의:
INPUT_PULLUP을 사용하면 내부 풀-업 저항이 활성화됩니다. 외부 저항이 필요하지 않습니다. 이것이 초보자에게 권장되는 방식입니다.
배선도
- PCB 마운트 버튼의 배선:

이 이미지는 Fritzing을 사용하여 만들어졌습니다. 이미지를 확대하려면 클릭하세요.
- 패널 마운트 버튼의 배선:

이 이미지는 Fritzing을 사용하여 만들어졌습니다. 이미지를 확대하려면 클릭하세요.
버튼을 프로그래밍하는 방법
버튼 핀을 내부 풀-업을 가진 입력으로 설정합니다:
버튼 상태를 읽습니다:
※ 주의:
두 가지 일반적인 사용 사례:
- 레벨 기반: 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 처음 사용? 진행하기 전에 아두이노 우노 Q 시작하기 튜토리얼을 따라 개발 환경을 준비하세요.
- 버튼 배선: 배선도에 따라 한 버튼 핀을 GND에, 다른 핀을 7번 핀에 연결합니다.
- 연결: Arduino UNO Q를 USB-C 케이블로 컴퓨터에 연결합니다.
- Arduino App Lab 열기: Arduino App Lab을 시작하고 Arduino UNO Q를 감지할 때까지 기다립니다.
- 새 앱 생성: Create New App 버튼을 클릭합니다.

- 앱에 이름을 지정합니다. 예: DIYables_Button
- Create를 클릭하여 확인합니다.
- 새 앱 내에서 생성된 폴더 및 파일 세트를 볼 수 있습니다.

- sketch/sketch.ino 파일을 찾습니다. MCU 스케치를 여기에 붙여넣을 것입니다.
- Install the library: Click the Add sketch library button (the open book icon with a + sign) in the left sidebar.

- Search for Arduino_RouterBridge created by Arduino and click the Install button.
- 업로드: Arduino App Lab의 Run 버튼을 클릭하여 STM32에 컴파일하고 업로드합니다.

- 버튼 누르기: 버튼을 누르고 있다가 놓습니다.
- 상태 보기: 실시간으로 버튼 상태 출력을 보려면 아래의 Bridge 섹션을 참조하세요. get_button_state() 함수를 추가하고 MCU Monitor 콘솔을 통해 상태를 표시합니다.
- Pro Tip: button_state == LOW를 사용하여 버튼이 눌려 있는지 확인하세요 (INPUT_PULLUP이 논리를 반전시키기 때문).
MCU 코드 — 버튼 눌림 및 해제 이벤트 감지
개별 눌림 및 해제 이벤트를 감지하려면 HIGH와 LOW 사이의 상태 전환을 추적합니다:
- 작동 원리: HIGH→LOW 전환(버튼 누름)과 LOW→HIGH 전환(버튼 해제)을 감지합니다.
- 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 출력이 있는 버튼:
Python 스크립트(Arduino App Lab) — Linux에서 버튼 상태 폴링:
- 참고: 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 콘솔 출력
Telegram 통합
세계 어디서나 Telegram 메시지를 보내서 버튼이 현재 눌려 있는지 확인할 수 있습니다.
아직 Telegram 봇이 없다면, 계속하기 전에 아두이노 우노 Q - 텔레그램 봇을 참조하여 봇 토큰을 얻으세요.
이 섹션에서 다룹니다:
- Arduino UNO Q의 Linux 측에서 Python 스크립트를 실행하여 Telegram 메시지를 수신합니다
- 요청 시 Bridge.call()을 통해 MCU에서 버튼 상태를 폴링합니다
- 버튼 상태를 Telegram에 회신으로 보냅니다
MCU 스케치: 이전 Bridge 섹션의 동일한 MCU 스케치 유지 — 변경 없음. 진행하기 전에 STM32에 이미 업로드되고 실행 중인지 확인하세요.
Python 스크립트(Arduino App Lab) — 버튼 상태용 Telegram 봇:
- 참고: 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 콘솔 출력
ArduinoBot
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를 통해 상태 변경을 모니터링합니다