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,首先将舵机的地线(通常为黑色或棕色)连接到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度,然后再返回,使用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>
// 定义伺服电机和它连接的引脚
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);
}
}
Common Course Links
Common Course Files
资源与参考
-
文档ESP32教程 17/55- SunFunder伺服电机文档docs.sunfounder.com
文件📁
数据手册 (pdf)
-
DS5160伺服电机数据表
DS5160_datasheet.pdf0.33 MB
其他文件
-
Download SG90 datasheet (PDF)
robojax-servo-sg90_datasheet.pdf