Arduino实现按钮未按下时舵机反转的代码调试求助
功能需求
- 按钮按下时舵机正向转动
- 按钮未按下(松开状态)时舵机自动反转回退到初始位置
原有代码存在的问题
- 缺少
#include <Servo.h>头文件引用,代码无法通过编译 - 嵌套
while循环会造成程序阻塞:内层检测按钮松开状态的while循环会一直占用运行资源,只要按钮松开就会反复翻转angleStep的符号,完全无法正常执行舵机控制逻辑 - 未设置舵机角度边界:角度累加/递减过程中会超出舵机0~180度的正常工作范围,容易造成舵机堵转损坏
- 未设置回退停止位置:反转时没有终止判断逻辑,舵机会一直转到角度极限才停止,不符合回退到初始位置的需求
- 上电时未做舵机位置初始化,开机后舵机初始位置不确定
修正后可直接运行的代码
#include <Servo.h> Servo myservo; const int servoPin = 9; const int pushButtonPin = 2; // 舵机初始位置角度 const int startAngle = 25; // 舵机正转最大角度,可根据实际安装需求调整 const int maxAngle = 155; // 舵机每次转动的角度步长 const int angleStep = 5; // 舵机当前角度 int currentAngle = startAngle; void setup() { Serial.begin(9600); myservo.attach(servoPin); pinMode(pushButtonPin, INPUT_PULLUP); // 上电后先将舵机复位到初始位置 myservo.write(currentAngle); delay(100); } void loop() { int buttonState = digitalRead(pushButtonPin); if (buttonState == LOW) { // 按钮按下状态:角度累加正转,不超过设定的最大角度 currentAngle = min(currentAngle + angleStep, maxAngle); } else { // 按钮松开状态:角度递减回退,不低于初始位置角度 currentAngle = max(currentAngle - angleStep, startAngle); } myservo.write(currentAngle); // 调整该延时值可改变舵机转动速度,数值越大转动越慢 delay(30); }
使用说明
- 所有可调参数都定义在代码顶部,需要调整初始位置、最大转动角度、转动速度、步长直接修改对应常量即可,不需要改动主逻辑
- 代码移除了会造成阻塞的嵌套循环,每次主循环仅更新一次角度,运行逻辑流畅不会卡死
- 内置角度边界保护,舵机转到最大位置或回到初始位置后会自动停止,不会出现堵转烧机的问题
- 接线保持原有方式即可:舵机信号脚接9号引脚,按钮一端接2号引脚、另一端接GND(因为启用了内部上拉,不需要额外外接上拉电阻)
内容的提问来源于stack exchange,提问作者Dash
相关产品推荐
相关产品推荐

