搜尋程式碼

ESP32 教學 17/55 - 使用 ESP32 同電位器控制伺服馬達 - ESP32 IoT 學習套件

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-17-Sevo_motor-wiring

要將伺服摩打同電位器接到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嘅伺服摩打實例。我哋定義咗伺服摩打嘅針腳號碼,並設定咗對應伺服摩打角度限制嘅最小同最大脈衝寬度。

ESP32_servo_lib

跟住,我哋睇吓一個不斷令伺服摩打來回移動嘅循環:

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程式碼解釋

圖片

ESP32-17-Sevo_motor-schematic
ESP32-17-Sevo_motor-schematic
ESP32-17-Sevo_motor-wiring
ESP32-17-Sevo_motor-wiring
ESP32_servo_lib
ESP32_servo_lib
816-ESP32 Tutorial 17/55- Arduino code for controling servo motor
語言: C++
#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);
  }
}

文件📁

数据表 (pdf)

其他文件