Skip to content

Arduino - 步进电机

步进电机是一种无刷直流电机,它将整个旋转分解为若干个相等的步进。这使得对其位置的控制极其精确,使其成为3D打印机、CNC机床和机器人等需要精确运动的应用的理想选择。

与持续旋转的标准直流电机不同,步进电机以离散的增量或“步进”移动。您通过告诉它要移动多少步以及哪个方向来控制它。

虽然存在许多步进电机配置,但最常见且对初学者友好的设置是使用28BYJ-48单极步进电机和ULN2003驱动板。这种组合价格低廉、易于获取,并且易于与Arduino连接。

  • 1 × Arduino UNO (或任何兼容开发板)
  • 1 × 28BYJ-48 步进电机
  • 1 × ULN2003 驱动板 (随电机附带)
  • 跳线
  • 可选:一个5V外部电源,用于电机供电,以避免从Arduino的5V引脚抽取过多电流,这是一个最佳实践。

请仔细遵循此接线指南。28BYJ-48电机的连接器带有键槽,只能以一种方式插入ULN2003板。

ULN2003 Driver Board | Arduino UNO
-----------------------|----------------
IN1 | Pin 8
IN2 | Pin 9
IN3 | Pin 10
IN4 | Pin 11
ULN2003 Driver Board | Power Source
-----------------------|----------------
+ (5V-12V) | Arduino 5V Pin (or external 5V +)
- (GND) | Arduino GND Pin (and external 5V GND)

重要提示:ULN2003驱动板带有一个跳线帽。如果您从与逻辑电路相同的电源(例如,Arduino的5V引脚)为电机供电,请保持跳线帽连接。如果您使用单独的、更高电压的外部电源为电机供电,请取下跳线帽。

内置的<Stepper.h>库功能齐全,但有一个主要缺点:它使用delay()函数进行运动,这会阻塞您的整个程序。当电机移动时,您的Arduino无法执行其他任何操作,例如读取传感器或检查按钮按下情况。

一个更强大、更现代的替代方案是**AccelStepper库**。它支持非阻塞控制、加速和减速,使您的电机能够平稳启动和停止,同时您的loop()函数可以自由运行。您需要通过Arduino IDE的库管理器(草图 > 导入库 > 管理库...并搜索“AccelStepper”)来安装它。

使用AccelStepper的非阻塞控制示例

Section titled “使用AccelStepper的非阻塞控制示例”
#include <AccelStepper.h>
// 定义步进电机连接和电机接口类型
#define MOTOR_INTERFACE_TYPE 4 // 对于ULN2003驱动器,使用4引脚半步模式
#define MOTOR_PIN_1 8
#define MOTOR_PIN_2 9
#define MOTOR_PIN_3 10
#define MOTOR_PIN_4 11
// 使用引脚连接初始化步进库
// 请注意,28BYJ-48的引脚顺序通常是1-3-2-4(IN1, IN3, IN2, IN4)
AccelStepper myStepper(MOTOR_INTERFACE_TYPE, MOTOR_PIN_1, MOTOR_PIN_3, MOTOR_PIN_2, MOTOR_PIN_4);
void setup() {
// 设置最大速度和加速度。
// 这些值将取决于您的电机和电源。
myStepper.setMaxSpeed(1000); // 每秒步数
myStepper.setAcceleration(500); // 每秒平方步数
// 将电机移动到起始位置
myStepper.moveTo(2048); // 2048步约等于28BYJ-48的半圈转动
}
void loop() {
// 这是非阻塞控制的核心。
// run()检查是否需要步进电机,并在需要时执行一步。
// 必须在loop中尽可能频繁地调用它。
if (myStepper.distanceToGo() == 0) {
// 如果电机已达到目标,则设置新目标。
// 这将使其持续来回移动。
// -myStepper.currentPosition() 计算将目标设置为当前位置的负值。
myStepper.moveTo(-myStepper.currentPosition());
}
// 这就是魔法!这行代码移动电机。
myStepper.run();
// 您可以在这里做其他事情,电机将继续移动!
// 例如,您可以读取传感器或打印到串口。
}
  • AccelStepper(type, p1, p3, p2, p4):我们初始化步进器对象。4表示一个4引脚驱动器。引脚顺序(8, 10, 9, 11)对于28BYJ-48电机正确旋转至关重要。
  • setMaxSpeed()和setAcceleration():这些方法定义了电机的性能配置文件,允许平稳的启动和停止。
  • moveTo(position):为电机设置一个目标绝对位置。它不会阻塞代码;它只是告诉库要去哪里。
  • run():这是最重要的函数。您必须在loop()中重复调用它。它会检查是否需要步进,如果需要,则为正确的电机线圈通电。因为它运行并很快返回,所以不会阻塞您循环中的其他代码。

为了获得更大的功率和更高的精度,特别是对于双极步进电机(有4根线),您会希望使用更高级的驱动器:

  • A4988 / DRV8825:这些是单芯片微步驱动器,在3D打印机和小型CNC机床中非常流行。它们只需要Arduino的两个引脚(STEP和DIR),并在内部处理所有复杂的线圈切换。它们还支持“微步进”,可以提供更平滑、更安静的运动。