아두이노 우노 Q 힘 센서

힘 센서(FSR — 힘 감지 저항)는 누르는 강도에 따라 저항값이 변합니다. Arduino UNO Q의 12비트 ADC와 풀-다운 저항기에 연결되면 0(압력 없음)부터 4095(최대 압박)까지의 값을 얻을 수 있습니다. Bridge와 Telegram을 사용하면 즉시 알림을 받고 원격으로 압력 수준을 조회할 수 있습니다.

이 튜토리얼에서 배울 내용:

Arduino UNO Q 힘 센서

필요한 하드웨어

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

힘 센서 소개

힘 센서(FSR이라고도 함 — 힘 감지 저항)는 가변 저항기처럼 작동하는 얇고 유연한 부품입니다:

  • 압력이 없음: 매우 높은 저항(수 MΩ) → 아날로그 핀에서 거의 0V
  • 더 많은 압력: 낮은 저항 → 더 높은 전압 → 더 높은 ADC 값
힘 센서 사용법 핀아웃

힘 센서는 2개의 동일한 핀을 가지고 있습니다(저항입니다 — 극성이 없습니다). 그램 또는 파운드 단위의 정확한 무게 측정에는 적합하지 않지만 터치, 압박 또는 누름 이벤트를 감지하는 데 탁월합니다.

분압기 배선

FSR은 단순히 저항이므로 측정 가능한 전압을 생성하기 위해 알려진 풀-다운 저항기(10 kΩ)가 있는 분압기로 배선해야 합니다:

3.3V ─── [FSR] ─── A0 ─── [10kΩ] ─── GND
  • FSR 저항이 높을 때(압력 없음), A0은 0 근처를 읽습니다
  • FSR 저항이 떨어질 때(압력 적용), A0은 더 높게 읽습니다

Arduino UNO Q의 12비트 ADC

UNO Q MCU는 12비트 ADC(0–4095)를 사용하며 3.3V 기준입니다. 이 튜토리얼의 압력 분류 임계값은 그에 따라 확장됩니다(R4는 10비트 0–1023을 사용했고 모든 임계값은 UNO Q의 경우 4로 곱합니다).

배선 다이어그램

Arduino UNO Q 힘 센서 연결 배선도

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

부품 Arduino UNO Q MCU
힘 센서 핀 1 3.3V
힘 센서 핀 2 A0
10 kΩ 저항 핀 1 A0
10 kΩ 저항 핀 2 GND

힘 센서 프로그래밍 방법

  • 힘 센서 핀에서 아날로그 전압 읽기:
int reading = analogRead(FORCE_SENSOR_PIN); // 0-4095
  • ADC 값을 기반으로 압력 수준 분류(12비트, 0–4095):
if (reading < 40) Serial.println(" -> no pressure"); else if (reading < 800) Serial.println(" -> light touch"); else if (reading < 2000) Serial.println(" -> light squeeze"); else if (reading < 3200) Serial.println(" -> medium squeeze"); else Serial.println(" -> big squeeze");

Arduino UNO Q 코드

Arduino UNO Q는 함께 작동하는 두 개의 프로세서를 가집니다:

  • STM32 MCU는 힘 센서 아날로그 값을 1초마다 읽고 압력 수준을 분류합니다
  • Qualcomm MPU는 Wi-Fi를 사용하여 Debian Linux를 실행합니다 — 이 섹션에서는 MCU만 프로그래밍됩니다. 나중 섹션에서는 두 프로세서가 Bridge를 통해 함께 작동하는 방식을 보여줍니다.
/* * 이 Arduino UNO Q 코드는 newbiely.kr 에서 개발되었습니다 * 이 Arduino UNO Q 코드는 어떠한 제한 없이 공개 사용을 위해 제공됩니다. * 상세한 지침 및 연결도에 대해서는 다음을 방문하세요: * https://newbiely.kr/tutorials/arduino-uno-q/arduino-uno-q-force-sensor */ // Force Sensor (FSR) — Analog reading via voltage divider with 10kΩ pull-down resistor // Arduino UNO Q MCU: 12-bit ADC (0-4095), 3.3V reference #define FORCE_SENSOR_PIN A0 // The Arduino UNO Q MCU pin connected to the FSR void setup() { Serial.begin(9600); Serial.println("Arduino UNO Q Force Sensor ready"); } void loop() { int reading = analogRead(FORCE_SENSOR_PIN); // 0-4095 Serial.print("Force sensor reading = "); Serial.print(reading); if (reading < 40) // no pressure Serial.println(" -> no pressure"); else if (reading < 800) // light touch Serial.println(" -> light touch"); else if (reading < 2000) // light squeeze Serial.println(" -> light squeeze"); else if (reading < 3200) // medium squeeze Serial.println(" -> medium squeeze"); else // big squeeze Serial.println(" -> big squeeze"); delay(1000); }

빠른 단계

Arduino UNO Q를 처음 사용하세요? 진행하기 전에 아두이노 우노 Q 시작하기 튜토리얼을 따르세요.

  • 연결: 배선 다이어그램에 표시된 대로 힘 센서 및 저항기를 Arduino UNO Q MCU에 배선합니다.
  • Arduino App Lab 열기: Arduino App Lab을 실행하고 Arduino UNO Q를 감지할 때까지 기다립니다.
  • 새 앱 만들기: Create New App 버튼을 클릭합니다.
create new app in 아두이노 app lab on Arduino UNO Q
  • 앱에 이름을 지정합니다(예: ForceSensor).
  • Create를 클릭하여 확인합니다.
아두이노 app lab app folders and files on Arduino UNO Q
  • 스케치 붙여넣기: 위의 MCU 코드를 복사하고 sketch/sketch.ino에 붙여넣습니다.
  • 업로드: Arduino App Lab의 Run 버튼을 클릭합니다.
click run 버튼 in 아두이노 app lab on Arduino UNO Q
  • 힘 센서를 부드럽게 눌렀다가 더 세게 누르세요 — Serial Monitor에서 값의 변화를 관찰하세요.

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
[2026-04-29 09:00:01] Arduino UNO Q Force Sensor ready [2026-04-29 09:00:02] Force sensor reading = 0 -> no pressure [2026-04-29 09:00:03] Force sensor reading = 0 -> no pressure [2026-04-29 09:00:04] Force sensor reading = 528 -> light touch [2026-04-29 09:00:05] Force sensor reading = 588 -> light touch [2026-04-29 09:00:06] Force sensor reading = 1576 -> light squeeze [2026-04-29 09:00:07] Force sensor reading = 2428 -> medium squeeze [2026-04-29 09:00:08] Force sensor reading = 3164 -> medium squeeze [2026-04-29 09:00:09] Force sensor reading = 3684 -> big squeeze [2026-04-29 09:00:10] Force sensor reading = 0 -> no pressure

Bridge: Linux + MCU

이 섹션에서는 Linux 측이 Bridge를 통해 힘 값 및 압력 이벤트를 읽을 수 있도록 Arduino UNO Q의 두 프로세서를 모두 프로그래밍하는 방법을 보여줍니다:

  • 힘 센서는 MCU에 연결되어 있으며 — MCU는 500ms마다 아날로그 값을 읽고 캐시합니다
  • MPU는 아날로그 핀을 직접 읽을 수 없습니다 — Bridge 함수를 호출하여 원시 값, 압력 수준 또는 새 누름 이벤트를 가져옵니다
  • MPU는 Wi-Fi를 가집니다 — 완전한 Debian Linux를 실행하며 힘이 적용되는 순간 Telegram 알림을 보낼 수 있습니다
  • Arduino_RouterBridge는 두 프로세서 간의 RPC 통신을 활성화합니다
  • ⚠️ /dev/ttyHS1(Linux) 및 Serial1(MCU)은 라우터에 의해 예약됨 — 사용자 코드에서 열지 마세요

MCU 코드(Bridge)

/* * 이 Arduino UNO Q 코드는 newbiely.kr 에서 개발되었습니다 * 이 Arduino UNO Q 코드는 어떠한 제한 없이 공개 사용을 위해 제공됩니다. * 상세한 지침 및 연결도에 대해서는 다음을 방문하세요: * https://newbiely.kr/tutorials/arduino-uno-q/arduino-uno-q-force-sensor */ #include "Arduino_RouterBridge.h" #define FORCE_SENSOR_PIN A0 // The Arduino UNO Q MCU pin connected to the FSR // Cached values int cached_value = 0; String cached_pressure = "no_pressure"; bool pressure_event = false; bool prev_pressed = false; unsigned long last_read_ms = 0; const unsigned long READ_INTERVAL = 500; String get_value(String arg) { return String(cached_value); } String get_pressure(String arg) { return cached_pressure; } String get_event(String arg) { if (pressure_event) { pressure_event = false; return "pressure_detected"; } return "none"; } String classify(int reading) { if (reading < 40) return "no_pressure"; if (reading < 800) return "light_touch"; if (reading < 2000) return "light_squeeze"; if (reading < 3200) return "medium_squeeze"; return "big_squeeze"; } void setup() { Bridge.begin(); Monitor.begin(); Bridge.provide("get_value", get_value); Bridge.provide("get_pressure", get_pressure); Bridge.provide("get_event", get_event); Monitor.println("Arduino UNO Q Force Sensor Bridge ready"); } void loop() { unsigned long now = millis(); if (now - last_read_ms >= READ_INTERVAL) { last_read_ms = now; cached_value = analogRead(FORCE_SENSOR_PIN); cached_pressure = classify(cached_value); bool is_pressed = (cached_value >= 40); if (is_pressed && !prev_pressed) { pressure_event = true; Monitor.print("Pressure detected: "); Monitor.println(cached_pressure); } else if (!is_pressed && prev_pressed) { Monitor.println("Released — no pressure."); } prev_pressed = is_pressed; } }

Python 코드(Bridge)

/* * 이 Arduino UNO Q 코드는 newbiely.kr 에서 개발되었습니다 * 이 Arduino UNO Q 코드는 어떠한 제한 없이 공개 사용을 위해 제공됩니다. * 상세한 지침 및 연결도에 대해서는 다음을 방문하세요: * https://newbiely.kr/tutorials/arduino-uno-q/arduino-uno-q-force-sensor */ from arduino.app_utils import * import time def loop(): value = Bridge.call("get_value") pressure = Bridge.call("get_pressure") print(f"Force value: {value} Pressure: {pressure}") time.sleep(1) App.run(user_loop=loop)

빠른 단계

  • 연결: 배선 다이어그램에 표시된 대로 힘 센서 및 저항기를 배선합니다.
  • Arduino App Lab 열기하고 ForceSensorBridge라는 새 앱을 만듭니다.
  • MCU 스케치를 sketch/sketch.ino에 붙여넣습니다.
  • Python 코드를 Python 파일에 붙여넣습니다.
  • 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
  • 업로드: Run 버튼을 클릭합니다.
click run 버튼 in 아두이노 app lab on Arduino UNO Q
  • 힘 센서를 누르세요 — 이벤트 및 압력 수준이 두 콘솔에 나타나는 것을 관찰하세요.

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
[2026-04-29 09:00:01] Arduino UNO Q Force Sensor Bridge ready [2026-04-29 09:00:06] Pressure detected: light_touch [2026-04-29 09:00:08] Released — no pressure. [2026-04-29 09:00:12] Pressure detected: big_squeeze [2026-04-29 09:00:15] Released — no pressure.
DIYables_Apps
Stop
sketch.ino
1#include "Arduino_RouterBridge.h"
Serial Monitor
Python
[2026-04-29 09:00:02] Force value: 0 Pressure: no_pressure [2026-04-29 09:00:03] Force value: 0 Pressure: no_pressure [2026-04-29 09:00:06] Force value: 528 Pressure: light_touch [2026-04-29 09:00:08] Force value: 0 Pressure: no_pressure [2026-04-29 09:00:12] Force value: 3684 Pressure: big_squeeze

Telegram

Arduino UNO Q 힘 센서에 힘이 가해질 때 Telegram 알림을 받고 원격으로 압력 수준을 조회합니다.

MCU 스케치: 이전 Bridge 섹션과 동일한 MCU 스케치를 유지합니다.

Python 코드(Telegram)

/* * 이 Arduino UNO Q 코드는 newbiely.kr 에서 개발되었습니다 * 이 Arduino UNO Q 코드는 어떠한 제한 없이 공개 사용을 위해 제공됩니다. * 상세한 지침 및 연결도에 대해서는 다음을 방문하세요: * https://newbiely.kr/tutorials/arduino-uno-q/arduino-uno-q-force-sensor */ from arduino.app_utils import * import requests import time TELEGRAM_BOT_TOKEN = "YOUR_TELEGRAM_BOT_TOKEN" CHAT_ID = "YOUR_CHAT_ID" last_update_id = 0 def get_updates(): global last_update_id url = f"https://api.telegram.org/bot{TELEGRAM_BOT_TOKEN}/getUpdates" params = {"offset": last_update_id + 1, "timeout": 5} try: response = requests.get(url, params=params, timeout=10) data = response.json() if data["ok"]: return data["result"] except Exception as e: print(f"Error getting updates: {e}") return [] def send_message(chat_id, text): url = f"https://api.telegram.org/bot{TELEGRAM_BOT_TOKEN}/sendMessage" payload = {"chat_id": chat_id, "text": text} try: requests.post(url, data=payload, timeout=10) except Exception as e: print(f"Error sending message: {e}") def loop(): # Auto-alert on pressure detection event = Bridge.call("get_event") if event == "pressure_detected": pressure = Bridge.call("get_pressure") value = Bridge.call("get_value") print(f"Pressure detected: {pressure} value: {value}") send_message(CHAT_ID, f"⚡ Force detected: {pressure} (raw: {value})") # Handle Telegram commands updates = get_updates() for update in updates: last_update_id = update["update_id"] if "message" not in update: continue message = update["message"] chat_id = message["chat"]["id"] text = message.get("text", "").strip() print(f"Received: {text}") if text == "/start": send_message(chat_id, "Arduino UNO Q Force Sensor Bot\n" "/value - Read raw ADC value (0-4095)\n" "/pressure - Pressure level classification\n" "Automatic alert when force is applied") elif text == "/value": result = Bridge.call("get_value") send_message(chat_id, f"Force sensor value: {result}") elif text == "/pressure": result = Bridge.call("get_pressure") send_message(chat_id, f"Pressure level: {result}") else: send_message(chat_id, "Unknown command. Send /start for help.") time.sleep(0.5) App.run(user_loop=loop)

빠른 단계

  • YOUR_TELEGRAM_BOT_TOKEN을 BotFather로부터 받은 실제 봇 토큰으로 교체합니다.
  • YOUR_CHAT_ID를 Telegram 채팅 ID로 교체합니다.
  • 이 Python 코드를 앱의 Python 파일에 붙여넣습니다(동일한 MCU 스케치 유지).
  • Run 버튼을 클릭하고 — 힘 센서를 누르면 Telegram 알림이 트리거됩니다.

App Lab 콘솔 출력

DIYables_Apps
Stop
sketch.ino
1#include "Arduino_RouterBridge.h"
Serial Monitor
Python
[2026-04-29 09:10:00] Waiting for Telegram messages... [2026-04-29 09:10:05] Pressure detected: light_touch value: 528 [2026-04-29 09:10:10] Received: /value [2026-04-29 09:10:15] Received: /pressure
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
⚡ Force detected: light_touch (raw: 528)
10:15 AM
/value
10:16 AM ✓✓
Force sensor value: 0
10:17 AM
/pressure
10:18 AM ✓✓
Pressure level: no_pressure
10:19 AM
⚡ Force detected: big_squeeze (raw: 3684)
10:20 AM
/pressure
10:21 AM ✓✓
Pressure level: big_squeeze
10:22 AM

OpenClaw

You can adapt the OpenClaw to this tutorial by refering the instruction on 아두이노 우노 Q - OpenClaw Tutorial

프로젝트 아이디어

Arduino UNO Q와 힘 센서로 많은 유용한 프로젝트를 만들 수 있습니다:

  • 스마트 초인종: FSR을 현관 매트 아래에 설치합니다 — 누군가 밟으면 MPU가 Telegram 알림 "누군가 문 앞에 있습니다!"를 보내 보이지 않는 압력 활성화 초인종을 만듭니다
  • 악력 트레이너: 손 강화 운동의 일부로 FSR을 압박합니다 — Python은 각 세션의 최대 압력 값을 추적하고 오늘의 최고 악력과 함께 Telegram 요약을 보냅니다
  • 패키지 무게 모니터: FSR을 선반 위 패키지 아래에 놓습니다 — 패키지가 제거되면(압력이 0으로 떨어짐) MPU가 즉시 "패키지 제거됨" Telegram 알림을 보냅니다
  • 누름 카운터: 시간당 감지된 힘의 횟수를 세세요 — CSV 파일에 카운트를 기록하고 시간별 Telegram 보고서를 보냅니다(키오스크 또는 기계의 버튼 누름에 유용함)
  • 침대 점유 센서: 여러 FSR을 매트리스 아래에 놓습니다 — Python이 압력 이벤트를 받고 침대가 점유되거나 비워질 때 Telegram 알림을 보냅니다(노인 또는 환자 모니터링에 유용함)

도전 과제

Arduino UNO Q의 힘 센서로 더 나아갈 준비가 되었나요? 이 도전 과제를 시도하세요:

  • 쉬움: /peak Telegram 명령 추가: Python은 시작 이후 읽은 가장 높은 원시 ADC 값을 추적하고 요청할 때 반환합니다 — 테스트 중 최대 가해진 힘을 찾는 데 유용합니다.
  • 중간: 힘 지속 시간 추적기 구현: 압력이 시작되는 시간(값 ≥ 40)과 끝나는 시간을 기록합니다 — 힘이 해제될 때마다 지속 시간을 보고하는 Telegram 메시지를 보냅니다.
  • 고급: 디바운스가 있는 탭 카운터 빌드: Python에서 pressure_detected 이벤트가 2초 내에 두 번 이상 발생하는지 확인하여 빠른 힘 누름(탭)을 감지합니다 — 탭 시퀀스를 세고 정의한 패턴에 대해 "3 taps detected!"와 같은 Telegram 메시지를 보냅니다.

관련 튜토리얼