如何为Arduino步进电机代码添加双按键手动控制功能
Arduino Uno 步进电机按键控制合并方案
硬件连接确认
- 按键1 → 引脚8,按键2 → 引脚9(使用内部上拉输入)
- 步进电机:DIR+→引脚3,EN+→引脚4,PUL+→引脚5
合并后的完整可运行代码
#include <Stepper.h> // 步进电机配置(沿用原代码参数) const int stepsPerRevolution = 25600; Stepper myStepper(stepsPerRevolution, 3, 4); // 按键与使能引脚定义 const int switchForward = 8; // 正转按键 const int switchReverse = 9; // 反转按键 const int enPin = 5; // 按键消抖变量 int lastForwardState = HIGH; int lastReverseState = HIGH; unsigned long lastDebounceTime = 0; const unsigned long debounceDelay = 50; void setup() { Serial.begin(9600); myStepper.setSpeed(100); // 配置按键为内部上拉输入 pinMode(switchForward, INPUT_PULLUP); pinMode(switchReverse, INPUT_PULLUP); // 使能电机(低电平有效) pinMode(enPin, OUTPUT); digitalWrite(enPin, LOW); } void loop() { int currentForwardState = digitalRead(switchForward); int currentReverseState = digitalRead(switchReverse); unsigned long currentMillis = millis(); // 处理正转按键 if (currentForwardState != lastForwardState) { lastDebounceTime = currentMillis; } if ((currentMillis - lastDebounceTime) > debounceDelay) { if (currentForwardState != lastForwardState) { if (currentForwardState == LOW) { Serial.println("顺时针旋转一圈"); myStepper.step(stepsPerRevolution); } lastForwardState = currentForwardState; } } // 处理反转按键 if (currentReverseState != lastReverseState) { lastDebounceTime = currentMillis; } if ((currentMillis - lastDebounceTime) > debounceDelay) { if (currentReverseState != lastReverseState) { if (currentReverseState == LOW) { Serial.println("逆时针旋转一圈"); myStepper.step(-stepsPerRevolution); } lastReverseState = currentReverseState; } } }
核心修改说明
- 保留原
Stepper库驱动逻辑,确保电机转动稳定性与原代码一致 - 用软件消抖解决按键机械抖动问题,避免误触发
- 采用
INPUT_PULLUP模式,无需外接上拉电阻,简化硬件连接 - 按键触发逻辑:按下对应按键,电机完成一圈指定方向旋转,松开无动作
- 电机使能引脚持续低电平,保证电机处于可运行状态
内容的提问来源于stack exchange,提问作者Iceman SA
相关产品推荐
相关产品推荐

