用壓力感測器 + Arduino 做互動震動回饋裝置:當你的力量變成回饋
當你用力握緊拳頭,遊戲手把震了一下
那一震,來得很快。
在你發力的瞬間,手把裡的馬達轉動、震動、停下——你感受到的,是一個被設計好的回饋訊號。
但你有沒有想過:那個「設計」,從來不是只有工程師的事。
如果你可以自己動手,把「施力」變成「回饋」,把那一下震動變成你親手打造的互動——那會是什麼感覺?
今天這篇文章,要帶你從零開始,做一個真的能用的壓力感測互動震動回饋裝置。從電路到程式碼,全部可以自己動手完成。
你可能會需要的場景
在開始之前,先問自己一個問題:
你想要什麼時候感受到「回饋」?
想像幾個畫面——
- 健身訓練時:握力器握得越用力,啞鈴上的震動馬達就跟著震得越強,每一次出力都有即時回饋,不再只是靠感覺判斷有沒有練到。
- VR 互動中:手部動作對應真實的力回饋,握住虛擬物體時感受到對應的阻力與震動。
- 音樂演奏:按壓力道的不同,觸發不同的震動節奏與強度,變成一種觸覺上的音樂表現。
- 遊戲手把改造:把一般的手把升級成有壓力感測回饋的版本,拳擊遊戲裡的每一拳都真實有感。
- 藝術互動裝置:用身體的力道與作品對話,力的強弱直接轉化成震動回饋。
這些場景背後的核心,其實都是同一件事:把「力量」翻譯成「感受」。
而這件事,你完全可以自己做。
原理:FSR 怎麼讀到你的力氣?
整個裝置的核心,在於一顆叫做 FSR(Force Sensing Resistor) 的元件——壓力感測電阻。
FSR 是什麼?
FSR 的全名是 Force Sensing Resistor,翻成中文就是「力量感測電阻」。它的運作原理非常優雅:
當你對 FSR 施壓,它的電阻值會改變——壓力越大,電阻越小。
這個特性讓它像一隻會說話的手,告訴電路「現在有人碰我,而且碰得很用力」。
📷 圖說:FSR 元件結構圖。僅供結構參考,實際尺寸與外觀請以收到的實物為準。
訊號怎麼傳遞?
FSR 本身輸出的是類比電壓變化。當 Arduino 的類比輸入腳位讀到這個電壓,就能換算成我們需要的數值。接著,Arduino 根據這個數值,決定要讓震動馬達轉多快、震多強。
整個流程簡化來說是這樣的:
*圖說:這張圖展示了 Arduino 作為系統核心的電路連接——FSR 接收施力訊號,Arduino 讀取後控制馬達輸出。實際接線請依據文中電路圖進行。(Source: Wikimedia Commons)
簡單來說,就是三個步驟不斷循環:
- 感測 — FSR 偵測你的施力
- 運算 — Arduino 讀取電壓、換算數值
- 執行 — 依據力道大小,驅動震動馬達輸出對應強度
材料清單:這些是你需要準備的東西
在開始之前,你需要先備齊所有材料。以下是完成這次專案所需的完整清單:
| 材料 | 規格建議 | 用途 |
|---|---|---|
| FSR 壓力感測器 | Interlink 402 / 406 系列,有效面積 5mm~10mm | 偵測施力並轉換為電阻變化 |
| Arduino Nano | 含 USB 線,ATmega328P 控制晶片 | 大腦,負責讀取訊號並控制輸出 |
| LRA 線性震動馬達 | 3V / 5V,扁平型(6mm 或 10mm) | 線性回饋,反應速度快,適合精準控制 |
| 或 ERM 偏心旋轉馬達 | 3V~5V,圓柱型 | 傳統震動感,強度大但響應較慢 |
| NPN 電晶體 | 2N2222 或 S8050 | 做為開關,控制馬達電流通斷 |
| 二極體 | 1N4001 或 1N4148 | 防止馬達反向電動勢損壞電路 |
| 10kΩ 定值電阻 | 1/4W | 與 FSR 形成分壓電路 |
| 1kΩ 電阻 | 1/4W | 基極電阻,保護 Arduino 腳位 |
| 杜邦線 | 公對母、母子、公對公 各若干 | 連接各元件 |
| 麵包板 | 400 孔或 830 孔 | 快速搭建電路原型 |
| 烙鐵 + 焊錫 | 30W 可調溫烙鐵 | 最終電路焊接(非必需,但推薦) |
| USB 電源線 | USB-A to Mini-B 或 USB-C(視 Arduino 型號) | 供電與燒錄程式 |
📷 圖說:Arduino Nano 開發板。僅供結構參考,實際尺寸請以收到的實物為準。
📷 圖說:ERM 偏心旋轉馬達,傳統震動元件。僅供結構參考,實際尺寸請以收到的實物為準。
📷 圖說:LRA 線性震動馬達,響應速度快,適合精準控制。僅供結構參考,實際尺寸請以收到的實物為準。
📦 精選購買推薦:
- FSR 壓力感測器(Interlink 402 系列):蝦皮搜尋關鍵字 | 淘寶搜尋關鍵字 | 可自行至各大電子材料平台選購
- Arduino Nano:蝦皮搜尋關鍵字 | 淘寶搜尋關鍵字 | 可自行至各大電子材料平台選購
- LRA 震動馬達(6mm 扁平型):蝦皮搜尋關鍵字 | 淘寶搜尋關鍵字 | 可自行至各大電子材料平台選購
電路接線:一步一步接起來
材料準備好了之後,就開始動手接線。以下是完整的電路示意圖:
📷 圖說:麵包板電路示意圖,僅供結構參考,實際線路配置請依本文步驟連接。
完整接線步驟
按照以下順序,一步步把電路接好:
Step 1:FSR 與分壓電路
- 將 10kΩ 電阻 一端接 Arduino 的 A0 腳位,另一端接 5V。
- 將 FSR 的其中一腳 接 Arduino 的 A0 腳位(與電阻同一點)。
- 將 FSR 的另一腳 接 GND。
這樣就形成了一個分壓電路:FSR 受壓時電阻下降,A0 讀到的電壓就會上升。
Step 2:電晶體開關電路
- 將 NPN 電晶體(2N2222)的基極(B) 透過 1kΩ 電阻 接 Arduino 的 D9 腳位(PWM輸出)。
- 將電晶體的集極(C) 接馬達的正極。
- 將電晶體的射極(E) 接 GND。
Step 3:馬達保護電路
- 將 1N4001 二極體 與馬達並聯(正極接馬達正極,負極接地)。
- 這是必要的保護元件——當馬達停止時會產生反向電動勢,二極體可以防止這個突波損壞電晶體與 Arduino。
Step 4:連接馬達與供電
- 將 LRA 或 ERM 馬達 的正極接 5V,負極接電晶體的集極。
- ⚠️ 建議使用 USB 供電時,馬達請勿超過 200mA,以免造成 Arduino 不穩定。若使用大功率馬達,請另外接外部 5V 電源。
Step 5:確認並檢查
- 確認所有 GND 都有正確連接(共地)。
- 確認馬達與 Arduino 不要共用自己的電源線路,避免電流不足。
- 用三用電表確認電路無短路後,再進行下一步。
程式碼與測試:讓大腦動起來
電路接好之後,就輪到 Arduino 的程式了。以下是完整的程式碼,可以直接複製貼上到 Arduino IDE 中燒錄使用。
完整程式碼
// FSR + Arduino 互動震動回饋裝置
// 讀取 FSR 壓力感測器數值,對應控制震動馬達強度
// 修正版:加入 threshold,避免 idle 抖動
const int fsrPin = A0; // FSR 連接的類比輸入腳位
const int motorPin = 9; // 震動馬達連接的 PWM 腳位
void setup() {
Serial.begin(9600); // 開啟序列埠,方便觀察數值
pinMode(motorPin, OUTPUT);
}
void loop() {
// 讀取 FSR 的類比數值(範圍 0 ~ 1023)
int fsrValue = analogRead(fsrPin);
// FSR 是指數型變化,輕壓就會訊號跳很快
// 加入 threshold 過濾,避免 idle 時馬達抖動
int vibration = 0;
if (fsrValue > 50) {
// 從 threshold 開始 map,避免一碰就全速
vibration = map(fsrValue, 50, 1023, 30, 255);
vibration = constrain(vibration, 0, 255);
}
// 寫入 PWM 控制馬達
analogWrite(motorPin, vibration);
// 序列埠監視(可選,方便除錯)
Serial.print("FSR: ");
Serial.print(fsrValue);
Serial.print(" -> Motor: ");
Serial.println(vibration);
delay(50); // 小延遲,避免過度頻繁讀取
}
程式說明
-
analogRead(fsrPin):讀取 FSR 的類比電壓值,範圍是 0~1023(10位元 ADC)。 -
Threshold 判斷:FSR 是指數型變化,輕壓訊號就會快速上升。加入
threshold = 50過濾低訊號,低於此值馬達直接設為 0(關閉),避免 idle 時馬達持續微幅抖動。 -
map()函式:把 threshold~1023 的數值映射到 30~255(PWM 輸出範圍),從 30 起步是因為 LRA 馬達低於一定電壓幾乎不會動。 -
constrain():確保輸出值不超過 0~255 範圍。 -
analogWrite(motorPin, vibration):透過 PWM 控制馬達轉速,進而控制震動強度。 -
delay(50):每 50 毫秒更新一次,響應速度足夠流暢,同時不會讓序列埠輸出太過混亂。
測試方式
- 燒錄程式後,點開 Arduino IDE 的「序列埠監視視窗」(Serial Monitor), baud rate 設為 9600。
- 用手輕壓 FSR,觀察數值變化——輕壓約 200~400,用力壓接近 1023。
- 同時觀察馬達:輕壓時微震,用力時強震,即代表成功。
- 若馬達無反應,先檢查電晶體接線是否正確(二極體方向、基極電阻是否接好)。
進階玩法
基礎功能跑通之後,你可以自由擴展:
-
增加靈敏度曲線:用
pow()或log()取代線性的map(),讓輕壓時的震動變化更細膩。 - 多段力道分級:設定力道門檻值,讓不同施力區間觸發不同的震動模式(短震、長震、脈衝式)。
- 多顆 FSR 與多顆馬達:做成雙手各一組感測器,對應雙手各自的震動回饋,適用於VR手把改造。
- 結合藍牙模組:將數值以無線方式傳到手機或電腦,擴展成更大的互動系統。
成品展示:完成後長什麼樣子?
組裝完成後,你的裝置大概會長這樣——
📷 圖說:麵包板電路實際接線範例,僅供結構參考,FSR 感測墊與馬達請依本文電路圖另外連接。
整個系統可以分成兩個主要區塊:
- 控制區(麵包板):Arduino Nano、10kΩ 電阻、NPN 電晶體、二極體、杜邦線,全部插在麵包板上,方便調整與偵錯。
- 感測與輸出區(FSR + 馬達):FSR 感測墊放在你需要施力的位置,馬達放在你需要感受到震動回饋的地方。兩者可以用熱熔膠或 3D 列印外殼固定在一起。
如果你把電路焊接成一塊小 PCB、外殼用 3D 列印封裝起來,整個裝置可以縮小到掌心大小,變成一個真正可以隨身攜帶、隨時使用的互動工具。
那一震,是你自己做出來的
到這裡,你已經從無到有,打造出了一個完整的互動回饋系統。
你知道了 FSR 怎麼把物理力道翻譯成電的語言,知道了 Arduino 怎麼把這個語言轉化成馬達的震動,也知道了一個完整的電路該怎麼從麵包板上的臨時線路,變成一塊可以長時間使用的固定裝置。
你動手解決了一個真實存在的問題:讓施力這件事,變成一種可以感受到的反饋。
那個設計師給你留下的一震,不是天上掉下來的。
那一震,是你自己做出來的。
如果你做出來了、或對這個專案有任何疑問,
歡迎在下面留言分享你的作品!
也歡迎期待下一篇文章——Part 2 我們會把這個系統加上藍牙,
讓你用手機遙控震動強度。
讓我們一起做出更多有趣的東西。
📁 本文原始電路圖、程式碼與材料清單均為原創內容,如需轉載請標註出處。





Top comments (0)