如何修改代码实现模拟摇杆输入控制舵机转动速度而非目标位置
代码修改方案
你需要新增全局变量存储舵机当前角度,同时增加摇杆死区避免回中时舵机抖动,实现逻辑如下:
全局变量定义
在setup()函数外新增如下变量:
// 存储舵机当前角度,初始值可设为中位90 int currentServoAngle = 90; // 摇杆死区范围,避免回中时舵机误动 const int JOY_DEADZONE_LOW = 480; const int JOY_DEADZONE_HIGH = 544; // 最大转动速度:每次循环最大调整的角度值,可按需修改 const int MAX_SPEED = 3;
主循环控制代码
loop()中的控制逻辑修改为:
int joyInput = analogRead(joyY1); int angleStep = 0; // 摇杆输入映射为角度增量 if (joyInput < JOY_DEADZONE_LOW) { // 摇杆往一个方向推,映射为负增量(角度减小) angleStep = map(joyInput, 0, JOY_DEADZONE_LOW, -MAX_SPEED, 0); } else if (joyInput > JOY_DEADZONE_HIGH) { // 摇杆往另一个方向推,映射为正增量(角度增大) angleStep = map(joyInput, JOY_DEADZONE_HIGH, 1023, 0, MAX_SPEED); } // 死区范围内angleStep保持为0,舵机不转动 // 更新当前角度,同时限制在0-180的合法范围内 currentServoAngle = constrain(currentServoAngle + angleStep, 0, 180); // 输出角度到舵机 servo2.write(currentServoAngle); delay(10);
参数调整说明
- 死区范围:如果摇杆回中时舵机还在缓慢移动,可以适当调大
JOY_DEADZONE_LOW和JOY_DEADZONE_HIGH的差值 - 转动速度:调整
MAX_SPEED的数值即可修改舵机最快转动速度,数值越大转动越快 - 响应灵敏度:修改
delay()的毫秒值,数值越小舵机响应越快、转动越流畅
内容的提问来源于stack exchange,提问作者Joseph Mahma
相关产品推荐
相关产品推荐

