Semorphe

伺服馬達

叫一個角度,它就轉到那裡。 · ⏱ 約 30 分鐘

你會學到三件事

  1. 伺服馬達吃的是角度,不是速度
  2. Servo 是一個物件——先宣告、再 attach
  3. 為什麼它動得那麼慢(而那是你要的)

開始之前

接線:伺服的訊號線(黃/橘)接 9 號腳、紅線接 5V、棕/黑線接 GND。

⚠️ 一顆以上的伺服要外接電源。 板子的 5V 供不動兩顆, 症狀是「板子一直重開」——而那看起來像程式當掉。

一、宣告一個

Servo s;

這一行和 int n; 是同一個形狀:型態 + 名字

只是型態換成 Servo——它不是一個數字,是一個東西, 而那個東西有自己的動作(attachwriteread)。

這就是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 課的超音波,做一個掃描式雷達: 伺服一度一度轉,每一度量一次距離,把「角度 距離」印出來。

這一課你做了什麼

如果卡住了

你看到 多半是因為
完全不動 訊號線接錯腳,或 attach 漏了
板子一直重開 供電不足。伺服要外接電源
一路抖過去 delay 太小,馬達跟不上
只轉到終點看不到過程 中間沒有 delay——write 不會等
轉到底會嗡嗡叫 超出機械極限了。有些伺服的實際範圍不到 0~180
在編輯器打開這一課 →