Basic Tutorial for Arduino, 入門篇

【Arduino入門教學】第16篇:SG90 Servo 伺服馬達控制(PWM原理、接線圖與 Servo.h 程式範例)

前言:什麼是 Servo 伺服馬達(舵機)?

在 Arduino 創客與機器人實作中,伺服馬達(Servo Motor,常稱為舵機) 是實現精密角度控制的核心元件。舉凡機器手臂關節、智慧門鎖、遙控車轉向機構或機械開關,都能看到它的身影。

其中,SG90 伺服馬達 因體積小巧、價格親民、驅動簡單,成為新手入門學習微控制器馬達控制的最佳選擇。

一、 SG90 伺服馬達工作原理與 PWM 控制

伺服馬達內部包含了 DC 微型馬達、減速齒輪組、電位器(位置感測器)與控制電路板

伺服馬達的角度旋轉是透過 PWM(脈衝寬度調製)信號 來實現的:

  • 標準 PWM 信號週期: 固定為 20 ms(50 Hz)

  • 高電位脈寬(Pulse Width): 理論脈寬約在 1 ms(0度)至 2 ms(180度)之間;實際市售 SG90 馬達的脈寬通常在 0.5 ms2.5 ms 之間對應 0° ~ 180° 角度。

⚠️ 注意: 不同品牌或批次的伺服馬達,對於相同 PWM 信號反應的角度可能略有偏差。

二、 選購須知:180度標準舵機 vs 360度連續旋轉舵機

在購買 SG90 或 MG995 伺服馬達時,請特別留意規格標示:

  1. 180度標準伺服馬達(Standard Servo):

    • 特點: 可精準控制旋轉角度(0° 到 180°)

    • 適用情境: 機器手臂、機械關節、門鎖開關、機械開閉裝置。

  2. 360度連續旋轉伺服馬達(Continuous Rotation Servo):

    • 特點: 無法控制固定角度,而是控制旋轉方向與速度(如:1500µs 停止、大於 1500µs 正轉、小於 1500µs 反轉)。

    • 適用情境: 自走車輪子驅動、輪式機器人。

💡 本篇教學以最常見的 180度標準 SG90 伺服馬達 進行實作範例。

 

三、 實驗材料與電路接線圖

Arduino 開發板供電能力有限。若專案中需要同時驅動 1 個以上高負載(如 MG995 金屬齒輪馬達) 的伺服馬達,建議搭配外接電源(如 5V 變壓器)或馬達擴充板,避免 Arduino 因電流過大而重啟。

🛠️ 所需材料清單

  • Arduino Uno R3 開發板 × 1

  • SG90 180度伺服馬達 × 1

  • USB 數據傳輸線 × 1

  • 實驗麵包板與杜邦線 × 若干

🛍️ 還沒有硬體材料嗎? 推薦購買:米羅科技 – Arduino 程式學習爆款套件組( 一次帶走開發板、感測器與馬達模組)

👍爆款推薦:程式學習套件組

購買網址:shop.mirotek.com.tw

 

🔌 引腳接線對照表 (Pin Mapping)

SG90 伺服馬達通常帶有 3 根不同顏色的控制線:

伺服馬達線色功能說明Arduino Uno 接線位置
棕色 (或黑色)GND(電源負極)GND
紅色VCC(電源正極 5V)5V(多顆馬達請外接 5V)
橘色 (或黃色)Signal(PWM 信號線)Pin 9(或任意 PWM 腳位)

四、 Arduino Servo.h 控制程式範例

Arduino 官方內建了便利的 <Servo.h> 函式庫,讓我們不需要手動寫複雜的 PWM 脈衝時間計算,就能直接透過角度數值(0180)控制馬達!

💻 完整程式碼:伺服馬達 0°~180° 來回掃描

/*
 * 【Arduino入門教學】第16篇:控制 SG90 Servo 伺服馬達
 * 發佈單位:米羅科技文創學院
 * 說明:使用 Servo.h 函式庫控制 SG90 伺服馬達從 0度 平滑轉動至 180度,再轉回 0度
 */

#include <Servo.h>  // 引用 Arduino 官方伺服馬達控制函式庫

Servo myservo;  // 建立 Servo 物件(一個物件代表一顆馬達,Arduino Uno 最多支援 12 個 Servo 物件)

int pos = 0;    // 建立變數,用於儲存馬達目標角度位置

void setup() {
  myservo.attach(9); // 將 Servo 物件綁定至 Arduino 的 Pin 9 數位腳位
}
void loop() {
  // 步驟一:從 0 度順暢旋轉到 180 度,每次增加 1 度
  for (pos = 0; pos <= 180; pos += 1) {
    myservo.write(pos);              // 告知伺服馬達旋轉至 pos 角度
    delay(15);                       // 等待 15 毫秒讓馬達運轉到達指定位置
  }


  // 步驟二:從 180 度逆向旋轉回 0 度,每次減少 1 度
  for (pos = 180; pos >= 0; pos -= 1) {
    myservo.write(pos);              // 告知伺服馬達旋轉至 pos 角度
    delay(15);                       // 等待 15 毫秒讓馬達運轉到達指定位置
  }
}

五、 程式邏輯解析與重點提醒

  1. #include <Servo.h>:引用官方庫後,系統會自動在背景處理 20ms 定時脈衝。

  2. myservo.attach(Pin):將指定的 PWM 腳位設定為伺服馬達訊號輸出腳。

  3. myservo.write(angle):傳入 0~180 的整數角度即可命令馬達轉至該角度。

  4. 為什麼要加上 delay(15) 伺服馬達轉動需要實體機械運作時間,給予微小的延遲(例如 15ms)可以讓馬達轉動更加平滑,避免發出咔咔聲或抖動。

六、 常見問題與除錯 (FAQ)

Q1: 為什麼上傳程式後,伺服馬達會不斷抖動或發出「卡卡」聲?

解答: 這通常是供電不足所致。當馬達啟動瞬間電流過大時,Arduino 的 5V 腳位電壓會被拉低(Brown-out),導致 Arduino 開發板不斷重啟。解決方法是為伺服馬達提供獨立的 5V 電源(請記得將外接電源的 GND 與 Arduino 的 GND 相連共地)。

Q2: 為什麼馬達轉到 0 度或 180 度極限時會卡住抖動?

解答: 部分便宜的 SG90 馬達物理機械結構極限可能只有 5°~175°。遇到這種情況,可以在程式中把界線稍微縮小(例如 pos 設定在 10170 之間)。

🔗 延伸閱讀與推薦課程

相關文章