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),仅供参考

相关新闻

IgA肾病精准治疗:基因检测指导激素用药

IgA肾病精准治疗:基因检测指导激素用药

1. IgA肾病治疗现状与精准用药需求IgA肾病作为全球最常见的原发性肾小球肾炎,约占原发性肾小球疾病的40%。在临床实践中,糖皮质激素一直是治疗中高危IgA肾病的主要药物选择。然而,长期困扰肾内科医生的一个核心问题是:为什么有些患…

2026/9/24 9:19:18 阅读更多 →
Python封装机制详解与实践指南

Python封装机制详解与实践指南

1. 为什么我们需要讨论Python封装在Python开发社区里,封装(encapsulation)可能是最常被误解的面向对象特性之一。很多开发者认为Python的封装机制很"弱",因为不像Java那样有严格的private修饰符。但实际情况是,Python提供了一套更灵…

2026/9/24 9:19:39 阅读更多 →
植物的光合作用源码解析

植物的光合作用源码解析

3行代码看懂植物光合作用的性能优化逻辑 控制台炸出一串红色的 StackTrace,光标在 NullPointerException…

2026/9/23 6:02:41 阅读更多 →

最新新闻

RedwoodJS 官方教程开篇导读:从零构建一个数据库驱动的全栈博客应用

RedwoodJS 官方教程开篇导读:从零构建一个数据库驱动的全栈博客应用

后端前端Web框架开发工具 【免费下载链接】redwood RedwoodGraphQL 项目地址: https://gitcode.com/gh_mirrors/re/redwood 点击查看 免费下载 这篇导读基于 Redwood 仓库中 version-4.x 的教程前言 展开。RedwoodJS 是一个"有主见"(opiniona…

2026/9/24 9:20:34 阅读更多 →
了解STM32最小系统核心板

了解STM32最小系统核心板

STM32F103C8T6 多端口流水灯实验报告 STM32F103C8T6 多端口流水灯实验报告 博客发布 / 学习通提交 Markdown,可直接导出 PDF;配套代码、git 操作说明,完整满足作业要求 芯片:STM32F103C8T6(Blue Pill 蓝板最小系统&…

2026/9/24 9:20:33 阅读更多 →
RV1106嵌入式AI开发:从环境搭建到NPU部署全链路实践

RV1106嵌入式AI开发:从环境搭建到NPU部署全链路实践

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/24 9:19:32 阅读更多 →
AI辅助技术设计:信任分级与判断锚点实战

AI辅助技术设计:信任分级与判断锚点实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/24 9:19:32 阅读更多 →
12路锁控板RS485通讯协议详解:帧结构、指令集与调试实战

12路锁控板RS485通讯协议详解:帧结构、指令集与调试实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/24 9:19:32 阅读更多 →
高通9008救砖实操:QFIL从驱动安装到分区刷写全流程

高通9008救砖实操:QFIL从驱动安装到分区刷写全流程

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/24 9:19:32 阅读更多 →

日新闻

基于YOLOv8的渔船作业监控系统:从环境搭建到边缘部署全流程

基于YOLOv8的渔船作业监控系统:从环境搭建到边缘部署全流程

简介:这是一套面向计算机、人工智能、自动化等专业学生与教师的毕业设计级项目资源,围绕YOLOv8实现渔船作业监控系统,可用于毕设、课程设计、大作业或项目立项演示。压缩包共97个文件,约24.21MB,以70个Python源码文件为…

2026/9/24 0:00:19 阅读更多 →
单细胞注释实战:基于Scanpy的标记基因与参考映射流程解析

单细胞注释实战:基于Scanpy的标记基因与参考映射流程解析

简介:一份基于单细胞RNA测序数据的细胞类型注释算法研究Python毕业设计源码,针对计算机相关专业正在做毕设或需要项目实战的学习者,可用于课程设计与期末大作业。项目代码完整、经导师指导评审通过,可直接运行,覆盖数据…

2026/9/24 0:00:19 阅读更多 →
C#源生成器实战:用增量生成器替代反射,告别AOT崩溃

C#源生成器实战:用增量生成器替代反射,告别AOT崩溃

第一次在项目里被反射卡住,是在一个老旧的WinForms模块里:几十个类依赖PropertyChanged通知,运行时反射读属性、发通知,每次启动慢半拍不说,一上.NET Native/AOT裁剪模式几乎全面崩盘。后来我把这段逻辑全部改成C#源生…

2026/9/24 0:00:19 阅读更多 →

周新闻

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

直接铺开项目本身吧。这几个月我一直在折腾一件事:用Flutter给OpenHarmony做一款游戏集合类的App,说白了就是把若干小游戏塞进一个壳里,用统一入口分发。这个方向本身不算新鲜,真正让我花了不少心思的,是首页那堆游戏卡…

2026/9/23 4:55:02 阅读更多 →
Word表格编号全攻略:从列表编号到题注交叉引用

Word表格编号全攻略:从列表编号到题注交叉引用

写Word文档,最让人头疼的往往是那些“看起来不起眼”的小问题。比如表格编号这事:今天在表后面多加了两个空白行,明天给客户交稿前发现整个章节的编号全部错位,光是挨个改序号就能耗掉大半个下午。我前阵子帮人整理一份上百页的技…

2026/9/24 9:10:42 阅读更多 →
从第一个站到第二个站:独立开发者的静态网站选型与落地实践

从第一个站到第二个站:独立开发者的静态网站选型与落地实践

1. 项目概述1.1 核心需求解析做独立开发者这几年,说实话,第一个网站上线的那天晚上我兴奋得没睡着。但等它跑了半年,流量惨淡、功能臃肿、代码自己都懒得看第二遍之后,我才慢慢琢磨明白一个道理:第一个网站是练手&…

2026/9/23 9:53:41 阅读更多 →

月新闻

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能分类:[AI/大模型]细分主题:AI 增强型 CI/CD 流水线自动化与 GitOps 实践:Agent 工作流、工具调用与任务拆解:从原型到生产的验收清单很多团队在尝试用大…

2026/9/23 9:53:40 阅读更多 →
容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场分类:[工程技术]细分主题:Kubernetes 生产环境运维与排障实战:可复制的项目复盘模板与决策记录大部分团队的事故复盘报告,最后都变成了躺在 Confluence 或钉…

2026/9/23 9:53:40 阅读更多 →
容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步分类:[工程技术]细分主题:Docker 容器化技术与镜像安全管理:核心链路的逐步实现与关键代码取舍面对一个积累了五六年历史包袱的单体架构应用(包含 Web 接口、后台…

2026/9/23 9:53:40 阅读更多 →