Arduino运行elbowUP/elbowDown后无法接收已连接PS3控制器的指令
故障根本原因
- PS3蓝牙控制库的运行依赖
Usb.Task()函数高频轮询处理蓝牙通信、同步按键状态,该函数的调用间隔不能超过100ms,否则底层蓝牙通信会超时失活,Arduino端无法再接收新的PS3输入事件,仅保留已有的连接状态标记,所以会出现PS3显示连接但无响应的现象。 elbowUP()、elbowDown()两个函数中的舵机转动逻辑,总执行时长约为2.2秒:两个函数的for循环共执行111次,每次固定delay(20),全程没有调用Usb.Task(),远超允许的最大调用间隔,导致PS3库状态异常,无法响应后续指令。- 其余函数可以正常执行的原因:要么总执行时长极短,不会超过通信超时阈值;要么类似按下CROSS/TRIANGLE触发的while循环逻辑,循环内部已主动调用
Usb.Task()维持通信。
修复方案
修改两个肘部控制函数的for循环,在每次延时前插入Usb.Task()调用,维持蓝牙通信正常:
// elbowUP 函数的for循环修改后 for(int j=30;j<=max_val;j++) { ElbowGripperservo.write(j); Serial.println(j); Usb.Task(); // 新增调用,处理PS3通信事件 delay(20); } // elbowDown 函数的for循环修改后 for(int j=max_val;j>=min_val;j--) { ElbowGripperservo.write(j); Serial.println(j); Usb.Task(); // 新增调用,处理PS3通信事件 delay(20); }
后续所有执行时长超过50ms的自定义函数,都需要在执行逻辑中定期插入Usb.Task()调用,避免触发相同的通信超时问题。
内容的提问来源于stack exchange,提问作者Swagat Das
相关产品推荐
相关产品推荐

