---
# System prepended metadata

title: 伺服馬達與外接電源
tags: [Arduino]

---

# 精準控制

在 3D 列印機、輸送帶或其他需要高精度控制的裝置中，單純使用直流馬達或計算時間來控制位置往往不夠精準，因此需要使用伺服馬達或減速馬達搭配額外的控制方式（如 PWM、編碼器或馬達擴充板）來達成精準控制。本章將依序介紹：

1. **伺服馬達的基本控制**（完全不用擴充版）  
2. **PWM 簡單控制**  
3. **減速馬達控制**

---

## 外接電源供應伺服馬達

當要同時驅動多顆伺服馬達時，Arduino 板本身的電源可能無法提供穩定或足夠的電流。這時候需要使用外接電源，例如：

- 電池組（5V~6V 常用）  
- 穩壓電源（5V/2A 以上，視馬達數量而定）

### 接線方式

如下圖示意：

![image](https://hackmd.io/_uploads/ByjYWd-gZl.png)

1. **伺服馬達正極 (紅線)** → 外接電源正極 (+)  
2. **伺服馬達負極 (黑線)** → 外接電源負極 (-)，同時也要接到 Arduino 的 GND  
   - ✅ 這樣可以讓 Arduino 與伺服馬達「共地」，確保訊號電位一致  
3. **伺服馬達訊號線 (黃線或白線)** → 連接到 Arduino 的控制腳位（如 D9、D10 等）

---

### 為什麼要共地 (GND 接在一起)？

- Arduino 傳給伺服馬達的控制訊號是 **電壓差** 為基準  
- 若兩邊的地線沒有接在一起，伺服馬達就無法正確辨認訊號的高低電位  
- 可能造成：
  - 馬達動作異常  
  - 抖動  
  - 完全不動
![image](https://hackmd.io/_uploads/SJsc51obZl.png)


---

### 注意事項

1. 外接電源電壓必須符合伺服馬達的額定電壓（通常 5V 或 6V）  
2. 若同時使用多顆馬達，電源電流要足夠（如 5V/2A 以上）  
3. 供電前務必確認正負極接線正確，避免馬達或電路損壞


## 1️⃣ 伺服馬達 Arduino 實作範例（簡單腳位方式）

這個範例示範如何控制一顆伺服馬達轉到不同角度。  
不使用變數宣告控制腳位，直接用數字呈現。

```cpp
#include <Servo.h>

Servo myservo;  // 建立伺服馬達物件

void setup() {
  myservo.attach(9);  // 將伺服馬達連到 Arduino D9
}

void loop() {
  myservo.write(0);    // 轉到 0 度
  delay(1000);         // 等 1 秒
  myservo.write(90);   // 轉到 90 度
  delay(1000);         // 等 1 秒
  myservo.write(180);  // 轉到 180 度
  delay(1000);         // 等 1 秒
}
```
💡 實作題目（可變化）

連接 兩個伺服馬達，分別控制不同角度變化

使用 兩個開關按鈕，控制同一顆伺服馬達轉到不同角度

嘗試設定不同角度的停留時間

## 2️⃣ 可變電阻控制伺服馬達角度

使用可變電阻（旋鈕）控制伺服馬達的角度，學生可以直接旋轉控制馬達。
```cpp=
#include <Servo.h>

Servo myservo;   // 建立伺服馬達物件

void setup() {
  myservo.attach(9);  // 伺服馬達接 D9
}

void loop() {
  int sensorValue = analogRead(A0);        // 讀取可變電阻 (接 A0)
  int angle = map(sensorValue, 0, 1023, 0, 180); // 將數值轉成 0~180 度
  myservo.write(angle);                    // 控制伺服馬達角度
  delay(15);                               // 讓伺服馬達有時間移動
}

```

# PWM 控制伺服馬達原理與範例

## 1️⃣ PWM 控制伺服馬達原理

伺服馬達本質是**角度控制裝置**，內部包含：

- 馬達  
- 位置感測器（通常是電位器）  
- 控制電路  

伺服馬達的位置由 **PWM 脈衝寬度（pulse width）** 決定：

| 角度 | PWM 高電平長度 |
|------|----------------|
| 0°   | 1 ms           |
| 90°  | 1.5 ms         |
| 180° | 2 ms           |

- PWM 週期通常固定為 20 ms（50 Hz）  
- 脈衝長度越長，馬達旋轉角度越大  
- 超過額定範圍（<1ms 或 >2ms）會造成馬達抖動或卡住  

⚠️ **注意**：這裡的 PWM 與直流馬達的占空比 PWM（0~255）不同，直流馬達的 PWM 控制速度，而伺服馬達的 PWM 控制角度。

---

### 使用 `Servo` 函式庫

```cpp
#include <Servo.h>

Servo myservo;  // 建立伺服物件

void setup() {
  myservo.attach(9);  // 伺服接到 D9
}

void loop() {
  // 正常角度控制
  myservo.write(0);    
  delay(1000);
  myservo.write(90);   
  delay(1000);
  myservo.write(180);  
  delay(1000);

  // 使用脈衝微秒精確控制
  myservo.writeMicroseconds(1200); // 約 20° 左右
  delay(1000);
  myservo.writeMicroseconds(1800); // 約 160° 左右
  delay(1000);
}
```
🔍 說明

myservo.write(角度)

角度範圍 0~180°

函式庫會自動轉成對應的 PWM 脈衝寬度

myservo.writeMicroseconds(脈衝長度)

可精準控制 PWM 高電平長度（單位微秒）

例如 1000~2000 μs 對應 0~180°

超過 0~180° 或 1000~2000 μs 會造成馬達抖動或卡住



