ESP32驱动28BYJ-48:2048步一圈的接线与代码

2026-10-28 20:09:38 12阅读

桌面机械臂最难受的一件事:舵机能转、能停,但你想让它稳稳停在第 37 度,它总多走一点。换成步进电机就老实了,它靠脉冲一步一步走格子,说好 2048 步转一圈,就是一圈,断电了还自己保持位置。这篇讲最便宜的那套组合怎么跑起来:ESP32、28BYJ-48 步进电机、ULN2003 驱动板,接线和代码都照着官方示例来。

ESP32开发板与28BYJ-48步进电机、ULN2003驱动板接线实拍

一、这颗电机凭什么进桌面机械臂

28BYJ-48 是套件里最常见的减速步进电机,单买几块钱一颗,通常和 ULN2003 驱动板打包卖。按厂商数据手册的口径:额定电压 5V 直流,4 相,减速比 1/64,步距角 5.625°/64,工作频率 100Hz。

两颗28BYJ-48步进电机实物

翻译成人话:电机内部半步模式走 64 步转一圈,但输出轴前面挂了一组 64:1 的齿轮,外面这根轴转一圈,里面已经转了 64 圈,也就是 32×64=2048 步,折算每步 0.18°。这个精度对桌面转台、摄像头云台、机械臂夹爪的转轴、小车上的传感器转塔都够用。

它有两个天生的短板,先摆清楚:一是慢,5V 供电下每分钟十几转,想一秒内大角度摆动它做不到;二是扭矩小,只能带几百克的负载。所以它适合当"精确定位的慢轴",不适合当"扛重量的快轴"。

二、四个线圈四根线,靠轮流通电走步

28BYJ-48 内部是四个线圈,公共端并到红线上接 5V,另外四根分别是蓝、粉、黄、橙。按固定顺序给这四根线轮流通电,转子就被一步一步吸着走,反过来通电顺序它就反转。

28BYJ-48步进电机内部四相线圈接线原理图

四相的顺序不能随便换。驱动库里给引脚传参时,顺序是 IN1、IN3、IN2、IN4 而不是顺着 1、2、3、4 来,就是因为电机内部绕组的物理排布是这样。顺序错了,最典型的现象是电机原地抖动、发热,轴一点不转——很多人以为是电机坏了,其实是接线顺序问题。

三、ULN2003 这块小板是干什么的

ESP32 的 GPIO 只能输出 3.3V、十几毫安,直接去推电机线圈不现实。ULN2003 是七路达林顿管阵列,做成模块后就是一块带白色插座的小板:插座直接插电机那五根线,四颗 LED 对应四个线圈的通断状态,一眼就能看出程序有没有在输出。

ULN2003步进电机驱动板模块正面实物

引脚就六个:IN1 到 IN4 接单片机的数字脚,VCC 给电机供电,GND 共地。板子上那个跳线帽相当于电源开关,拔掉电机就断电,想接物理急停开关可以从这里引线。

这里有个新手必踩的坑:VCC 要接外部 5V,别从 ESP32 的 3.3V 或者板载 5V 脚取电。电机启动瞬间的电流会把电压拉塌,表现就是 ESP32 反复重启、串口一直掉线,看着像程序问题,实际是供电问题。

四、接线:四根信号线落到哪几个 GPIO

示例用的是 GPIO 19、18、5、17 对应 IN1 到 IN4,这几个脚在 ESP32 上都是普通数字口,没有特殊占用,换成别的可用 GPIO 也行,代码里改宏定义就行。

ESP32与ULN2003驱动板、28BYJ-48步进电机接线示意图

接线表:IN1→GPIO19,IN2→GPIO18,IN3→GPIO5,IN4→GPIO17;驱动板 VCC→外部 5V 正极,GND→外部 5V 负极,同时和 ESP32 的 GND 连一起。共地这一步不能省,不共地会出现"LED 会闪、电机不转"的怪现象。

五、代码:Stepper 库,一圈 2048 步

Arduino IDE 自带 Stepper 库,不用额外安装。下面是官方示例的完整代码,除了头文件按本站入库规则换成引号形式(引号形式同样会搜索系统库路径,编译等价),其余一个字符没动:

/*
  Rui Santos & Sara Santos - Random Nerd Tutorials
  Complete project details at https://RandomNerdTutorials.com/esp32-stepper-motor-28byj-48-uln2003/
  Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files.
  The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
  Based on Stepper Motor Control - one revolution by Tom Igoe
*/
#include "Stepper.h"

const int stepsPerRevolution = 2048;  // change this to fit the number of steps per revolution

// ULN2003 Motor Driver Pins
#define IN1 19
#define IN2 18
#define IN3 5
#define IN4 17

// initialize the stepper library
Stepper myStepper(stepsPerRevolution, IN1, IN3, IN2, IN4);

void setup() {
  // set the speed at 5 rpm
  myStepper.setSpeed(5);
  // initialize the serial port
  Serial.begin(115200);
}

void loop() {
  // step one revolution in one direction:
  Serial.println("clockwise");
  myStepper.step(stepsPerRevolution);
  delay(1000);

  // step one revolution in the other direction:
  Serial.println("counterclockwise");
  myStepper.step(-stepsPerRevolution);
  delay(1000);
}

逐段说。stepsPerRevolution 写 2048,是这颗电机减速后的真实步数,换别的电机就照数据手册改这个值。引脚顺序传 IN1、IN3、IN2、IN4,理由上面说过了。setSpeed(5) 是每分钟 5 转,单位 rpm。loop 里正转一圈、停一秒、反转一圈、停一秒,负号表示反方向。

串口波特率设到 115200,打开串口监视器能看到 clockwise 和 counterclockwise 交替打印,配合驱动板上四颗 LED 的亮灭顺序,程序有没有在跑、线圈有没有在通断,肉眼就能确认,这一步比拿万用表量省事。

六、跑起来之后一定会遇到的两个坑

第一个坑是速度。setSpeed 的数值越大转得越快,但这颗是减速电机,硬提速会丢步:你让它转一圈 2048 步,实际只走了 1900 步,每次回原点位置都差一点,跑十几圈就偏出去一大截。要快又要准,得换 AccelStepper 库做加减速,初始化写法是:

AccelStepper stepper (AccelStepper::FULL4WIRE, 19, 5, 18, 17);

注意这里引脚顺序是 19、5、18、17,和 Stepper 库的写法不同,两个库对相序的约定不一样,别直接照搬。

第二个坑是阻塞。Stepper 库的 step() 是死等,转一圈那一两秒里程序什么都干不了。要同时读传感器、跑 WiFi、控第二个轴,就得换 AccelStepper 的非阻塞 run() 循环,让每个循环只走一小步。

第三个坑是发热。28BYJ-48 长时间通电保持位置会温热,正常;但如果烫手到摸不住,多半是供电电压超了或者相序接错在死磕,先断电查线。

七、什么时候该换电机

要做能搬东西的机械臂关节、要一秒内完成大角度摆动的云台、要安静的室内设备,这颗电机都不合适,该上 NEMA17 配 A4988 或者 TMC2209 那类带细分和恒流控制的驱动器。28BYJ-48 的定位很清楚:预算几十块、负载几百克、速度不着急的转轴,它是入门性价比最高的选择。

我一般建议先拿它把"步数—角度—回原点"这套逻辑跑通,再换大电机。步进电机的控制逻辑是通用的,换电机主要就是改 stepsPerRevolution 和接线,代码框架不用重写,这一步练熟比直接上贵电机省事得多。


作者:固件烧录仔
链接:https://www.aiddithome.com/p/12459a6b34072e.html
本作版权归作者所有,未经允许请勿转载。若存在违规行为,您可以点击 “举报”。


登录 后发表评论
4条评论
触底反弹的Tony
1楼 · 9小时前

上周刚用这套给摄像头云台做俯仰,最坑的是我一开始没共地,LED 闪得挺欢电机一动不动,查了一晚上

板砖搬不动
2楼 · 9小时前

2048 步这个数坑过不少人,我照 4096 写结果只转半圈,后来才搞明白是半步和整步的差别

调参到凌晨
3楼 · 9小时前

供电别省,我从板子 5V 取电直接反复重启,换独立 5V 电源就稳了

刷视频进来围观
4楼 · 9小时前

想问下换 12V 的 NEMA17 是不是必须换驱动?这颗扭矩做夹爪勉强够用