ESP32 教學 17/55 - 使用 ESP32 同電位器控制伺服馬達 - ESP32 IoT 學習套件
喺呢個教學入面,我哋會學吓點樣用SunFounder嘅ESP32 IoT學習套件入面嘅ESP32微控制器同埋一個電位器嚟控制一個伺服摩打。完成咗呢個項目之後,你就可以用電位器順滑咁調整伺服摩打嘅角度,做到精確控制。呢個係一個好好嘅方法去探索ESP32嘅能力,同埋了解佢點樣同摩打互動。

當我哋深入細節嘅時候,會涵蓋所需嘅硬件組件、接線指示同埋代碼示例,等你可以將所有嘢順利運行。如果想睇到更加視覺化嘅示範,記得睇吓呢個教學附帶嘅影片(喺影片0:30嘅位置)。
硬件講解
呢個項目嘅主要組件包括ESP32微控制器、一個伺服摩打(SG90)同埋一個電位器。ESP32係一個功能強大嘅微控制器,內置Wi-Fi同藍牙,好適合用喺IoT項目。佢可以高精度咁控制各種設備,包括摩打。
SG90伺服摩打係一個好常用嘅組件,可以旋轉大約270度。佢係靠脈衝寬度調製(PWM)信號運作,旋轉角度係由發送畀佢嘅脈衝寬度決定。電位器就係一個可變電阻,可以調整發送畀ESP32嘅電壓,從而控制伺服摩打嘅位置。
數據手冊細節
| 製造商 | SG |
|---|---|
| 零件編號 | SG90 |
| 邏輯/IO電壓 | 3.3 V(ESP32) |
| 供電電壓 | 5 V |
| 輸出電流(每通道) | 1.2 A |
| 峰值電流(每通道) | 2.5 A |
| PWM頻率指引 | 50 Hz |
| 輸入邏輯閾值 | 0.2 V(低),2.5 V(高) |
| 電壓降 / RDS(on) / 飽和 | 0.5 V |
| 熱限制 | 最高85 °C |
| 封裝 | 塑膠 |
| 備註 / 變體 | 有唔同嘅齒輪類型可以揀 |
- 確保伺服摩打用合適嘅電壓(5V)供電。
- 將伺服摩打嘅接地連接到ESP32嘅接地,等佢哋有共同參考點。
- 用合適嘅PWM信號嚟控制伺服摩打嘅位置。
- 留意伺服摩打嘅電流需求;如果有需要,用外部電源供應。
- 接線嗰陣檢查針腳分配係咪正確,避免配置錯誤。
接線指示

要將伺服摩打同電位器接到ESP32,首先將伺服摩打嘅接地線(通常係黑色或者啡色)連接到ESP32嘅其中一個接地針腳。跟住,將伺服摩打嘅電源線(通常係紅色)連接到ESP32嘅5V針腳。最後,將伺服摩打嘅信號線(通常係橙色或者白色)連接到ESP32嘅25號針腳。
至於電位器,將其中一個外側針腳連接到ESP32嘅3.3V針腳,另一個外側針腳連接到接地。電位器嘅中間針腳就應該連接到ESP32嘅34號針腳。呢個設定可以令ESP32讀取電位器輸出嘅可變電壓,用嚟控制伺服摩打嘅位置。
代碼示例同講解
下面嘅代碼片段會初始化伺服摩打,並設定控制佢移動嘅參數:
#include
Servo myServo;
const int servoPin = 25;
const int minPulseWidth = 500; // 0.5 ms
const int maxPulseWidth = 2500; // 2.5 ms
void setup() {
myServo.attach(servoPin, minPulseWidth, maxPulseWidth);
myServo.setPeriodHertz(50); // 標準50Hz伺服摩打
}
喺呢段代碼入面,我哋引入咗ESP32Servo函式庫,並建立一個名為myServo嘅伺服摩打實例。我哋定義咗伺服摩打嘅針腳號碼,並設定咗對應伺服摩打角度限制嘅最小同最大脈衝寬度。
跟住,我哋睇吓一個不斷令伺服摩打來回移動嘅循環:
void loop() {
for (int angle = 0; angle <= 180; angle++) {
int pulseWidth = map(angle, 0, 180, minPulseWidth, maxPulseWidth);
myServo.writeMicroseconds(pulseWidth);
delay(15);
}
for (int angle = 180; angle >= 0; angle--) {
int pulseWidth = map(angle, 0, 180, minPulseWidth, maxPulseWidth);
myServo.writeMicroseconds(pulseWidth);
delay(15);
}
}
呢個循環會將角度由0度慢慢改到180度,然後再返返去0度,用map函數將角度轉換成對應嘅脈衝寬度畀伺服摩打。每次改變之後都會有短暫延遲,等伺服摩打可以順滑咁去到新位置。
示範 / 預期效果
當所有嘢接好晒,代碼又上載咗之後,你應該會見到伺服摩打由0度到180度順滑咁移動,然後再返返去。如果你調整電位器,伺服摩打應該會根據電位器提供嘅電壓反映新嘅位置。接線嗰陣要小心極性反轉,因為咁可能會整壞你嘅組件(喺影片3:45嘅位置)。
影片時間戳
- 00:00 開始
- 1:56 咩係伺服摩打
- 5:00 文件頁面
- 6:33 伺服摩打接線解釋
- 7:45 喺Arduino IDE入面為ESP32選擇COMP埠
- 9:27 Arduino程式碼解釋
- 14:31 用ESP32控制伺服摩打嘅示範
- 16:04 用5V以外嘅電源供電畀伺服摩打
- 18:47 唔用迴圈控制伺服摩打
- 20:15 用電位器控制伺服摩打
- 21:37 用電位器控制伺服摩打嘅Arduino程式碼解釋
#include <ESP32Servo.h>
// Define the servo and the pin it is connected to
Servo myServo;
const int servoPin = 25;
// Define the minimum and maximum pulse widths for the servo
const int minPulseWidth = 500; // 0.5 ms
const int maxPulseWidth = 2500; // 2.5 ms
void setup() {
// Attach the servo to the specified pin and set its pulse width range
myServo.attach(servoPin, minPulseWidth, maxPulseWidth);
// Set the PWM frequency for the servo
myServo.setPeriodHertz(50); // Standard 50Hz servo
}
void loop() {
// Rotate the servo from 0 to 180 degrees
for (int angle = 0; angle <= 180; angle++) {
int pulseWidth = map(angle, 0, 180, minPulseWidth, maxPulseWidth);
myServo.writeMicroseconds(pulseWidth);
delay(15);
}
// Rotate the servo from 180 to 0 degrees
for (int angle = 180; angle >= 0; angle--) {
int pulseWidth = map(angle, 0, 180, minPulseWidth, maxPulseWidth);
myServo.writeMicroseconds(pulseWidth);
delay(15);
}
}
Common Course Links
Common Course Files
資源與參考資料
-
文件记录ESP32 Tutorial 17/55 - SunFounder Servo motor documentationdocs.sunfounder.com
文件📁
数据表 (pdf)
-
DS5160 Servo motor datasheet
DS5160_datasheet.pdf0.33 MB
其他文件
-
Download SG90 datasheet (PDF)
robojax-servo-sg90_datasheet.pdf