DEV Community

張旭豐
張旭豐

Posted on

用壓力感測器 + Arduino 做互動震動回饋裝置:當你的力量變成回饋

用壓力感測器 + Arduino 做互動震動回饋裝置:當你的力量變成回饋


感性開場:雙手握緊遊戲手把

當你用力握緊拳頭,遊戲手把震了一下

那一震,來得很快。

在你發力的瞬間,手把裡的馬達轉動、震動、停下——你感受到的,是一個被設計好的回饋訊號。

但你有沒有想過:那個「設計」,從來不是只有工程師的事。

如果你可以自己動手,把「施力」變成「回饋」,把那一下震動變成你親手打造的互動——那會是什麼感覺?

今天這篇文章,要帶你從零開始,做一個真的能用的壓力感測互動震動回饋裝置。從電路到程式碼,全部可以自己動手完成。


你可能會需要的場景

在開始之前,先問自己一個問題:

你想要什麼時候感受到「回饋」?

想像幾個畫面——

  • 健身訓練時:握力器握得越用力,啞鈴上的震動馬達就跟著震得越強,每一次出力都有即時回饋,不再只是靠感覺判斷有沒有練到。
  • VR 互動中:手部動作對應真實的力回饋,握住虛擬物體時感受到對應的阻力與震動。
  • 音樂演奏:按壓力道的不同,觸發不同的震動節奏與強度,變成一種觸覺上的音樂表現。
  • 遊戲手把改造:把一般的手把升級成有壓力感測回饋的版本,拳擊遊戲裡的每一拳都真實有感。
  • 藝術互動裝置:用身體的力道與作品對話,力的強弱直接轉化成震動回饋。

這些場景背後的核心,其實都是同一件事:把「力量」翻譯成「感受」

而這件事,你完全可以自己做。


原理:FSR 怎麼讀到你的力氣?

整個裝置的核心,在於一顆叫做 FSR(Force Sensing Resistor) 的元件——壓力感測電阻。

FSR 是什麼?

FSR 的全名是 Force Sensing Resistor,翻成中文就是「力量感測電阻」。它的運作原理非常優雅:

當你對 FSR 施壓,它的電阻值會改變——壓力越大,電阻越小。

這個特性讓它像一隻會說話的手,告訴電路「現在有人碰我,而且碰得很用力」。

FSR 原理圖:施力 → 電阻變化

📷 圖說:FSR 元件結構圖。僅供結構參考,實際尺寸與外觀請以收到的實物為準。

訊號怎麼傳遞?

FSR 本身輸出的是類比電壓變化。當 Arduino 的類比輸入腳位讀到這個電壓,就能換算成我們需要的數值。接著,Arduino 根據這個數值,決定要讓震動馬達轉多快、震多強。

整個流程簡化來說是這樣的:

訊號流程圖:施力 → Arduino → 震動輸出

*圖說:這張圖展示了 Arduino 作為系統核心的電路連接——FSR 接收施力訊號,Arduino 讀取後控制馬達輸出。實際接線請依據文中電路圖進行。(Source: Wikimedia Commons)

簡單來說,就是三個步驟不斷循環:

  1. 感測 — FSR 偵測你的施力
  2. 運算 — Arduino 讀取電壓、換算數值
  3. 執行 — 依據力道大小,驅動震動馬達輸出對應強度

材料清單:這些是你需要準備的東西

在開始之前,你需要先備齊所有材料。以下是完成這次專案所需的完整清單:

材料 規格建議 用途
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 開發板

📷 圖說:Arduino Nano 開發板。僅供結構參考,實際尺寸請以收到的實物為準。

ERM 偏心旋轉馬達

📷 圖說:ERM 偏心旋轉馬達,傳統震動元件。僅供結構參考,實際尺寸請以收到的實物為準。

LRA 線性震動馬達

📷 圖說:LRA 線性震動馬達,響應速度快,適合精準控制。僅供結構參考,實際尺寸請以收到的實物為準。

📦 精選購買推薦:


電路接線:一步一步接起來

材料準備好了之後,就開始動手接線。以下是完整的電路示意圖:

電路接線圖(Fritzing 風格)

📷 圖說:麵包板電路示意圖,僅供結構參考,實際線路配置請依本文步驟連接。

完整接線步驟

按照以下順序,一步步把電路接好:

Step 1:FSR 與分壓電路

  1. 10kΩ 電阻 一端接 Arduino 的 A0 腳位,另一端接 5V
  2. FSR 的其中一腳 接 Arduino 的 A0 腳位(與電阻同一點)。
  3. FSR 的另一腳GND

這樣就形成了一個分壓電路:FSR 受壓時電阻下降,A0 讀到的電壓就會上升。

Step 2:電晶體開關電路

  1. NPN 電晶體(2N2222)的基極(B) 透過 1kΩ 電阻 接 Arduino 的 D9 腳位(PWM輸出)
  2. 將電晶體的集極(C) 接馬達的正極。
  3. 將電晶體的射極(E)GND

Step 3:馬達保護電路

  1. 1N4001 二極體 與馬達並聯(正極接馬達正極,負極接地)。
  2. 這是必要的保護元件——當馬達停止時會產生反向電動勢,二極體可以防止這個突波損壞電晶體與 Arduino。

Step 4:連接馬達與供電

  1. LRA 或 ERM 馬達 的正極接 5V,負極接電晶體的集極。
  2. ⚠️ 建議使用 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);  // 小延遲,避免過度頻繁讀取
}
Enter fullscreen mode Exit fullscreen mode

程式說明

  • 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 毫秒更新一次,響應速度足夠流暢,同時不會讓序列埠輸出太過混亂。

測試方式

  1. 燒錄程式後,點開 Arduino IDE 的「序列埠監視視窗」(Serial Monitor), baud rate 設為 9600
  2. 用手輕壓 FSR,觀察數值變化——輕壓約 200~400,用力壓接近 1023。
  3. 同時觀察馬達:輕壓時微震,用力時強震,即代表成功。
  4. 若馬達無反應,先檢查電晶體接線是否正確(二極體方向、基極電阻是否接好)。

進階玩法

基礎功能跑通之後,你可以自由擴展:

  • 增加靈敏度曲線:用 pow()log() 取代線性的 map(),讓輕壓時的震動變化更細膩。
  • 多段力道分級:設定力道門檻值,讓不同施力區間觸發不同的震動模式(短震、長震、脈衝式)。
  • 多顆 FSR 與多顆馬達:做成雙手各一組感測器,對應雙手各自的震動回饋,適用於VR手把改造。
  • 結合藍牙模組:將數值以無線方式傳到手機或電腦,擴展成更大的互動系統。

成品展示:完成後長什麼樣子?

組裝完成後,你的裝置大概會長這樣——

麵包板電路實作

📷 圖說:麵包板電路實際接線範例,僅供結構參考,FSR 感測墊與馬達請依本文電路圖另外連接。

整個系統可以分成兩個主要區塊:

  • 控制區(麵包板):Arduino Nano、10kΩ 電阻、NPN 電晶體、二極體、杜邦線,全部插在麵包板上,方便調整與偵錯。
  • 感測與輸出區(FSR + 馬達):FSR 感測墊放在你需要施力的位置,馬達放在你需要感受到震動回饋的地方。兩者可以用熱熔膠或 3D 列印外殼固定在一起。

如果你把電路焊接成一塊小 PCB、外殼用 3D 列印封裝起來,整個裝置可以縮小到掌心大小,變成一個真正可以隨身攜帶、隨時使用的互動工具。


那一震,是你自己做出來的

到這裡,你已經從無到有,打造出了一個完整的互動回饋系統。

你知道了 FSR 怎麼把物理力道翻譯成電的語言,知道了 Arduino 怎麼把這個語言轉化成馬達的震動,也知道了一個完整的電路該怎麼從麵包板上的臨時線路,變成一塊可以長時間使用的固定裝置。

你動手解決了一個真實存在的問題:讓施力這件事,變成一種可以感受到的反饋。

那個設計師給你留下的一震,不是天上掉下來的。

那一震,是你自己做出來的。


如果你做出來了、或對這個專案有任何疑問,
歡迎在下面留言分享你的作品!

也歡迎期待下一篇文章——Part 2 我們會把這個系統加上藍牙,
讓你用手機遙控震動強度。

讓我們一起做出更多有趣的東西。


📁 本文原始電路圖、程式碼與材料清單均為原創內容,如需轉載請標註出處。

Top comments (0)