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

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

Feb 17, 2025 pm 12:58 PM

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

热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

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

热门文章

<🎜>:泡泡胶模拟器无穷大 - 如何获取和使用皇家钥匙
4 周前 By 尊渡假赌尊渡假赌尊渡假赌
北端:融合系统,解释
4 周前 By 尊渡假赌尊渡假赌尊渡假赌
Mandragora:巫婆树的耳语 - 如何解锁抓钩
3 周前 By 尊渡假赌尊渡假赌尊渡假赌

热工具

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

禅工作室 13.0.1

禅工作室 13.0.1

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

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

热门话题

Java教程
1672
14
CakePHP 教程
1428
52
Laravel 教程
1332
25
PHP教程
1277
29
C# 教程
1257
24
Python vs. JavaScript:学习曲线和易用性 Python vs. JavaScript:学习曲线和易用性 Apr 16, 2025 am 12:12 AM

Python更适合初学者,学习曲线平缓,语法简洁;JavaScript适合前端开发,学习曲线较陡,语法灵活。1.Python语法直观,适用于数据科学和后端开发。2.JavaScript灵活,广泛用于前端和服务器端编程。

JavaScript和Web:核心功能和用例 JavaScript和Web:核心功能和用例 Apr 18, 2025 am 12:19 AM

JavaScript在Web开发中的主要用途包括客户端交互、表单验证和异步通信。1)通过DOM操作实现动态内容更新和用户交互;2)在用户提交数据前进行客户端验证,提高用户体验;3)通过AJAX技术实现与服务器的无刷新通信。

JavaScript在行动中:现实世界中的示例和项目 JavaScript在行动中:现实世界中的示例和项目 Apr 19, 2025 am 12:13 AM

JavaScript在现实世界中的应用包括前端和后端开发。1)通过构建TODO列表应用展示前端应用,涉及DOM操作和事件处理。2)通过Node.js和Express构建RESTfulAPI展示后端应用。

了解JavaScript引擎:实施详细信息 了解JavaScript引擎:实施详细信息 Apr 17, 2025 am 12:05 AM

理解JavaScript引擎内部工作原理对开发者重要,因为它能帮助编写更高效的代码并理解性能瓶颈和优化策略。1)引擎的工作流程包括解析、编译和执行三个阶段;2)执行过程中,引擎会进行动态优化,如内联缓存和隐藏类;3)最佳实践包括避免全局变量、优化循环、使用const和let,以及避免过度使用闭包。

Python vs. JavaScript:社区,图书馆和资源 Python vs. JavaScript:社区,图书馆和资源 Apr 15, 2025 am 12:16 AM

Python和JavaScript在社区、库和资源方面的对比各有优劣。1)Python社区友好,适合初学者,但前端开发资源不如JavaScript丰富。2)Python在数据科学和机器学习库方面强大,JavaScript则在前端开发库和框架上更胜一筹。3)两者的学习资源都丰富,但Python适合从官方文档开始,JavaScript则以MDNWebDocs为佳。选择应基于项目需求和个人兴趣。

Python vs. JavaScript:开发环境和工具 Python vs. JavaScript:开发环境和工具 Apr 26, 2025 am 12:09 AM

Python和JavaScript在开发环境上的选择都很重要。1)Python的开发环境包括PyCharm、JupyterNotebook和Anaconda,适合数据科学和快速原型开发。2)JavaScript的开发环境包括Node.js、VSCode和Webpack,适用于前端和后端开发。根据项目需求选择合适的工具可以提高开发效率和项目成功率。

C/C在JavaScript口译员和编译器中的作用 C/C在JavaScript口译员和编译器中的作用 Apr 20, 2025 am 12:01 AM

C和C 在JavaScript引擎中扮演了至关重要的角色,主要用于实现解释器和JIT编译器。 1)C 用于解析JavaScript源码并生成抽象语法树。 2)C 负责生成和执行字节码。 3)C 实现JIT编译器,在运行时优化和编译热点代码,显着提高JavaScript的执行效率。

从网站到应用程序:JavaScript的不同应用 从网站到应用程序:JavaScript的不同应用 Apr 22, 2025 am 12:02 AM

JavaScript在网站、移动应用、桌面应用和服务器端编程中均有广泛应用。1)在网站开发中,JavaScript与HTML、CSS一起操作DOM,实现动态效果,并支持如jQuery、React等框架。2)通过ReactNative和Ionic,JavaScript用于开发跨平台移动应用。3)Electron框架使JavaScript能构建桌面应用。4)Node.js让JavaScript在服务器端运行,支持高并发请求。

See all articles