Arduino - 步进电机
Arduino - 高级步进电机控制
Section titled “Arduino - 高级步进电机控制”步进电机是一种无刷直流电机,它将整个旋转分解为若干个相等的步进。这使得对其位置的控制极其精确,使其成为3D打印机、CNC机床和机器人等需要精确运动的应用的理想选择。
与持续旋转的标准直流电机不同,步进电机以离散的增量或“步进”移动。您通过告诉它要移动多少步以及哪个方向来控制它。
适合初学者的现代组件
Section titled “适合初学者的现代组件”虽然存在许多步进电机配置,但最常见且对初学者友好的设置是使用28BYJ-48单极步进电机和ULN2003驱动板。这种组合价格低廉、易于获取,并且易于与Arduino连接。
- 1 × Arduino UNO (或任何兼容开发板)
- 1 × 28BYJ-48 步进电机
- 1 × ULN2003 驱动板 (随电机附带)
- 跳线
- 可选:一个5V外部电源,用于电机供电,以避免从Arduino的5V引脚抽取过多电流,这是一个最佳实践。
ULN2003驱动板接线
Section titled “ULN2003驱动板接线”请仔细遵循此接线指南。28BYJ-48电机的连接器带有键槽,只能以一种方式插入ULN2003板。
ULN2003 Driver Board | Arduino UNO-----------------------|----------------IN1 | Pin 8IN2 | Pin 9IN3 | Pin 10IN4 | 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:AccelStepper库简介
Section titled “超越Stepper.h:AccelStepper库简介”内置的<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()中重复调用它。它会检查是否需要步进,如果需要,则为正确的电机线圈通电。因为它运行并很快返回,所以不会阻塞您循环中的其他代码。
下一步与其它驱动器类型
Section titled “下一步与其它驱动器类型”为了获得更大的功率和更高的精度,特别是对于双极步进电机(有4根线),您会希望使用更高级的驱动器:
- A4988 / DRV8825:这些是单芯片微步驱动器,在3D打印机和小型CNC机床中非常流行。它们只需要Arduino的两个引脚(
STEP和DIR),并在内部处理所有复杂的线圈切换。它们还支持“微步进”,可以提供更平滑、更安静的运动。