Arduino舵机速度控制:如何降低舵机140°与159°之间切换的运行速度
解决方案
核心原理
你原有代码直接把目标角度一次性赋值给舵机,舵机默认会以硬件支持的最快速度跳转角度。要实现慢转,只需要把角度跳转改成逐度步进+每步添加短延时的逻辑即可。
具体修改步骤
- 新增转速控制常量,数值越大舵机转动速度越慢,可根据需求自行调整
- 新增舵机平滑转动专用函数,实现从当前角度逐步过渡到目标角度的逻辑
- 替换原有直接给舵机写角度的代码,改为调用平滑转动函数
修改后完整代码
#include <Servo.h> const int TOUCH_SENSOR_PIN = 6; // 触摸传感器1引脚 const int TOUCH_SENSOR_PIN2 = 7; // 触摸传感器2引脚 const int SERVO_PIN = 9; // 舵机信号引脚 const int SERVO_DELAY = 15; // 舵机每步转动延时,单位毫秒,数值越大转得越慢 Servo servo; // 舵机控制对象 // 变量定义 int angle = 140; // 舵机当前角度 int lastTouchState; // 触摸传感器1上一次状态 int currentTouchState; // 触摸传感器1当前状态 int lastTouchState2; // 触摸传感器2上一次状态 int currentTouchState2; // 触摸传感器2当前状态 // 舵机平滑转动函数:输入目标角度,自动从当前角度慢转到目标角度 void servoWriteSlow(int targetAngle) { int currentAngle = servo.read(); // 读取舵机当前实际角度 if (targetAngle > currentAngle) { // 角度递增的情况 for (int i = currentAngle; i <= targetAngle; i++) { servo.write(i); delay(SERVO_DELAY); } } else if (targetAngle < currentAngle) { // 角度递减的情况 for (int i = currentAngle; i >= targetAngle; i--) { servo.write(i); delay(SERVO_DELAY); } } angle = targetAngle; // 更新全局角度变量 } void setup() { Serial.begin(9600); pinMode(TOUCH_SENSOR_PIN, INPUT); pinMode(TOUCH_SENSOR_PIN2, INPUT); servo.attach(SERVO_PIN); servo.write(angle); currentTouchState = digitalRead(TOUCH_SENSOR_PIN); currentTouchState2 = digitalRead(TOUCH_SENSOR_PIN2); } void loop() { lastTouchState = currentTouchState; currentTouchState = digitalRead(TOUCH_SENSOR_PIN); lastTouchState2 = currentTouchState2; currentTouchState2 = digitalRead(TOUCH_SENSOR_PIN2); if((lastTouchState == LOW && currentTouchState == HIGH) || (lastTouchState2 == LOW && currentTouchState2 == HIGH)) { int targetAngle; if(angle == 140) { targetAngle = 159; } else if(angle == 159) { targetAngle = 140; } // 调用慢转函数替代原来的直接写角度 servoWriteSlow(targetAngle); } }
速度调整方法
修改常量SERVO_DELAY的数值即可调整转速:
- 数值越大,每步转动间隔越长,整体转动速度越慢,比如设置为20时转动速度会比15更慢
- 数值越小,每步转动间隔越短,整体转动速度越快,最小可设置为1(和默认最快速度接近)
内容的提问来源于stack exchange,提问作者Filip GG
相关产品推荐
相关产品推荐

