SitePoint物联网周特辑!本周我们将发表一系列关于互联网与物理世界交汇的文章,请持续关注IoT标签以获取最新更新。
物联网如今风靡一时。在物理计算领域,我们有很多可以付诸实践的想法,很容易让人沉迷于编程我们所生活的世界!有了树莓派和面包板后,下一步是什么?
本文将探讨如何使用Node.js访问树莓派的GPIO引脚。通过GPIO引脚,您可以直接编程硬件。JavaScript API使此过程无缝衔接。这些API是对常用技术的抽象,并且可以从任何地方访问。Node.js解释器在一个单一进程中运行,这为编写可测试的代码开辟了新的途径。对我来说最令人兴奋的部分是,您可以像编写任何其他JavaScript程序一样编写单元测试、命中断点并检查代码,所有这些都可以在您的计算机上完成。
让我们开始吧。
关键要点
- 可以使用Node.js访问树莓派的通用输入/输出(GPIO)引脚,从而可以直接对硬件进行编程。这些引脚就像开关一样,接收输入或向物理世界发送输出,JavaScript API使这个过程变得无缝。
- GPIO API是读取或写入设备文件的包装器,文件系统API可能是您已经熟悉的概念。在类Unix系统中,GPIO的行为与任何其他普通文件一样,这为如何处理解决方案提供了自由。
- 测试驱动方法非常适合物联网。在物理计算中,您不希望将硬件运送到世界各地去调试代码。使用测试驱动方法,可以立即获得反馈并确保解决方案有效。
- 使用GPIO API,可以将其简化为围绕fs模块的包装器,从而创建干净且可测试的代码。本文通过使用所示API的有效闪烁器演示来演示这一点。
什么是GPIO?
GPIO代表通用输入/输出。它们是树莓派侧面,黄色视频输出插座旁边的引脚。以下是它们的样子。
如果您想了解更多关于GPIO引脚的细节,这个在线图表提供了您需要了解每个引脚用途的所有信息。有无数的输入/输出和接地引脚。这些引脚是物理计算的基础。根据您的目标,您可以根据需要使用任意数量的引脚。
模拟fs!
我知道你在想什么,fs到底是什么,为什么我需要关心它?在类Unix操作系统中,设备文件是一个看起来像文件的驱动程序。简单来说,设备驱动程序就是一个文件!你猜怎么着?GPIO API是读取或写入设备文件的包装器。文件系统API可能是您已经熟悉的概念。如果您从未在Node.js中使用过文件,我建议您回顾一下Node.js中的fs模块和文件系统。fs是“文件系统”的缩写,使您可以读取或写入普通文件。这里没有什么花哨的东西,我们所做的只是例如writeFile(),让GPIO处理其余部分。诀窍是知道在哪个文件上写入什么内容。
有一个方便的npm包叫做mock-fs,它可以帮助我们进行单元测试。使用这个库,可以模拟内存中任何文件系统上的任何文件。最重要的是我们只处理文件,这就是我们需要做的全部。在类Unix系统中,GPIO的行为与任何其他普通文件一样。这使我们能够自由地选择如何处理此解决方案。
mock-fs库的核心是mock({})函数。它接收一个参数,该参数是一个JavaScript对象。在这个参数中,您可以创建任何您想要的文件。这里的美妙之处在于这一切都在内存中运行,因此您可以尽情进行单元测试。解释器在一个单一进程中运行,这意味着可以在运行时覆盖fs模块。JavaScript是一种动态语言,因此我们可以模拟当前进程中可用的任何模块。
一旦您在GPIO上编写了良好的单元测试,GPIO接口就会更有意义。我喜欢的是您可以获得自动化的测试覆盖率和一个干净的解决方案。单元测试提高了代码的可读性,因为它清楚地向您展示了API的用途。
所以让我们动手吧。
单元测试所有内容
让我们用“out”打开一个引脚并测试它:
it('opens a pin with out', function (done) { mock({ '/sys/class/gpio/gpio23/direction': '' }); gpio.open(16, 'out', function () { const direction = fs.readFileSync('/sys/class/gpio/gpio23/direction').toString(); should(direction).equal('out'); done(); }); });
此测试的实现应将物理引脚16映射到GPIO中的BCM引脚23。BCM编号是内核在设备驱动程序中看到的Broadcom引脚编号。GPIO设备驱动程序概述了设备文件的位置。如所示,要打开引脚,请将字符串“out”写入/direction。这告诉GPIO我们希望写入此引脚。完成后,检查文件是否包含所需内容。mock来自mock-fs库,fs是Node.js中的标准文件系统。内核指示路径在哪里——3.18.x及更高版本位于/sys/class/gpio。
要写入电路板上的引脚并测试它,可以执行以下操作:
it('writes to a pin with a high value', function (done) { mock({ '/sys/class/gpio/gpio23/value': '0' }); gpio.write(16, 5, function () { const value = fs.readFileSync('/sys/class/gpio/gpio23/value').toString(); should(value).equal('1'); done(); }); });
gpio.open()和gpio.write()之间存在相似之处。使用写入操作,这会写入/value文件。为了进行完整性检查,我写入了一个非常高的值5,但我们只期望测试结果为1。GPIO只接收高或低值,就像二进制一样。
我从pi-gpio获取了实现细节。这个库为您提供了每个引脚位置的良好概述。您也可以在内核上查找设备文件。无论哪种方式,我的目标都是让您很好地掌握基础知识,以便您可以获得清晰的画面。
让我们疯狂一点,如何在单元测试中命中断点?我使用WebStorm来做到这一点,同样,使用任何让您感觉舒适的方法:
使用合理的编程方法,关键是缩短查找错误所需的反馈循环。单元测试是一种很好的方法,可以收紧循环并获得即时反馈。
为简单起见,我正在写入单个引脚。GPIO的其余部分以相同的方式总结。打开一个引脚并告诉它你想用它做什么。读取或写入引脚,无论你需要做什么。低级API是设备文件,因此您可以选择如何编程每个引脚。
闪烁演示
为了充实每个单元测试,让我们来看一些常见的变量:
var sysFsPath = '/sys/class/gpio/gpio'; var pinMapping = { '16': 23 };
在上面,我已经定义了GPIO中的引脚映射和设备驱动程序的路径。下面的代码查看打开和写入引脚的代码:
function open(pinNumber, direction, callback) { const path = sysFsPath + pinMapping[pinNumber] + '/direction'; fs.writeFile(path, direction, (callback || noOp)); } function write(pinNumber, value, callback) { const path = sysFsPath + pinMapping[pinNumber] + '/value'; value = !!value ? '1' : '0'; fs.writeFile(path, value, 'utf8', callback); } function noOp() {}
如所示,所有操作都是将writeFile()写入设备文件。如果没有任何回调,noOp是一个虚拟回调。通过这个实现细节,我获得了通过测试并确信这将有效。写入操作中的值确保它将设置为高或低('0'或'1')。
最后,一个使用上面显示的API的有效闪烁器演示:
gpio.open(16, 'out', function () { var on = 0; var blinker = setInterval(function () { gpio.write(16, on, function () { on = (on + 1) % 2; console.log('ON = ' + on); }); }, 1000); setTimeout(function () { clearInterval(blinker); }, 12000); });
setInterval()每秒钟调用一次,在回调中,我告诉它使用模数切换引脚。闪烁器具有间隔,setTimeout()使用此来在12秒后清除它。setTimeOut()中的回调完成了工作并结束程序。
要运行示例代码,请键入:
sudo npm start
(您需要管理员权限才能访问树莓派上的GPIO)
我希望从这个演示中,GPIO看起来更直观。它期望使用方向打开一个引脚。然后,您写入引脚,让GPIO处理其余的细节。
结论
测试驱动方法非常适合物联网。在物联网中,您的想象力是极限。树莓派可以部署在世界任何地方——在物理计算中,您不希望将硬件运送到世界各地去调试代码。使用测试驱动方法,可以立即获得反馈并确保解决方案有效。您可以提高生产力并收紧反馈循环。
我喜欢GPIO API的地方在于,可以将其简化为围绕fs模块的包装器。这使您可以完全自由地编写干净且可测试的代码。
其余的示例演示已上传到GitHub。
关于在树莓派上使用Node.js和GPIO引脚的常见问题解答
-
什么是Node.js,如何将其与树莓派的GPIO引脚一起使用?Node.js是一个JavaScript运行时环境,允许您在树莓派上运行JavaScript代码。您可以使用它来控制和交互GPIO(通用输入/输出)引脚,这些引脚用于将外部硬件组件连接到树莓派。
-
在树莓派上使用Node.js和GPIO引脚是否需要任何特殊的硬件?您需要一个树莓派电路板,以及可能的一些外部组件,例如LED、传感器或继电器,具体取决于您的项目。要开始,您还应该有一个面包板和一些跳线,用于将这些组件连接到GPIO引脚。
-
如何在树莓派上安装Node.js?您可以使用apt包管理器或从Node.js网站下载并安装它来在树莓派上安装Node.js。确保您为您的特定树莓派型号使用ARM兼容版本的Node.js。
-
什么是GPIO引脚,如何在树莓派电路板上识别它们?GPIO引脚是树莓派上可用于数字输入或输出的引脚。它们用数字标记,可以使用特定于您的树莓派型号的GPIO引脚图来识别。
-
如何在Node.js中访问GPIO引脚?您可以使用rpi-gpio、onoff或pigpio等库在Node.js中访问GPIO引脚。这些库提供用于在JavaScript代码中控制和交互GPIO引脚的API。
-
在我的Node.js项目中,是否可以将GPIO引脚同时用于输入和输出?是的,您可以在Node.js项目中将GPIO引脚配置为输入和输出。您可以读取连接到输入引脚的传感器的数 据,并控制连接到输出引脚的LED、电机或其他设备。
-
是否可以使用Node.js中的GPIO引脚进行PWM(脉冲宽度调制),用于控制亮度或速度等任务?是的,您可以使用树莓派上的某些GPIO引脚进行PWM,以控制亮度、电机速度等。pigpio等库提供对PWM的支持,并且与Node.js兼容。
以上是node.js中的覆盆子pi gpio引脚入门的详细内容。更多信息请关注PHP中文网其他相关文章!

JavaScript字符串替换方法详解及常见问题解答 本文将探讨两种在JavaScript中替换字符串字符的方法:在JavaScript代码内部替换和在网页HTML内部替换。 在JavaScript代码内部替换字符串 最直接的方法是使用replace()方法: str = str.replace("find","replace"); 该方法仅替换第一个匹配项。要替换所有匹配项,需使用正则表达式并添加全局标志g: str = str.replace(/fi

因此,在这里,您准备好了解所有称为Ajax的东西。但是,到底是什么? AJAX一词是指用于创建动态,交互式Web内容的一系列宽松的技术。 Ajax一词,最初由Jesse J创造

10款趣味横生的jQuery游戏插件,让您的网站更具吸引力,提升用户粘性!虽然Flash仍然是开发休闲网页游戏的最佳软件,但jQuery也能创造出令人惊喜的效果,虽然无法与纯动作Flash游戏媲美,但在某些情况下,您也能在浏览器中获得意想不到的乐趣。 jQuery井字棋游戏 游戏编程的“Hello world”,现在有了jQuery版本。 源码 jQuery疯狂填词游戏 这是一个填空游戏,由于不知道单词的上下文,可能会产生一些古怪的结果。 源码 jQuery扫雷游戏

本教程演示了如何使用jQuery创建迷人的视差背景效果。 我们将构建一个带有分层图像的标题横幅,从而创造出令人惊叹的视觉深度。 更新的插件可与JQuery 1.6.4及更高版本一起使用。 下载

本文演示了如何使用jQuery和ajax自动每5秒自动刷新DIV的内容。 该示例从RSS提要中获取并显示了最新的博客文章以及最后的刷新时间戳。 加载图像是选择

Matter.js是一个用JavaScript编写的2D刚体物理引擎。此库可以帮助您轻松地在浏览器中模拟2D物理。它提供了许多功能,例如创建刚体并为其分配质量、面积或密度等物理属性的能力。您还可以模拟不同类型的碰撞和力,例如重力摩擦力。 Matter.js支持所有主流浏览器。此外,它也适用于移动设备,因为它可以检测触摸并具有响应能力。所有这些功能都使其值得您投入时间学习如何使用该引擎,因为这样您就可以轻松创建基于物理的2D游戏或模拟。在本教程中,我将介绍此库的基础知识,包括其安装和用法,并提供一

本文讨论了在浏览器中优化JavaScript性能的策略,重点是减少执行时间并最大程度地减少对页面负载速度的影响。


热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

AI Hentai Generator
免费生成ai无尽的。

热门文章

热工具

EditPlus 中文破解版
体积小,语法高亮,不支持代码提示功能

ZendStudio 13.5.1 Mac
功能强大的PHP集成开发环境

安全考试浏览器
Safe Exam Browser是一个安全的浏览器环境,用于安全地进行在线考试。该软件将任何计算机变成一个安全的工作站。它控制对任何实用工具的访问,并防止学生使用未经授权的资源。

Dreamweaver Mac版
视觉化网页开发工具

VSCode Windows 64位 下载
微软推出的免费、功能强大的一款IDE编辑器