Johnny-Five 实战:在 Intel Edison 上驱动 Grove Q Touch 电容触摸传感器(Keypad QTOUCH)
IoT机器人嵌入式【免费下载链接】johnny-fiveJavaScript Robotics and IoT programming framework, developed at Bocoup.项目地址https://gitcode.com/gh_mirrors/jo/johnny-five点击查看免费下载本文围绕 Johnny-Five 官方示例 docs/grove-q-touch.md 展开讲解如何将 Grove Q Touch 电容触摸传感器通过 Grove Base Shield v2 连接到 Intel Edison Arduino Breakout并使用 Johnny-Five 的Keypad与controller: QTOUCH完成触摸检测与事件监听。读完本文你将掌握 QTOUCH 控制器的初始化方式、三种按键映射配置、change / press / hold / release事件体系以及该控制器在 lib/keypad.js 中的底层实现原理。一、Grove Q Touch 与 QTOUCH 控制器概述Grove Q Touch 是 Seeed Studio 出品的一款电容触摸传感器内置AT42QT1070触摸检测芯片。它通过 I2C 总线与主控通信最多可检测 7 个触摸通道。在 Johnny-Five 中QTOUCH与AT42QT1070是等价的控制器名称——源码 lib/keypad.js 中明确写了Controllers.QTOUCH Controllers.AT42QT1070;也就是说QTOUCH只是AT42QT1070控制器的别名两者共享同一套初始化、数据读取与按键映射逻辑。在 docs/keypad-QTOUCH.md 中作者同样以注释形式标注了controller: QTOUCH, // or AT42QT1070。原文档还特别强调这套 shield 与传感器组合兼容任何 Arduino 引脚排布pin-out兼容的硬件平台本教程以 Intel Edison Arduino Breakout 为例展开。二、硬件准备与连接运行本文示例需要以下硬件Intel Edison Arduino Breakout 扩展板——Edison 模块的 Arduino 兼容载体提供标准 Arduino 引脚排布Grove Base Shield v2——插在 Edison Arduino Breakout 上将 Grove 传感器的 4 针连接器桥接到 I2C、数字、模拟等引脚Grove Q Touch 传感器——通过 Grove 线连接到 Base Shield 的I2C 接口AT42QT1070 是 I2C 设备默认从机地址为0x1B这一点可在 lib/keypad.js 的ADDRESSES: [0x1B]得到印证。由于 Q Touch 传感器通过 I2C 通信接线非常简单只需把传感器的 Grove 线插入 Base Shield 的任一 I2C 插座即可无需额外连接数字或模拟引脚。软件层面除了 Johnny-Five 本身Intel Edison 平台还需要安装edison-io插件作为板级 IO 驱动npm install johnny-five edison-io三、快速开始运行官方示例原文档提供了可直接运行的示例程序。在仓库根目录执行node eg/grove-q-touch.js示例程序位于 eg/grove-q-touch.js首次接触时也可以直接以命令形式查看其完整源码。程序支持通过命令行参数--show切换三种不同的按键映射模式node eg/grove-q-touch.js --show1 # 使用默认按键映射 node eg/grove-q-touch.js --show2 # 使用二维按键映射3 列 node eg/grove-q-touch.js --show3 # 使用一维按键数组运行后用手指触摸 Grove Q Touch 传感器上的触摸点终端会实时打印类似Event: press, Target: 1的事件信息。四、示例代码逐段解析4.1 命令行参数解析与板卡初始化var argv require(minimist)(process.argv.slice(2), { default: { show: 1 } }); var five require(johnny-five); var Edison require(edison-io); var board new five.Board({ io: new Edison() });minimist负责解析命令行参数默认show: 1即不带参数运行时默认采用第一种按键映射new five.Board({ io: new Edison() })将edison-io注入 Johnny-Five 的 Board 实例使 Johnny-Five 的 API 直接跑在 Edison 硬件之上。这是 Edison 平台的固定写法可参考 docs/edison-io-arduino.md 了解其他 Edison 用法。4.2 board ready 回调与三种按键映射模式board.on(ready, ...)中的回调在板卡初始化完成、可以安全操作 IO 时触发。其中根据argv.show的值构造三种不同的five.Keypad实例模式 1默认不指定 keys使用 QTOUCH 内置的 7 个通道if (argv.show 1) { keypad new five.Keypad({ controller: QTOUCH }); }从源码看AT42QT1070 控制器的默认 mapping 为[0, 1, 2, 3, 4, 5, 6]lib/keypad.js即 7 个触摸通道分别对应数字 06。当options.keys未提供时flatKeys(options)返回空数组随后 keys 会回退为这个默认映射。模式 2二维数组映射行列式if (argv.show 2) { keypad new five.Keypad({ controller: QTOUCH, keys: [ [1, 2, 3] ] }); }模式 3一维数组映射if (argv.show 3) { keypad new five.Keypad({ controller: QTOUCH, keys: [1, 2, 3] }); }关于二维与一维keys的差异可以从 lib/keypad.js 的flatKeys函数理解如果keys中每个元素都是数组则会被扁平化为一维数组后再作为按键别名使用。因此模式 2 中的[[1, 2, 3]]与模式 3 中的[1, 2, 3]最终效果一致都会把触摸通道 0、1、2 分别命名为1、2、3。二维写法的主要价值在于表达行列布局语义例如test/keypad.js中使用的[[!, , #], [$, %, ^], []]这类 3×3 矩阵式触摸板布局。需要注意的是keys数组的长度应当与硬件实际支持的通道数匹配。AT42QT1070 支持 7 个通道因此自定义keys最多可定义 7 个按键别名超出部分不会参与映射。4.3 事件监听[change, press, hold, release].forEach(function(eventType) { keypad.on(eventType, function(data) { console.log(Event: %s, Target: %s, eventType, data.which); }); });示例为四种事件统一注册了监听器事件回调参数data中的data.which携带被触摸按键的别名来自上面配置的keys。4.4 独立运行版Touchpad API除five.Keypad外Johnny-Five 还提供了语义化的five.Touchpad写法。仓库中的 eg/keypad-QTOUCH.js 及其文档 docs/keypad-QTOUCH.md 展示了同一份逻辑的 Touchpad 版本var five require(johnny-five); var board new five.Board(); board.on(ready, function() { var touchpad new five.Touchpad({ controller: QTOUCH, // or AT42QT1070 }); // ... });这个版本不依赖edison-io直接使用默认 Board适用于 Arduino 等标准平台可作为跨平台对照参考。五、事件体系与触发机制QTOUCH 控制器在 Johnny-Five 中暴露四类核心事件change、press、hold、release。其触发机制位于 lib/keypad.js 的状态机逻辑中核心要点如下事件别名press是down、tap、impact、hit、touch等别名之一release同时是up。源码 lib/keypad.js 定义了完整的别名映射表。因此如果程序监听down或up同样会收到触摸按下/释放事件。触发逻辑press某个通道从0未触摸变为1触摸时触发事件参数为对应按键别名hold触摸持续超过holdtime默认 500ms后触发可通过初始化参数options.holdtime自定义对应源码 lib/keypad.jsstate.holdtime options.holdtime ? options.holdtime : 500;release通道从1变回0时触发change以上任一事件发生时都会额外触发一次change携带同一份事件数据见 lib/keypad.js。所有事件在派发前经过 5ms 的防抖debounce处理lib/keypad.js用于滤除触摸抖动与重复采样产生的毛刺。测试 test/keypad.js 中的hold用例验证了这一行为向 I2C 回调连续传入同一触摸值并用假时钟推进 600ms 后hold事件恰好触发一次——这也印证了holdtime默认 500ms 的实现。六、源码级原理QTOUCH 如何读取触摸数据6.1 I2C 通信细节QTOUCH别名指向 lib/keypad.js 中的AT42QT1070控制器其初始化过程如下this.io.i2cConfig(options); this.io.i2cRead(address, this.REGISTER.READ, 1, data callback(data[0]));I2C 从机地址0x1BADDRESSES定义读取寄存器0x03REGISTER.READ触摸状态寄存器每次读取 1 字节该字节是一个7 位位图每一位代表一个触摸通道bit 0 对应通道 0bit 6 对应通道 6初始化时还会调用Drivers.addressResolver(this, options)解析地址因此你可以通过options.address显式指定地址。测试 test/keypad.js 验证了address与bus参数会正确转发到i2cConfig。6.2 位图解码与多触点支持控制器通过toIndices将读到的原始字节解码为被触摸通道索引列表lib/keypad.jstoIndices: { value(raw) { const indices []; for (let i 0; i 7; i) { if (raw (1 i)) { indices.push(i); } } return indices; } }由于位图中每个通道彼此独立QTOUCH 天然支持多点触摸——isMultitouch在初始化时被置为truelib/keypad.js多个通道可同时处于按下状态事件回调中的data.which因此是一个数组。toAlias则负责将通道索引映射回用户配置的按键别名toAlias: { value(index) { const state priv.get(this); return state.keys[index]; } }6.3 数据流全链路从硬件到事件的完整数据链路为AT42QT1070 触摸位图 → i2cRead(0x1B, 0x03, 1, callback) 读取 1 字节状态 → toIndices(raw) 解码为被触摸通道索引数组 → 遍历 state.touches 状态机 判定 down / hold / up → trigger(debounce 5ms) 派发 press / hold / release / change → 用户事件监听器 输出 Event 与 Target七、测试验证与跨平台兼容性test/keypad.js 中设有专门的Keypad: QTOUCH测试组覆盖了以下行为可作为你验证自身用法的参照initialize确认i2cConfig与i2cRead各被调用一次keysDefault向 I2C 回调依次传入[1] [2] [4] [8] [16] [32] [64]断言 7 个默认按键 06 依次触发down事件keysRowsCols与keysList验证二维行列式与一维数组两种keys配置的别名映射press连续传入重复值如[4]三次时事件不会重复触发hold时钟推进超过 500ms 才触发holdrelease触摸位清零后触发释放事件。兼容性方面原文档明确指出该 shield 与传感器适用于任何 Arduino 引脚排布兼容的硬件平台。由于 QTOUCH 控制器的通信完全基于标准 I2C理论上凡支持 I2C 的 Johnny-Five 平台Arduino、Edison、Tessel 等均可使用示例本身运行在 Intel Edison 上通过edison-io注入板级 IO。不同平台的差异主要在于 Board 的 IO 注入方式其余 Keypad 配置与事件 API 完全一致。八、小结与扩展阅读通过本文你已经掌握了Grove Q TouchAT42QT1070在 Johnny-Five 中的接入方式new five.Keypad({ controller: QTOUCH })三种按键映射配置默认、二维、一维的写法与底层flatKeys扁平化规则change / press / hold / release事件及其别名、holdtime与防抖机制I2C 地址0x1B、寄存器0x03、7 位位图解码与多触点支持等源码级原理。想进一步深入可继续阅读以下仓库资源lib/keypad.jsKeypad 类完整实现QTOUCH/AT42QT1070 控制器定义及事件状态机test/keypad.jsQTOUCH 控制器的全部测试用例docs/keypad-QTOUCH.md 与 eg/keypad-QTOUCH.jsTouchpad API 的对照实现docs/edison-io-arduino.mdIntel Edison 平台的更多接入方式docs/keypad-MPR121.md同为电容触摸方案的另一控制器 MPR121 的参考用法。赞分享IoT机器人嵌入式【免费下载链接】johnny-fiveJavaScript Robotics and IoT programming framework, developed at Bocoup.项目地址https://gitcode.com/gh_mirrors/jo/johnny-five点击查看免费下载相关推荐Johnny-Five 在 Intel Edison 上驱动 Grove 气压计BMP180实战指南Johnny Five 在 Intel Edison 上驱动 Grove 气压计BMP180实战指南 本文基于 Johnny Five 仓库中的 groveIoT机器人嵌入式Johnny-Five 触控传感实战使用 Button 类驱动 Grove Touch 模块实现触摸点灯Johnny Five 触控传感实战使用 Button 类驱动 Grove Touch 模块实现触摸点灯 导读 本文围绕 johnny five 官方示例 dIoT机器人嵌入式深入解析LibreSpeed-go源码从main.go看Go后端的高效网络编程实现 深入解析LibreSpeed go源码从main.go看Go后端的高效网络编程实现 想要了解如何用Go语言构建一个高性能的网络测速服务吗LibreSpIoT机器人嵌入式创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考