힘 센서(FSR — 힘 감지 저항)는 누르는 강도에 따라 저항값이 변합니다. Arduino UNO Q의 12비트 ADC와 풀-다운 저항기에 연결되면 0(압력 없음)부터 4095(최대 압박)까지의 값을 얻을 수 있습니다. Bridge와 Telegram을 사용하면 즉시 알림을 받고 원격으로 압력 수준을 조회할 수 있습니다.
이 튜토리얼에서 배울 내용:
힘 센서의 작동 원리
Arduino UNO Q MCU에 풀-다운 저항기를 사용하여 힘 센서를 배선하는 방법
아날로그 값을 읽고 압력 수준을 분류하는 방법(12비트 ADC: 0–4095)
Bridge를 사용하여 Linux 측(Python)에 힘 데이터 및 이벤트를 노출하는 방법
int reading = analogRead(FORCE_SENSOR_PIN); // 0-4095
ADC 값을 기반으로 압력 수준 분류(12비트, 0–4095):
if (reading < 40) Serial.println(" -> no pressure");elseif (reading < 800) Serial.println(" -> light touch");elseif (reading < 2000) Serial.println(" -> light squeeze");elseif (reading < 3200) Serial.println(" -> medium squeeze");elseSerial.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 FSRvoidsetup() {Serial.begin(9600);Serial.println("Arduino UNO Q Force Sensor ready");}voidloop() {int reading = analogRead(FORCE_SENSOR_PIN); // 0-4095Serial.print("Force sensor reading = ");Serial.print(reading);if (reading < 40) // no pressureSerial.println(" -> no pressure");elseif (reading < 800) // light touchSerial.println(" -> light touch");elseif (reading < 2000) // light squeezeSerial.println(" -> light squeeze");elseif (reading < 3200) // medium squeezeSerial.println(" -> medium squeeze");else// big squeezeSerial.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 버튼을 클릭합니다.
앱에 이름을 지정합니다(예: ForceSensor).
Create를 클릭하여 확인합니다.
스케치 붙여넣기: 위의 MCU 코드를 복사하고 sketch/sketch.ino에 붙여넣습니다.
업로드: Arduino App Lab의 Run 버튼을 클릭합니다.
힘 센서를 부드럽게 눌렀다가 더 세게 누르세요 — 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 valuesint cached_value = 0;String cached_pressure = "no_pressure";bool pressure_event = false;bool prev_pressed = false;unsignedlong last_read_ms = 0;constunsignedlong READ_INTERVAL = 500;String get_value(String arg) {returnString(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";}voidsetup() {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");}voidloop() {unsignedlongnow = 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); } elseif (!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 timedef 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.
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_RouterBridgeArduino
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 버튼을 클릭합니다.
힘 센서를 누르세요 — 이벤트 및 압력 수준이 두 콘솔에 나타나는 것을 관찰하세요.
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 requestsimport timeTELEGRAM_BOT_TOKEN = "YOUR_TELEGRAM_BOT_TOKEN"CHAT_ID = "YOUR_CHAT_ID"last_update_id = 0def 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"]exceptExceptionas 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)exceptExceptionas 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"notin 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 스케치 유지).
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 메시지를 보냅니다.