需要让电机转到精确位置、又不想要编码器反馈时,步进电机是最好的选择。今天的主角是 28BYJ-48——几乎人手一个的蓝色 4 相 5 线步进电机,配合自带的 ULN2003 驱动板,配合 Arduino 就能稳定实现准确定位。这篇把原理、接线、代码和最容易踩的「步数」坑一次性讲清楚。
为什么步进电机能定位而普通电机不行
步进电机把一整圈 360° 拆成成百上千个离散的「步」,你不发脉冲它不会乱转到别的角度,靠脉冲计数就能开环定位,不需要位置反馈。正是这个特性让它是 3D 打印机、CNC、机械臂关节的核心。28BYJ-48 是 5V 单极四相电机,内部带 64:1 的减速齿轮组,输出轴转一整圈实际需要 2048 步(半步模式),这是新手最容易搞错的地方——直接按电机本体参数去算会差 64 倍。
28BYJ-48 + ULN2003 接线
驱动板 ULN2003 里面是 7 组达林顿管,每路能灌 500mA,正好够这个电机绕组用。接线:把电机排针插进驱动板的插座(蓝色插头只能一个方向插),再把驱动板的 IN1、IN2、IN3、IN4 依次接到 Arduino 的数字引脚 8、9、10、11,VCC 接 5V、GND 接 GND。需要注意,电机转起来那路电流是多路叠加的,USB 口供电可能不够,稳妥起见用外部 5V 电源给驱动板单独供电并和 Arduino 共地。

用 Arduino 自带的 Stepper 库转起来
Arduino IDE 自带 Stepper 库,不用额外装。核心是把 STEPS_PER_REV 设成 2048(输出轴一圈的实际步数),speed 设成 10RPM 左右对这个蓝色小电机比较友好。注意构造函数里引脚顺序写 (2048, 8, 10, 9, 11),别照搬 (8,9,10,11) 直排,因为线圈相位顺序决定了转向合法性,顺序不对电机只会抖不动。
#include
const int STEPS_PER_REV=2048; // 输出轴一圈实际步数(含64:1减速)
const int mySpeed=10; // RPM,1~15 对这个电机较稳
Stepper myStepper(STEPS_PER_REV, 8, 10, 9, 11);
void setup(){ myStepper.setSpeed(mySpeed);}
void loop(){
myStepper.step(2048); // 正转一整圈
delay(1000);
myStepper.step(-2048); // 反转一整圈
delay(1000);
}
校准的关键:步数和方向
想让它转到指定角度,先实测输出轴一整圈要多少步,通常就是 2048(半步)或 1024(某些固件/批次按整步)。把实测值写进 STEPS_PER_REV,角度和步数就能换算:角度/360 × 一圈步数 = 该转的步数。转向不对就调换任意两相的顺序或把 step() 参数取负,很快就能转到位。
进阶方向
28BYJ-48 扭矩不大但胜在便宜稳定,适合云台、小车转向、小机械臂这类轻负载定位。后续想带更重的负载,可以换 42 步进电机配 A4988/TMC2208 驱动;想做闭环,再加编码器。先把这个蓝色小电机玩明白,步进定位的思路就通了。
本篇为实操改写整理,接线和步数以实际批次调节为准。







收藏了,等 3D 打印件到了就做个小机械臂。
把代码里的 STEPS 改成 2048 之后瞬间就稳了,感谢。
请教一下,电源它 0.15A 一个,多个电机是不是得单独供电?
做云台用它很合适,定位准还不怕堵转烧电机,比普通直流香。
2048 步一圈这个坑我自己踩过,餐后转不到位就是步数没乘 64 减速比,文章点得清楚。