首页 >web前端 >js教程 >node.js中的覆盆子pi gpio引脚入门

node.js中的覆盆子pi gpio引脚入门

Lisa Kudrow
Lisa Kudrow原创
2025-02-17 12:58:10351浏览

Getting Started with the Raspberry Pi GPIO Pins in Node.js

Getting Started with the Raspberry Pi GPIO Pins in Node.js

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代表通用输入/输出。它们是树莓派侧面,黄色视频输出插座旁边的引脚。以下是它们的样子。

Getting Started with the Raspberry Pi GPIO Pins in Node.js

来源:树莓派
可以将它们视为从树莓派连接到外部世界的方式。这使您可以编写不在计算机屏幕上运行的程序。每个引脚都像一个可以打开或关闭的开关。您可以接收来自物理世界的输入,或发送输出。基本电路板有26个引脚,其中9个引脚是电源或接地引脚。接地引脚位于电流必须流过的每个电路的末端。更新的树莓派电路板还额外增加了一组14个引脚。

如果您想了解更多关于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来做到这一点,同样,使用任何让您感觉舒适的方法:

Getting Started with the Raspberry Pi GPIO Pins in Node.js

使用合理的编程方法,关键是缩短查找错误所需的反馈循环。单元测试是一种很好的方法,可以收紧循环并获得即时反馈。

为简单起见,我正在写入单个引脚。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中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn