搜索代码

ESP32 教程 17/55 - 使用 ESP32 和电位器控制舵机 - ESP32 物联网学习套件

ESP32 教程 17/55 - 使用 ESP32 和电位器控制舵机 - ESP32 物联网学习套件

在本教程中,我们将学习如何使用SunFounder的ESP32 IoT学习套件中的ESP32微控制器和电位器来控制舵机。通过本项目的学习,您将能够使用电位器平滑地调节舵机的角度,实现精确控制。这是探索ESP32功能及其与电机交互方式的绝佳途径。

当我们深入细节时,我们将介绍必要的硬件组件、接线说明和代码示例,以帮助您完成所有设置。如需更直观的展示,请务必观看本教程附带的视频(视频中0:30处)。

硬件说明

本项目的主要组件包括ESP32微控制器、舵机(SG90)和电位器。ESP32是一款功能强大的微控制器,内置Wi-Fi和蓝牙,非常适合物联网项目。它能够高精度地控制包括电机在内的各种设备。

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度,然后再返回,使用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>

 // 定义伺服电机和它连接的引脚
Servo myServo;
const int servoPin = 25;

 // 定义伺服的最小和最大脉冲宽度
const int minPulseWidth = 500; // 0.5 毫秒
const int maxPulseWidth = 2500; // 2.5毫秒

void setup() {
 // 将舵机连接到指定引脚,并设置其脉冲宽度范围。
  myServo.attach(servoPin, minPulseWidth, maxPulseWidth);

 // 设置伺服电机的PWM频率
  myServo.setPeriodHertz(50); // 标准50Hz伺服
}

void loop() {
 // 将伺服电机从0度旋转到180度
  for (int angle = 0; angle <= 180; angle++) {
    int pulseWidth = map(angle, 0, 180, minPulseWidth, maxPulseWidth);
    myServo.writeMicroseconds(pulseWidth);
    delay(15);
  }

 // 将伺服电机从180度旋转到0度
  for (int angle = 180; angle >= 0; angle--) {
    int pulseWidth = map(angle, 0, 180, minPulseWidth, maxPulseWidth);
    myServo.writeMicroseconds(pulseWidth);
    delay(15);
  }
}

文件📁

数据手册 (pdf)

其他文件