Semorphe

伺服馬達

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

你會學到三件事

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

開始之前

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

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

🟢 先把編輯器打開,跟著下面一起做:跟著做

一、宣告一個

先宣告一顆——名字自己取:

1Servo s;
宣告伺服馬達s使用命名空間std引入函式庫Servo.h1

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

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

這就是C++ 入門第 7 課那個「點」的寫法為什麼存在: 有些東西不只有值,還有行為。

積木盤上這一顆寫著「宣告伺服馬達 …」。

而 s.attach(9) 那種「點」的寫法在積木上是「執行 … 的 …」 ——左邊填那個東西,右邊填要它做什麼。

二、接上去

在 setup 裡告訴它接在哪一支腳:

1void setup() {2    s.attach(9);3}
變數s9執行attach(對)定義函式 回傳型別void(無回傳)setup12

attach(9) 的意思是「這顆伺服接在 9 號腳」。

⚠️ 伺服不用 pinMode,attach 幫你做了。

積木上它寫著「把伺服馬達 … 接到腳位 …」。

三、叫一個角度

要它轉到某個角度,用 write:

1s.write(90);      // 轉到 90 度(正中間)
變數s90執行write(對)1

範圍是 0 到 180 度。

⚠️ write 不會等它轉到。 它送出指令就返回了, 而馬達實際轉過去需要時間(大約每 60 度 0.1~0.2 秒)。

所以:

🔎 這一段是試一下——打了看結果就好,不要留在程式裡。

1s.write(0);2s.write(180);      // ← 上一行還沒轉完就被覆蓋了
變數s0變數s180執行write(對)執行write(對)12

這樣寫的話它只會轉到 180,中間那一步看不到。要看到過程得自己 delay。

四、掃描

用一個 for 讓它從 0 度掃到 180 度:

1for (int a = 0; a <= 180; a++) {2    s.write(a);3    delay(15);4}
0180變數s變數a15等待毫秒執行write(對)計數a從到(含)重複123

一度一度轉,每度停 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}
9600990伺服馬達s目前的角度序列埠輸出小數位數並換行讓伺服馬達s轉到度把伺服馬達s接到腳位開啟序列埠 傳輸速率0180變數a15等待毫秒讓伺服馬達s轉到度計數a從到(含)重複定義函式 回傳型別void(無回傳)loop定義函式 回傳型別void(無回傳)setup宣告伺服馬達s使用命名空間std引入函式庫Servo.h1235612713814915

換你了

接上第 7 課的超音波,做一個掃描式雷達: 伺服一度一度轉,每一度量一次距離,把「角度 距離」印出來。

到編輯器做這一題:練習:接上超音波,做一個掃描式雷達

做一個

光越亮,伺服的角度越大,做一個指針式的亮度計。

🔴 這一題就是 map 的第二次登場:一邊是 0 到 1023,另一邊是 0 到 180。 ⚠️ 而它會抖。想一下為什麼,以及你要不要讓它抖。

到編輯器做這一題:做一個:把光變成指針

這一課你做了什麼

如果卡住了

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