ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

Johnny-Five Grove Joystick 摇杆模块接入指南:接线、事件监听与归一化原理

Johnny-Five Grove Joystick 摇杆模块接入指南:接线、事件监听与归一化原理 IoT机器人嵌入式【免费下载链接】johnny-fiveJavaScript Robotics and IoT programming framework, developed at Bocoup.项目地址https://gitcode.com/gh_mirrors/jo/johnny-five点击查看免费下载本篇技术指南围绕 Johnny-Five 项目中 Grove 生态的 Joystick 摇杆模块展开讲解如何通过 Grove Base Shield 将摇杆接入 Arduino 兼容平台使用five.Joystick读取 X/Y 两轴模拟量并通过change事件实现实时响应。读完本文你将掌握 Grove 摇杆的完整接入流程、Joystick 构造参数与事件模型并能从源码层面理解 ADC 原始值如何被归一化为 -11 的标准轴值。一、硬件准备与接线Grove 摇杆模块Grove - Joystick Module输出两路模拟信号对应摇杆的 X 轴与 Y 轴。接入 Johnny-Five 的标准做法是配合 Grove Base Shield v2 使用将摇杆模块的 4 针 Grove 线缆插入 Shield 的A0 模拟接口。在 Grove Base Shield 上A0 接口实际同时引出 A0 与 A1 两个模拟引脚恰好对应摇杆的 X 与 Y 两路输出因此无需单独接杜邦线即插即用。官方示例的注释也明确指出Plug the Joystick module into the Grove Shields A0 jack. Use the Joystick class to control.该接线方式与引脚布局和 docs/grove-joystick-edison.md 中 Intel Edison 平台的用法一致说明任何 Arduino 引脚兼容平台都可以复用这一套接线。二、最小可运行示例关联文档 docs/grove-joystick.md 给出的完整示例代码如下仓库中对应的可执行文件为 eg/grove-joystick.jsvar five require(johnny-five); var board new five.Board(); board.on(ready, function() { // Plug the Joystick module into the // Grove Shields A0 jack. Use // the Joystick class to control. var joystick new five.Joystick([A0, A1]); // Observe change events from the Joystick! joystick.on(change, function() { console.log(Joystick); console.log( x : , this.x); console.log( y : , this.y); console.log(--------------------------------------); }); });在命令行中运行node eg/grove-joystick.js运行后拨动摇杆终端会持续输出当前 X/Y 轴值。需要注意new five.Joystick([A0, A1])是构造器的简写形式数组元素按顺序对应 X、Y 两个轴完整写法为new five.Joystick({ pins: [A0, A1] })两者等价参见 eg/joystick.js 中的对象形式示例。三、Joystick 构造参数详解结合源码 lib/joystick.js 中声明的构造器签名five.Joystick支持以下两种调用形式// 形式一数组简写 five.Joystick([x, y]); // 形式二完整对象 five.Joystick({ pins: [x, y], freq: ms, zeroV: { x: value, y: value }, invert: true, invertX: true, invertY: true, controller: ANALOG // 或 ESPLORA });各参数含义如下参数类型默认值说明pins数组必填ESPLORA 控制器除外两个模拟引脚依次对应 X 轴与 Y 轴如[A0, A1]freq数字由 IO 层决定采样/事件节流间隔毫秒用于限制事件触发频率zeroV对象{ x: 0, y: 0 }指定摇杆中位对应的 ADC 基准电压值原始读数invert布尔false同时反转 X、Y 两轴方向invertX/invertY布尔false单独反转 X 或 Y 轴方向controller字符串ANALOG控制器类型可选ANALOG或ESPLORA参数解析逻辑位于 lib/joystick.jsstate.x.zeroV options.zeroV undefined ? 0 : (options.zeroV.x || 0); state.y.zeroV options.zeroV undefined ? 0 : (options.zeroV.y || 0); state.x.invert options.invertX || options.invert || false; state.y.invert options.invertY || options.invert || false;可见invertX、invertY与全局invert是兼容并存的全局反转会被两个轴分别继承轴级反转优先级更高。典型场景是 Sparkfun Joystick Shield——其 Y 轴方向与 Grove 摇杆相反因此 docs/joystick-shield.md 中使用了invertY: true来修正方向。四、事件模型data 与 changeJoystick继承自Emitter事件发射器对外暴露两个核心事件data每次采集到一组完整X 与 Y 均已就绪的轴数据时触发携带{ x, y }计算值change仅当轴值发生变化时才触发与data的区别是内部做了变化检测。事件触发逻辑位于 lib/joystick.js。每当两个轴的数据都到达后axisValues.x ! null axisValues.y ! null会先无条件emit(data)随后比较当前值与上一次的绝对值const absAxis Math.abs(computed[axis]); const absPAxis Math.abs(sensor.previous); if ((absAxis absPAxis) || (absAxis absPAxis)) { isChange true; }只有isChange为真时才emit(change)。这种设计让change事件天然适合驱动持续动作如舵机跟随避免在摇杆静止时产生无意义的重复回调。回调函数内通过this.x、this.y读取当前归一化轴值。五、源码原理从 ADC 原始值到 -11 归一化five.Joystick默认采用ANALOG控制器lib/joystick.js其工作流程可分为三部分。5.1 模拟引脚初始化构造时会对每个引脚执行pinMode(pin, ANALOG)并注册analogRead回调X 轴与 Y 轴的读数通过闭包索引写入axisValues。只有当两轴都有新值时才会触发一次数据回调天然实现两轴数据的同步配对。5.2 轴值归一化计算读取到的原始 ADC 值Arduino 10 位 ADC 范围为 01023中位约为 512并不会直接暴露给用户而是经过一次归一化换算toAxis: { value(raw, axis) { const state priv.get(this); return constrain(fscale(raw - state[axis].zeroV, -511, 511, -1, 1), -1, 1); } }换算分两步先用fscale即 lib/fn.js 中的Fn.fmap返回 Float32 的浮点映射把raw - zeroV从[-511, 511]区间线性映射到[-1, 1]再用constrainlib/fn.js 中的Fn.constrain等价于 Arduino 的constrain()把结果夹在[-1, 1]区间内防止越界。这意味着摇杆推到最左/最上时输出约-1推到最右/最下时输出约1中位静止时输出约0且映射全程为浮点连续值可直接参与角度、速度等比例换算。5.3 首次读数自动校准内部状态为每个轴维护了zeroV中位基准值与calibrated标记。若用户未显式传入zeroV构造时默认置 0但首次收到真实读数后会自动用该读数覆盖zeroV并置calibrated truelib/joystick.js即实现了上电自动找中位的自校准。这也是示例代码无需手动配置中位即可获得对称输出区间的原因。六、测试用例对行为的验证仓库测试 test/joystick.js 通过 MockFirmata 模拟模拟引脚读数验证了上述行为data测试向 X 轴喂入512、Y 轴喂入512后触发一次data事件回调参数断言为{ x: 0, y: 0 }印证了中位归一化为 0change测试依次喂入(512,512)→(1023,1023)→(512,512)→(0,0)对应断言this.x/this.y依次为1 → 0 → -1完整覆盖了满量程到负满量程的归一化边界。这些用例直观展示了ADC 原始读数 → 归一化轴值的映射关系可作为理解本文第三节、第五节内容的可执行佐证。七、进阶应用用摇杆控制云台舵机Grove 摇杆最常见的实战场景是控制二自由度云台。仓库示例 eg/joystick-pantilt.js 将摇杆的 X/Y 轴值映射到两个舵机的转动角度var range [0, 170]; var pan new five.Servo({ pin: 9, range: range, center: true }); var tilt new five.Servo({ pin: 10, range: range, center: true }); var joystick new five.Joystick({ pins: [A0, A1], freq: 100 }); joystick.on(change, function() { tilt.to(five.Fn.scale(this.y, -1, 1, 0, 170)); pan.to(five.Fn.scale(this.x, -1, 1, 0, 170)); });要点拆解freq: 100将事件节流到每 100ms 一次避免舵机指令过于频繁five.Fn.scale即 lib/fn.js 中的Fn.map基于 Arduinomap()的整数映射把-11的摇杆轴值映射到0170的舵机角度center: true舵机初始化即置于 90° 中位与摇杆中位输出 0 天然对齐。将这段逻辑与第三节的 Grove 接线结合即可得到一个即插即用的摇杆云台控制方案。八、更多平台与扩展Intel Edison使用edison-io作为 IO 插件接线与示例代码与 Arduino 版完全一致参见 docs/grove-joystick-edison.md 与 eg/grove-joystick-edison.jsArduino Esplora板载摇杆无需外接模块指定controller: ESPLORA即可其内部通过 4 线多路复用器Multiplexer分时读取两个轴通道相关实现见 lib/joystick.js使用示例见 eg/joystick-esplora.js其他摇杆模块Sparkfun 摇杆等双模拟引脚型模块同样适用本类可参考 docs/joystick.md 与 docs/joystick-shield.md 中的接线与反转配置。九、常见问题排查现象可能原因处理方式输出轴值始终为 0摇杆未插入 A0 接口或线序接反确认模块插入 Grove Shield 的 A0 接口X/Y 引脚对应 A0/A1X/Y 方向相反模块方向或 Shield 走线差异使用invertX: true/invertY: true单独反转对应轴中位输出不为 0摇杆未回中或首次读数即偏离上电自校准会以首次读数为基准重新上电并保持摇杆回中即可change事件过于频繁未设置freq节流传入freq: 50或freq: 100限制触发频率通过本文的接线说明、示例代码与源码级原理分析你已经可以独立完成 Grove Joystick 摇杆的接入、数据读取与基于轴值的应用开发。赞分享IoT机器人嵌入式【免费下载链接】johnny-fiveJavaScript Robotics and IoT programming framework, developed at Bocoup.项目地址https://gitcode.com/gh_mirrors/jo/johnny-five点击查看免费下载相关推荐Johnny-Five 摇杆Joystick完全指南从模拟摇杆读取到坐标归一化与事件驱动编程Johnny Five 摇杆Joystick完全指南从模拟摇杆读取到坐标归一化与事件驱动编程 本篇技术指南以 Johnny Five 官方文档 docs/IoT机器人嵌入式Johnny-Five Barometer BMP085 气压计传感器接入指南压力采集、事件监听与源码原理Johnny Five Barometer BMP085 气压计传感器接入指南压力采集、事件监听与源码原理 BMP085 是一款基于 I2C 接口的数字气压传IoT机器人嵌入式Johnny-Five TinkerKit Joystick 实战指南使用 five.Joystick 读取 I0/I1 双轴摇杆Johnny Five TinkerKit Joystick 实战指南使用 five.Joystick 读取 I0/I1 双轴摇杆 本文以 Johnny FiIoT机器人嵌入式创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表