伺服馬達
叫一個角度,它就轉到那裡。 · ⏱ 約 30 分鐘
你會學到三件事
- 伺服馬達吃的是角度,不是速度
Servo 是一個物件——先宣告、再 attach
- 為什麼它動得那麼慢(而那是你要的)
開始之前
接線:伺服的訊號線(黃/橘)接 9 號腳、紅線接 5V、棕/黑線接 GND。
⚠️ 一顆以上的伺服要外接電源。 板子的 5V 供不動兩顆,
症狀是「板子一直重開」——而那看起來像程式當掉。
一、宣告一個
Servo s;
這一行和 int n; 是同一個形狀:型態 + 名字。
只是型態換成 Servo——它不是一個數字,是一個東西,
而那個東西有自己的動作(attach、write、read)。
這就是C++ 入門第 7 課那個「點」的寫法為什麼存在:
有些東西不只有值,還有行為。
二、接上去
void setup() {
s.attach(9);
}
attach(9) 的意思是「這顆伺服接在 9 號腳」。
⚠️ 伺服不用 pinMode——attach 幫你做了。
三、叫一個角度
s.write(90); // 轉到 90 度(正中間)
範圍是 0 到 180 度。
⚠️ write 不會等它轉到。 它送出指令就返回了,
而馬達實際轉過去需要時間(大約每 60 度 0.1~0.2 秒)。
所以:
s.write(0);
s.write(180); // ← 上一行還沒轉完就被覆蓋了
這樣寫的話它只會轉到 180,中間那一步看不到。要看到過程得自己 delay。
四、掃描
for (int a = 0; a <= 180; a++) {
s.write(a);
delay(15);
}
一度一度轉,每度停 15 毫秒——共約 2.7 秒掃完。
⚠️ delay 太小的話馬達跟不上,看起來會是「一路抖過去」。
15 毫秒差不多是它轉一度需要的時間。
s.read() 可以問它「現在在幾度」——⚠️ 而那是你上次叫它去的角度,
不是它實際的位置。伺服不會回報真實角度。
完成的樣子
Servo s;
void setup() {
Serial.begin(9600);
s.attach(9);
s.write(90);
Serial.println(s.read());
}
void loop() {
for (int a = 0; a <= 180; a++) {
s.write(a);
delay(15);
}
}
換你了
接上第 7 課的超音波,做一個掃描式雷達:
伺服一度一度轉,每一度量一次距離,把「角度 距離」印出來。
這一課你做了什麼
- 你宣告了一個
Servo 物件並 attach 到一支腳
- 你用
write 叫了角度,而不是速度
- 你知道
write 不會等,read 回報的也不是真實位置
如果卡住了
| 你看到 |
多半是因為 |
| 完全不動 |
訊號線接錯腳,或 attach 漏了 |
| 板子一直重開 |
供電不足。伺服要外接電源 |
| 一路抖過去 |
delay 太小,馬達跟不上 |
| 只轉到終點看不到過程 |
中間沒有 delay——write 不會等 |
| 轉到底會嗡嗡叫 |
超出機械極限了。有些伺服的實際範圍不到 0~180 |
在編輯器打開這一課 →