伺服馬達
叫一個角度,它就轉到那裡。 · ⏱ 約 30 分鐘
你會學到三件事
- 伺服馬達吃的是角度,不是速度
Servo 是一個物件,先宣告、再 attach
- 為什麼它動得那麼慢(而那是你要的)
開始之前
接線:伺服的訊號線(黃/橘)接 9 號腳、紅線接 5V、棕/黑線接 GND。
⚠️ 一顆以上的伺服要外接電源。 板子的 5V 供不動兩顆,
症狀是「板子一直重開」,而那看起來像程式當掉。
🟢 先把編輯器打開,跟著下面一起做:跟著做
一、宣告一個
先宣告一顆——名字自己取:
1Servo s;
這一行和 int n; 是同一個形狀:型態 + 名字。
只是型態換成 Servo。它不是一個數字,是一個東西,
而那個東西有自己的動作(attach、write、read)。
這就是C++ 入門第 7 課那個「點」的寫法為什麼存在:
有些東西不只有值,還有行為。
積木盤上這一顆寫著「宣告伺服馬達 …」。
而 s.attach(9) 那種「點」的寫法在積木上是「執行 … 的 …」
——左邊填那個東西,右邊填要它做什麼。
二、接上去
在 setup 裡告訴它接在哪一支腳:
1void setup() {2 s.attach(9);3}
attach(9) 的意思是「這顆伺服接在 9 號腳」。
⚠️ 伺服不用 pinMode,attach 幫你做了。
積木上它寫著「把伺服馬達 … 接到腳位 …」。
三、叫一個角度
要它轉到某個角度,用 write:
1s.write(90); // 轉到 90 度(正中間)
範圍是 0 到 180 度。
⚠️ write 不會等它轉到。 它送出指令就返回了,
而馬達實際轉過去需要時間(大約每 60 度 0.1~0.2 秒)。
所以:
🔎 這一段是試一下——打了看結果就好,不要留在程式裡。
1s.write(0);2s.write(180); // ← 上一行還沒轉完就被覆蓋了
這樣寫的話它只會轉到 180,中間那一步看不到。要看到過程得自己 delay。
四、掃描
用一個 for 讓它從 0 度掃到 180 度:
1for (int a = 0; a <= 180; a++) {2 s.write(a);3 delay(15);4}
一度一度轉,每度停 15 毫秒,共約 2.7 秒掃完。
⚠️ delay 太小的話馬達跟不上,看起來會是「一路抖過去」。
15 毫秒差不多是它轉一度需要的時間。
s.read() 可以問它「現在在幾度」。⚠️ 而那是你上次叫它去的角度,
不是它實際的位置:伺服不會回報真實角度。
完成的樣子
這一課的參考做法——程式碼每一行的號碼,就印在對應的那塊積木上。
1#include <Servo.h>2using namespace std;3Servo s;4 5void setup() {6 Serial.begin(9600);7 s.attach(9);8 s.write(90);9 Serial.println(s.read());10}11 12void loop() {13 for (int a = 0; a <= 180; a++) {14 s.write(a);15 delay(15);16 }17}
換你了
接上第 7 課的超音波,做一個掃描式雷達:
伺服一度一度轉,每一度量一次距離,把「角度 距離」印出來。
到編輯器做這一題:練習:接上超音波,做一個掃描式雷達
做一個
光越亮,伺服的角度越大,做一個指針式的亮度計。
🔴 這一題就是 map 的第二次登場:一邊是 0 到 1023,另一邊是 0 到 180。
⚠️ 而它會抖。想一下為什麼,以及你要不要讓它抖。
到編輯器做這一題:做一個:把光變成指針
這一課你做了什麼
- 你宣告了一個
Servo 物件並 attach 到一支腳
- 你用
write 叫了角度,而不是速度
- 你知道
write 不會等,read 回報的也不是真實位置
如果卡住了
| 你看到 |
多半是因為 |
| 完全不動 |
訊號線接錯腳,或 attach 漏了 |
| 板子一直重開 |
供電不足。伺服要外接電源 |
| 一路抖過去 |
delay 太小,馬達跟不上 |
| 只轉到終點看不到過程 |
中間沒有 delay——write 不會等 |
| 轉到底會嗡嗡叫 |
超出機械極限了。有些伺服的實際範圍不到 0~180 |
在編輯器打開這一課 →