SitePoint物联网周特辑!本周我们将发表一系列关于互联网与物理世界交汇的文章,请持续关注IoT标签以获取最新更新。
物联网如今风靡一时。在物理计算领域,我们有很多可以付诸实践的想法,很容易让人沉迷于编程我们所生活的世界!有了树莓派和面包板后,下一步是什么?
本文将探讨如何使用Node.js访问树莓派的GPIO引脚。通过GPIO引脚,您可以直接编程硬件。JavaScript API使此过程无缝衔接。这些API是对常用技术的抽象,并且可以从任何地方访问。Node.js解释器在一个单一进程中运行,这为编写可测试的代码开辟了新的途径。对我来说最令人兴奋的部分是,您可以像编写任何其他JavaScript程序一样编写单元测试、命中断点并检查代码,所有这些都可以在您的计算机上完成。
让我们开始吧。
关键要点
什么是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”打开一个引脚并测试它:
<code class="language-javascript">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(); }); });</code>
此测试的实现应将物理引脚16映射到GPIO中的BCM引脚23。BCM编号是内核在设备驱动程序中看到的Broadcom引脚编号。GPIO设备驱动程序概述了设备文件的位置。如所示,要打开引脚,请将字符串“out”写入/direction。这告诉GPIO我们希望写入此引脚。完成后,检查文件是否包含所需内容。mock来自mock-fs库,fs是Node.js中的标准文件系统。内核指示路径在哪里——3.18.x及更高版本位于/sys/class/gpio。
要写入电路板上的引脚并测试它,可以执行以下操作:
<code class="language-javascript">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(); }); });</code>
gpio.open()和gpio.write()之间存在相似之处。使用写入操作,这会写入/value文件。为了进行完整性检查,我写入了一个非常高的值5,但我们只期望测试结果为1。GPIO只接收高或低值,就像二进制一样。
我从pi-gpio获取了实现细节。这个库为您提供了每个引脚位置的良好概述。您也可以在内核上查找设备文件。无论哪种方式,我的目标都是让您很好地掌握基础知识,以便您可以获得清晰的画面。
让我们疯狂一点,如何在单元测试中命中断点?我使用WebStorm来做到这一点,同样,使用任何让您感觉舒适的方法:
使用合理的编程方法,关键是缩短查找错误所需的反馈循环。单元测试是一种很好的方法,可以收紧循环并获得即时反馈。
为简单起见,我正在写入单个引脚。GPIO的其余部分以相同的方式总结。打开一个引脚并告诉它你想用它做什么。读取或写入引脚,无论你需要做什么。低级API是设备文件,因此您可以选择如何编程每个引脚。
闪烁演示
为了充实每个单元测试,让我们来看一些常见的变量:
<code class="language-javascript">var sysFsPath = '/sys/class/gpio/gpio'; var pinMapping = { '16': 23 };</code>
在上面,我已经定义了GPIO中的引脚映射和设备驱动程序的路径。下面的代码查看打开和写入引脚的代码:
<code class="language-javascript">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() {}</code>
如所示,所有操作都是将writeFile()写入设备文件。如果没有任何回调,noOp是一个虚拟回调。通过这个实现细节,我获得了通过测试并确信这将有效。写入操作中的值确保它将设置为高或低('0'或'1')。
最后,一个使用上面显示的API的有效闪烁器演示:
<code class="language-javascript">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); });</code>
setInterval()每秒钟调用一次,在回调中,我告诉它使用模数切换引脚。闪烁器具有间隔,setTimeout()使用此来在12秒后清除它。setTimeOut()中的回调完成了工作并结束程序。
要运行示例代码,请键入:
<code class="language-bash">sudo npm start</code>
(您需要管理员权限才能访问树莓派上的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中文网其他相关文章!