# 精準控制 在 3D 列印機、輸送帶或其他需要高精度控制的裝置中,單純使用直流馬達或計算時間來控制位置往往不夠精準,因此需要使用伺服馬達或減速馬達搭配額外的控制方式(如 PWM、編碼器或馬達擴充板)來達成精準控制。本章將依序介紹: 1. **伺服馬達的基本控制**(完全不用擴充版) 2. **PWM 簡單控制** 3. **減速馬達控制** --- ## 外接電源供應伺服馬達 當要同時驅動多顆伺服馬達時,Arduino 板本身的電源可能無法提供穩定或足夠的電流。這時候需要使用外接電源,例如: - 電池組(5V~6V 常用) - 穩壓電源(5V/2A 以上,視馬達數量而定) ### 接線方式 如下圖示意:  1. **伺服馬達正極 (紅線)** → 外接電源正極 (+) 2. **伺服馬達負極 (黑線)** → 外接電源負極 (-),同時也要接到 Arduino 的 GND - ✅ 這樣可以讓 Arduino 與伺服馬達「共地」,確保訊號電位一致 3. **伺服馬達訊號線 (黃線或白線)** → 連接到 Arduino 的控制腳位(如 D9、D10 等) --- ### 為什麼要共地 (GND 接在一起)? - Arduino 傳給伺服馬達的控制訊號是 **電壓差** 為基準 - 若兩邊的地線沒有接在一起,伺服馬達就無法正確辨認訊號的高低電位 - 可能造成: - 馬達動作異常 - 抖動 - 完全不動  --- ### 注意事項 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 會造成馬達抖動或卡住
×
Sign in
Email
Password
Forgot password
or
By clicking below, you agree to our
terms of service
.
Sign in via Facebook
Sign in via Twitter
Sign in via GitHub
Sign in via Dropbox
Sign in with Wallet
Wallet (
)
Connect another wallet
New to HackMD?
Sign up