You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.03 10:24:12