项目概述
本项目基于零知派ESP32开发了一套完整的步进电机智能控制系统,通过电位器实现精确的速度控制,按键控制方向切换,并配备1.3寸TFT显示屏实时显示系统状态。系统采用ULN2003AN驱动芯片控制28BYJ-48步进电机,实现了平滑的速度调节和精准的位置控制。
项目亮点
① 自动识别电位器有效电压范围(3.4V-4.0V),实现线性速度映射
② 采用状态机设计,确保按键响应稳定可靠
③ 1.3寸TFT显示屏提供丰富的状态信息显示
④ 指数曲线速度映射算法,低速控制更精准
项目难点及解决方案
问题描述:电位器在3.4-4.0V范围内电机才转动
解决方案:
实现电压范围重新映射算法,通过校准参数自适应不同电位器特性
问题描述:28BYJ-48步进电机在低速时扭矩不足
解决方案:
设置最小启动速度(MIN_SPEED),并采用指数曲线速度映射
一、硬件系统设计
1.1 器件清单
| 规格型号 | 数量 | 备注 |
|---|---|---|
| 零知派ESP32 | 1 | 零知派ESP32-WROOM-32 |
| 28BYJ-48 | 1 | 5V减速步进电机 |
| ULN2003AN驱动板 | 1 | 达林顿管阵列驱动 |
| 1.3寸TFT LCD (ST7789) | 1 | 240×240分辨率 |
| 10KΩ旋转电位器 | 1 | 线性电位器 |
| 6×6mm轻触开关 | 1 | 常开型 |
| 杜邦线 | 若干 | 母对母、母对公 |
| 零知派ESP32扩展板 | 1 | 零知派ESP32通用扩展板 |
1.2 接线方案
根据代码定义进行以下接线操作、如需定义为其他引脚请自行修改代码:
(1)电机驱动部分接线
| 零知派ESP32引脚 | ULN2003AN驱动板 | 28BYJ-48步进电机 | 功能 |
|---|---|---|---|
| 33 | IN1 | / | 电机控制 |
| 25 | IN2 | / | 电机控制 |
| 26 | IN3 | / | 电机控制 |
| 27 | IN4 | / | 电机控制 |
| / | 排线连接 | 排线连接 | 电机驱动 |
| 5V(外部) | + | / | 电机电源 |
| GND | - | / | 电机地线 |
(2)ST7789显示屏接线
| 零知派ESP32引脚 | ST7789引脚 | 功能 |
|---|---|---|
| 3.3V | VCC | 电源 |
| GND | GND | 地 |
| 15 | CS | 片选 |
| 13 | DC | 数据/命令控制 |
| 4 | RES | 复位 |
| 23 | SDA | SPI数据线 |
| 18 | SCL | SPI时钟线 |
(3)电机操作部分接线
| 零知派增强板引脚 | 电位器 | 按键 | 功能 |
|---|---|---|---|
| 5V | 左侧引脚 | / | 供电 |
| GND | 右侧引脚 | / | 地线 |
| 34 | 中间引脚 | / | 信号输入 |
| 12 | / | 高电平一端 | 信号输入,内部上拉 |
ps:电机需要消耗大量电力,最好直接从外部 5V 电源供电
1.3 硬件连接图

1.4 实物接线图

二、软件架构设计
2.1 库文件及初始化
cpp
// 主要库文件引入
#include <Stepper.h>
#include <TFT_eSPI.h>
#define BUTTON_PIN 12 // 按键引脚(内部上拉)
#define POT_PIN 34 // 电位器模拟输入
2.2 电压校准算法
cpp
// 电压校准参数 - 关键创新点
#define POT_MIN_VOLTAGE 3.4 // 电机启动最小电压
#define POT_MAX_VOLTAGE 4.0 // 电机最大速度电压
2.3 状态机按键处理
cpp
// 按键状态枚举
enum ButtonState { IDLE, PRESSED, DEBOUNCING };
ButtonState buttonState = IDLE;
void handleButton() {
int reading = digitalRead(BUTTON_PIN);
switch (buttonState) {
case IDLE:
if (reading== LOW) {
buttonState = DEBOUNCING;
lastButtonTime = millis();
}
break;
// ... 状态处理逻辑
}
}
2.4 电位器模拟值处理
cpp
void handlePotentiometer() {
int potValue = analogRead(POT_PIN);
if (abs(potValue - lastPotValue) > 5) {
lastPotValue = potValue;
// 线性映射到 0~15 RPM
targetSpeed = map(potValue, 0, ADC_RESOLUTION, MIN_SPEED, MAX_SPEED);
targetSpeed = constrain(targetSpeed, MIN_SPEED, MAX_SPEED);
// 速度变化时立即更新 Stepper
if (targetSpeed != currentSpeed) {
currentSpeed = targetSpeed;
if (currentSpeed > 0) {
myStepper.setSpeed(currentSpeed);
}
updateSpeedDisplay();
if (DEBUG_MODE) {
Serial.print("Speed: "); Serial.print(currentSpeed); Serial.println(" RPM");
}
}
}
}
如图所示,步进电机控制系统的工作流程图
三、操作过程及展示
3.1 系统连接
将ULN2003AN驱动板接入5~12V外部电源,连接28BYJ-48电机到驱动板输出端,按照接线表连接零知派ESP32开发板与各模块,确保所有电源正确连接后上电
3.2 校准测试
(1)开源平台-输入 步进电机 并搜索-代码下载自动打开

(2)连接-验证-上传

(3)旋转电位器,观察电机响应
(4)根据实际电压范围调整校准参数

(5)测试按键功能,确认方向切换正常
3.3 视频演示验证
ESP32驱动28BYJ-48步进电机控制系统
缓慢旋转电位器,观察速度线性增加。按下按键,验证方向切换功能。电位器逆时针旋转到底,确认电机停止
四、控制系统模块详解
4.1 ULN2003AN驱动芯片
(1)功能说明
ULN2003AN是高压大电流达林顿晶体管阵列,包含7个NPN达林顿对管,每个可驱动500mA和50V负载。在本项目中用于驱动28BYJ-48步进电机的四相绕组。

该板具有四个控制输入接口和一个电源接口,还配备了一个与电机连接器相兼容的 Molex 连接器,可直接插入电机。同时,板上设有四个 LED,用于显示四条控制输入线上的活动状态,并且带有一个开 / 关跳线,以便在需要时禁用步进电机。
(2)工作流程
接收MCU发出的控制信号、通过达林顿管放大电流、驱动步进电机各相绕组、提供反向电动势保护二极管
4.2 28BYJ-48步进电机
(1)工作原理
基于齿轮与电磁铁的协同作用,通过一次推动轮子一个 "步" 来实现运动

向线圈发送高脉冲时,线圈会通电,进而吸引最靠近齿轮的齿,使电机以精确且固定的角度增量(即步长)旋转。其 360 度旋转的步数取决于齿轮上的齿数
(2)引脚排列
28BYJ-48 步进电机有五根线。引脚排列如下:

28BYJ-48 包含两个线圈,每个线圈都设有一个中心抽头,这两个中心抽头在电机内部相连,并通过红线引出。
而线圈的一端与中心抽头共同构成一相,所以 28BYJ-48 总共有四相:

红线始终拉高,因此当另一根引线拉低时,该相通电。
仅当各相按称为步进顺序的逻辑顺序通电时,步进电机才会旋转。
(3)齿轮减速比
依据数据表,28BYJ-48 步进电机在全步模式下运行时,每一步对应的旋转角度为 11.25°,由此可算出每完成 360° 旋转需要 32 步(360°÷11.25°=32)

该电机配备了 1/64 的减速齿轮组(实际减速比为 1/63.68395,不过在多数情况下,1/64 的近似值已能满足需求)。
这也就意味着,电机实际完成一圈旋转需要约 2038 步(32 步 / 转 ×63.68395≈2037.8864 步,近似为 2038 步)。
(4)能量消耗
28BYJ-48 步进电机的典型电流消耗约为 240mA。
由于其耗电量较大,因此建议直接采用外部 5V 电源供电,而非通过 零知派ESP32开发板供电。
需要注意的是,即便处于静止状态,该电机也会消耗功率以维持当前位置。
(5)技术规格
|-------|-------------------|
| 工作电压 | 5VDC |
| 工作电流 | 240mA(典型值) |
| 相数 | 4 |
| 齿轮减速比 | 64:1 |
| 步距角 | 5.625°/64 |
| 频率 | 100赫兹 |
| 牵引扭矩 | >34.3mN.m(120Hz) |
| 自定位扭矩 | >34.3mN.m |
| 摩擦力矩 | 600-1200 克力·厘米 |
| 拉入扭矩 | 300 克力.厘米 |
五、常见问题解答
Q1: 电位器控制不线性如何调整?
A:修改代码中的
POT_MIN_VOLTAGE和POT_MAX_VOLTAGE参数,匹配实际电压范围。
Q2: 显示屏显示异常怎么办?
A:检查SPI接线是否正确,确认CS、DC、RST引脚定义与代码一致。
Q3: 按键无响应如何解决?
A:确认按键是否正确连接到GND和引脚12,检查内部上拉电阻是否启用。
Q4: 电机振动大且噪音明显?
A:降低MAX_SPEED值,或增加加速度参数,使速度变化更平滑。
项目资源:
步进电机数据表: 28BYJ-48 数据表