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

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”打开一个引脚并测试它:

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来做到这一点,同样,使用任何让您感觉舒适的方法:

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

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

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

声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
JavaScript数据类型:浏览器和nodejs之间是否有区别?JavaScript数据类型:浏览器和nodejs之间是否有区别?May 14, 2025 am 12:15 AM

JavaScript核心数据类型在浏览器和Node.js中一致,但处理方式和额外类型有所不同。1)全局对象在浏览器中为window,在Node.js中为global。2)Node.js独有Buffer对象,用于处理二进制数据。3)性能和时间处理在两者间也有差异,需根据环境调整代码。

JavaScript评论:使用//和 / * * / * / * /JavaScript评论:使用//和 / * * / * / * /May 13, 2025 pm 03:49 PM

JavaScriptusestwotypesofcomments:single-line(//)andmulti-line(//).1)Use//forquicknotesorsingle-lineexplanations.2)Use//forlongerexplanationsorcommentingoutblocksofcode.Commentsshouldexplainthe'why',notthe'what',andbeplacedabovetherelevantcodeforclari

Python vs. JavaScript:开发人员的比较分析Python vs. JavaScript:开发人员的比较分析May 09, 2025 am 12:22 AM

Python和JavaScript的主要区别在于类型系统和应用场景。1.Python使用动态类型,适合科学计算和数据分析。2.JavaScript采用弱类型,广泛用于前端和全栈开发。两者在异步编程和性能优化上各有优势,选择时应根据项目需求决定。

Python vs. JavaScript:选择合适的工具Python vs. JavaScript:选择合适的工具May 08, 2025 am 12:10 AM

选择Python还是JavaScript取决于项目类型:1)数据科学和自动化任务选择Python;2)前端和全栈开发选择JavaScript。Python因其在数据处理和自动化方面的强大库而备受青睐,而JavaScript则因其在网页交互和全栈开发中的优势而不可或缺。

Python和JavaScript:了解每个的优势Python和JavaScript:了解每个的优势May 06, 2025 am 12:15 AM

Python和JavaScript各有优势,选择取决于项目需求和个人偏好。1.Python易学,语法简洁,适用于数据科学和后端开发,但执行速度较慢。2.JavaScript在前端开发中无处不在,异步编程能力强,Node.js使其适用于全栈开发,但语法可能复杂且易出错。

JavaScript的核心:它是在C还是C上构建的?JavaScript的核心:它是在C还是C上构建的?May 05, 2025 am 12:07 AM

javascriptisnotbuiltoncorc; saninterpretedlanguagethatrunsonenginesoftenwritteninc.1)javascriptwasdesignedAsalightweight,解释edganguageforwebbrowsers.2)Enginesevolvedfromsimpleterterterpretpreterterterpretertestojitcompilerers,典型地提示。

JavaScript应用程序:从前端到后端JavaScript应用程序:从前端到后端May 04, 2025 am 12:12 AM

JavaScript可用于前端和后端开发。前端通过DOM操作增强用户体验,后端通过Node.js处理服务器任务。1.前端示例:改变网页文本内容。2.后端示例:创建Node.js服务器。

Python vs. JavaScript:您应该学到哪种语言?Python vs. JavaScript:您应该学到哪种语言?May 03, 2025 am 12:10 AM

选择Python还是JavaScript应基于职业发展、学习曲线和生态系统:1)职业发展:Python适合数据科学和后端开发,JavaScript适合前端和全栈开发。2)学习曲线:Python语法简洁,适合初学者;JavaScript语法灵活。3)生态系统:Python有丰富的科学计算库,JavaScript有强大的前端框架。

See all articles

热AI工具

Undresser.AI Undress

Undresser.AI Undress

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

AI Clothes Remover

AI Clothes Remover

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

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

Video Face Swap

Video Face Swap

使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热门文章

热工具

螳螂BT

螳螂BT

Mantis是一个易于部署的基于Web的缺陷跟踪工具,用于帮助产品缺陷跟踪。它需要PHP、MySQL和一个Web服务器。请查看我们的演示和托管服务。

SecLists

SecLists

SecLists是最终安全测试人员的伙伴。它是一个包含各种类型列表的集合,这些列表在安全评估过程中经常使用,都在一个地方。SecLists通过方便地提供安全测试人员可能需要的所有列表,帮助提高安全测试的效率和生产力。列表类型包括用户名、密码、URL、模糊测试有效载荷、敏感数据模式、Web shell等等。测试人员只需将此存储库拉到新的测试机上,他就可以访问到所需的每种类型的列表。

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

EditPlus 中文破解版

EditPlus 中文破解版

体积小,语法高亮,不支持代码提示功能

Atom编辑器mac版下载

Atom编辑器mac版下载

最流行的的开源编辑器