树莓派Node.js连续舵机控制异常求助:多次操作后失控
解决树莓派Node.js连续舵机失控问题
这问题我之前帮朋友排查过类似的,大概率是请求处理时的资源泄漏或者未正确响应导致的,咱们一步步来解决:
1. 最可能的原因:未响应POST请求导致连接耗尽
你的POST处理函数里只调用了m1.servoWrite(),但没有给客户端返回响应。这样每次前端发送请求后,都会处于pending状态,服务器的连接资源会被逐渐占满,几次操作后新的请求根本无法到达服务器,看起来就像舵机不响应指令了。
修复代码:
给每个POST处理添加响应,释放连接:
const express = require('express'), GPIO = require('pigpio').Gpio, app = express(), http = require('http').createServer(app); var m1 = new GPIO(10, { mode: GPIO.OUTPUT }); app.post('/fb', (req, res) => { m1.servoWrite(700); res.sendStatus(200); // 关键:响应请求,释放服务器连接 }); app.post('/fbTerm', (req, res) => { m1.servoWrite(1500); res.sendStatus(200); // 必须添加响应 });
2. 进阶调试:添加详细日志定位问题
如果添加响应后还是有问题,建议在每个指令处添加带时间戳的日志,确认请求是否真的到达服务器:
app.post('/fb', (req, res) => { const timestamp = new Date().toISOString(); console.log(`[${timestamp}] 收到前进请求,发送舵机信号:700`); m1.servoWrite(700); res.sendStatus(200); }); app.post('/fbTerm', (req, res) => { const timestamp = new Date().toISOString(); console.log(`[${timestamp}] 收到停止请求,发送舵机信号:1500`); m1.servoWrite(1500); res.sendStatus(200); });
- 如果日志不再输出:说明请求没到服务器,检查前端防抖/节流,或者网络连接问题
- 如果日志正常输出但舵机没反应:可能是pigpio库的资源问题,尝试重启Node服务,或者更新pigpio:
npm install pigpio@latest
3. 额外注意事项
- 运行权限:控制GPIO需要root权限,确保你是用
sudo node your-app.js启动服务的 - 舵机信号频率:连续快速发送指令可能导致GPIO队列溢出,前端可以加个防抖(比如按下后100ms内只触发一次请求),避免短时间内大量指令堆积
先试试第一步的修复,这应该是90%的概率能解决你的问题。
内容的提问来源于stack exchange,提问作者Ank i zle
相关产品推荐
相关产品推荐

