拓冰建站拓冰建站
首页 / 资讯中心 / 正文

使用 Johnny-Five 与 EVShield EV3 红外测距传感器构建距离报警器(Proximity - EVS_EV3_IR)

IoT机器人嵌入式【免费下载链接】johnny-fiveJavaScript Robotics and IoT programming framework, developed at Bocoup.项目地址https://gitcode.com/gh_mirrors/jo/johnny-five点击查看免费下载导读本文基于 Johnny-Five 官方示例 docs/proximity-EVS_EV3_IR-alert.md讲解如何在 johnny-five 项目中通过 EVShield 扩展板接入 LEGO EV3 红外传感器控制器标识EVS_EV3_IR实现近距离触发红灯 / 远距离恢复绿灯的距离报警器。读完本文你将掌握 EV3 红外测距在 Johnny-Five 中的接线、Proximity组件初始化、cm/inches属性读取、change事件驱动逻辑以及Led/Leds组合控制 LED 的完整实战方案。示例概述距离阈值触发的双色 LED 报警器本示例的核心思路非常简单用一个 EV3 红外传感器持续测量前方物体距离当距离小于 35 厘米时点亮红灯报警否则保持绿灯常亮。代码分为三步初始化主板、创建Proximity传感器实例、在change事件中依据proximity.cm切换 LED 状态。const { Board, Led, Leds, Proximity } require(johnny-five); const board new Board(); board.on(ready, () { const proximity new Proximity({ controller: EVS_EV3_IR, pin: BAS1 }); const red new Led(10); const green new Led(11); const leds new Leds([red, green]); green.on(); proximity.on(change, () { if (proximity.cm 35) { if (!red.isOn) { leds.toggle(); } } else if (!green.isOn) { leds.toggle(); } }); });这段代码与示例文件 eg/proximity-EVS_EV3_IR-alert.js 完全一致可直接运行。从命令行运行示例该文档是 Johnny-Five 官方示例体系的一部分运行方式与仓库内其他示例一致在仓库根目录执行node eg/proximity-EVS_EV3_IR-alert.js运行前提已在本机安装并连接 EVShield 扩展板板载固件为支持 EV3 传感器的版本EVShield 上 BAS1 口接入 LEGO EV3 红外传感器本示例对应pin: BAS1Arduino 等主控通过 Firmata 固件与主机通信Johnny-Five 会通过Board自动建立连接数字引脚 10、11 分别连接红灯、绿灯示例中以Led(10)、Led(11)声明仓库依赖已安装即执行过npm install参考 package.json。与基础测距示例的对照仓库还提供了一份不带 LED 的纯日志版本 eg/proximity-EVS_EV3_IR.js其文档见 docs/proximity-EVS_EV3_IR.md。两者唯一差异在如何使用测量结果// 纯日志版每次距离变化时打印 cm / in proximity.on(change, () { const {centimeters, inches} proximity; console.log(Proximity: ); console.log( cm : , centimeters); console.log( in : , inches); console.log(-----------------); });对照学习可以更清楚EVS_EV3_IR控制器负责把原始红外数据换算成厘米而报警是应用层在change事件里自行实现的业务逻辑。Proximity 组件的控制器与参数说明Proximity是 Johnny-Five 中的测距组件通过controller指定具体传感器型号初始化时执行对应的数据采集与单位换算。在 lib/proximity.js 中可以看到完整控制器表包括GP2Y0A21YK、GP2Y0A02YK0F、HCSR04、LIDARLITE等其中与本文相关的两个 EV3 控制器为控制器名适用传感器底层实现要点EVS_EV3_IRLEGO EV3 红外传感器通过 EVShield 读取 Proximity 寄存器toCm直接返回原始值单位已为厘米EVS_EV3_USLEGO EV3 超声波传感器读取方式相同toCm将原始值除以 10 换算为厘米本示例使用EVS_EV3_IR。pin参数必须是 EVShield 的合法端口名支持BAS1、BAS2、BBS1、BBS2传感器口以及BAM1/BAM2/BBM1/BBM2电机口。端口解析逻辑在 lib/evshield.js 的EVS.shieldPort中实现以BA开头映射到 Bank AI2C 地址0x1A以BB开头映射到 Bank B地址0x1BS1/S2后缀决定使用哪一路传感器模式、模拟读取寄存器与偏移量S2偏移为 52见EVS.S2_OFFSET。底层原理EVS_EV3_IR 控制器如何读取红外距离EVS_EV3_IR控制器的实现位于 lib/proximity.js 的Controllers.EVS_EV3_IREVS_EV3_IR: { initialize: { value(options, callback) { const state priv.get(this); state.shield EVS.shieldPort(options.pin); state.ev3 new EVS(Object.assign(options, { io: this.io })); state.ev3.setup(state.shield, EVS.Type_EV3); state.ev3.read(state.shield, EVS.Proximity, EVS.Proximity_Bytes, data callback(data[0] | (data[1] 8))); } }, toCm: { value(value) { return value; } } }结合 lib/evshield.js 可还原完整调用链EVS.shieldPort(pin)解析端口名得到bank、mode、offset、sensor等字段new EVS({io})创建 EVShield 驱动实例。构造函数会把 Bank A0x1A与 Bank B0x1B两个 I2C Bank 都建立连接并通过模块级shared变量保证同一主板只实例化一次state.ev3.setup(...)向对应 Bank 的模式寄存器写入EVS.Type_EV30x13通知扩展板该端口接入了 EV3 类型传感器state.ev3.read(...)从EVS.Proximity寄存器0x83连续读取EVS.Proximity_Bytes2 字节回调中用data[0] | (data[1] 8)合成 16 位原始距离值原始值被写入Proximity内部状态随后toCm原样返回因为 EV3 红外传感器输出的已是厘米单位的整数值。数据刷新与事件Proximity构造器在 lib/proximity.js 中通过setInterval按freq默认 25 毫秒周期性地把当前距离封装为{ cm, centimeters, in, inches }并发出data事件只有当raw相对上次发生变化时才额外发出change事件。此外还通过Withinablemixin 提供within([min, max], unit, callback)区间回调能力。单元测试佐证test/proximity.js 中Proximity: EVS_EV3_IR测试套件exports[Proximity: EVS_EV3_IR]验证了该控制器的完整行为stub 掉EVS.prototype.setup、EVS.prototype.read与i2cRead模拟返回[15, 0]within测试断言this.inches 5.85即原始值 15 厘米 → 15 × 0.39 5.85 英寸与Proximity.prototype中inches centimeters * 0.39的换算完全吻合data/change测试使用假时钟tick(100)验证事件按freq触发。这从测试层面确认了EVS_EV3_IR的cm就是毫米级原始值的直接厘米表达in由cm乘以 0.39 得到。报警逻辑逐行拆解回到本示例的报警实现理解三处关键写法green.on(); // 启动时绿灯常亮表示安全proximity.on(change, () { if (proximity.cm 35) { // 距离小于 35cm进入报警区 if (!red.isOn) { // 仅当红灯未亮时才翻转 leds.toggle(); } } else if (!green.isOn) { // 距离 35cm离开报警区 leds.toggle(); } });阈值 35 厘米LEGO EV3 红外传感器官方有效测距范围约为 5–70 厘米35 厘米取中段误报少且响应灵敏。你可以根据实际场景调整这个数字也可以改用proximity.within([0, 35], cm, ...)表达同样的区间逻辑用red.isOn/green.isOn做状态判断是为了避免change高频触发时反复调用toggle()造成 LED 抖动只有当状态确实需要切换时才翻转leds红灯亮则绿灯灭反之亦然Led与Leds是 Johnny-Five 的 LED 组件与集合组件Led(10)、Led(11)分别控制数字引脚 10、11Leds([red, green])把两个灯聚合toggle()会整体翻转集合内每个灯的开关状态。扩展思路与注意事项改用超声波传感器仓库提供对应的EVS_EV3_US版本 eg/proximity-EVS_EV3_US-alert.js文档见 docs/proximity-EVS_EV3_US-alert.md除控制器名改为EVS_EV3_US、阈值改为 25 厘米外结构完全一致可对照移植端口选择示例使用BAS1如该口被占用可换BAS2、BBS1、BBS2只需同步修改pin事件粒度data事件按固定频率持续触发适合做平滑显示change仅在值变化时触发适合做阈值判断本示例正是利用这一点避免无效计算数据单位proximity.cm与proximity.centimeters等价proximity.in与proximity.inches等价二者由Proximity的只读属性统一提供见 lib/proximity.js。相关资源组件源码lib/proximity.jsEVShield 驱动与寄存器定义lib/evshield.js示例入口eg/proximity-EVS_EV3_IR-alert.js、eg/proximity-EVS_EV3_IR.js基础测距文档docs/proximity-EVS_EV3_IR.md、docs/proximity-EVS_EV3_US-alert.md测试用例test/proximity.jsProximity: EVS_EV3_IR套件赞分享IoT机器人嵌入式【免费下载链接】johnny-fiveJavaScript Robotics and IoT programming framework, developed at Bocoup.项目地址https://gitcode.com/gh_mirrors/jo/johnny-five点击查看免费下载相关推荐Johnny-Five 实战用 EVShield 驱动 LEGO EV3 超声波测距传感器Proximity EVS_EV3_USJohnny Five 实战用 EVShield 驱动 LEGO EV3 超声波测距传感器Proximity EVS_EV3_US 本文是一份面向 JohIoT机器人嵌入式Johnny-Five 距离传感实战用 Proximity 模块驱动红外测距传感器GP2Y0A21YK 示例Johnny Five 距离传感实战用 Proximity 模块驱动红外测距传感器GP2Y0A21YK 示例 Johnny Five 是运行在 Node.IoT机器人嵌入式johnny-five 红外测距实战GP2Y0A710K0F 长距传感器接入与距离换算原理johnny five 红外测距实战GP2Y0A710K0F 长距传感器接入与距离换算原理 本指南以 johnny five 官方示例文档 docs/proxIoT机器人嵌入式上一篇当华硕笔记本性能失控时G-Helper如何成为你的轻量级控制中心下一篇MongoDB Join Optimization 之 $project 投影与字段重命名Golden 测试解析与执行计划解读创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
分享:

看完干货,该让你的企业上线了

免费需求沟通 · 48 小时内出具建站方案 · 河南本地可上门