iotduino 将 JavaScript 带入微秒时代。





5.00/5 (6投票s)
在本文中,我们将介绍如何使用 Node/JavaScript 为 Arduino 兼容的 PCDuino 开发物联网应用。我们将 JavaScript 带入微秒级领域,其中 digitalWrite 操作需要 6-7 微秒,digitalRead 操作需要 4-5 微秒。
在本文中,我们将介绍如何使用 Node/JavaScript 为 Arduino 兼容的 PCDuino 开发物联网应用。我们将 JavaScript 带入微秒级领域,其中 digitalWrite 操作需要 6-7 微秒,digitalRead 操作需要 4-5 微秒。
物联网项目有许多可用的技术和框架。本文重点介绍使用 Node.js(软件方面)和 PCDuino v3 控制器(硬件方面)。PCDuino v3 价格约为 50 欧元,是一款小巧但功能强大的迷你 PC 和开发板,可访问硬件 GPIO(通用输入输出引脚)。GPIO 引脚的物理布局与知名的 Arduino UNO 板完全相同。目前,操作系统可以选择 Android 4.2 和 Ubuntu 12.04。在使用 Ubuntu 时可以安装 Node.js,它可以用于访问硬件资源(例如,用于读取温度传感器)、提供 HTTP 服务器实例以及创建 Web 应用程序。要访问硬件资源,需要使用官方 npm 仓库中提供的 iotduino 开源模块。
iotduino 模块能够复制以下知名的 Arduino 特定功能
- pinMode( pin, state) - 将引脚模式设置为 INPUT (0x0)、OUTPUT (0x1) 或 INPUT_PULLUP (0x2)
- digitalRead( pin) - 读取选定引脚的当前状态。
- digitalWrite( pin, state) - 在使用 OUTPUT 作为状态参数调用 pinMode 后,将引脚状态设置为 LOW (0x0) 或 HIGH (0x1)。
- analogRead( pin) - 读取模拟引脚的值。引脚 A0 和 A1 具有 6 位 ADC 分辨率(因此方法返回的值在 [0, 63] 区间内),而引脚 A2、A3、A4 和 A5 具有 12 位 ADC 分辨率(因此方法返回的值在 [0, 4095] 区间内)。请注意,ADC 参考电压为 3.3V(嗯,大致如此,取决于许多因素),因此您可以测量高达 3.3V 的正电压(如果需要,可以使用电阻分压电路测量更高的电压)。
- analogWrite( pin, value) - 在选定引脚上创建 PWM 效果。支持的引脚为 GPIO3、GPIO5、GPIO6、GPIO9、GPIO10 和 GPIO11。value 参数是 [0, 255] 范围内的整数。该方法与 setPwmFrequency 方法结合使用。
- setPwmFrequency( pin, frequency) - 为指定的引脚设置 PWM 频率。引脚 GPIO5 和 GPIO6 仅支持:195Hz、260Hz、390Hz、520Hz 和 781Hz,而引脚 GPIO3、GPIO9、GPIO10 和 GPIO11 支持 [126, 2000]Hz 范围内的整数值。
- pulseIn( pin, state, timeout) - 读取指定引脚和给定状态的脉冲时间。它以微秒为单位返回值。
- micros() - 读取自 Epoch(1970 年 1 月 1 日,00:00:00 UTC)以来的已用微秒数(C/C++ 中的 unsigned long 类型取模)。
- delay( milliseconds) - 将代码执行暂停指定的毫秒数。
- delayMicroseconds( microseconds) - 将代码执行暂停指定的微秒数。
为了简化代码读取,以下常量组可用
- PinMode - 定义引脚模式状态。可能的值:INPUT、OUTPUT 和 INPUT_PULLUP。替代方案:使用 0、1 和 2。
- PinState - 定义可能的引脚状态。可能的值:LOW 和 HIGH。替代方案:使用 0 和 1。
- Pins - 定义存在的引脚。可能的值:GPIO0、GPIO1、... GPIO23、A0、A1、A2、A3、A4、A5。替代方案:使用 0、1、... 23 来标识 GPIO,使用 0、1、2、3、4、5 来标识模拟引脚。
安装此模块非常简单
npm install iotduino
用于本地安装(仅限于特定应用程序),或
npm install -g iotduino
用于全局安装(可供任何 Node 应用程序使用)
在 Linux 系统上,必须使用 sudo 或以 root 用户登录才能全局安装此模块。
如果在安装过程中出现以下错误
Error: Cannot find module 'iotduino'
请检查 NODE_PATH 变量(使用 echo $NODE_MODULES)以验证它是否指向正确的位置(通常是 /usr/local/lib/node_modules)。
作为最基本的用法示例,让我们考虑一个 LED 闪烁场景
var duino = require( 'iotduino'), pinMode = duino.PinMode, pinState = duino.PinState, pins = duino.Pins, ledPin = pins.GPIO13; // pin 13 (GPIO13) is set as OUTPUT duino.pinMode( ledPin, pinMode.OUTPUT); // repeat every 500 milliseconds, 2 times per second setInterval( function () { // alternate the pin state between HIGH and LOW duino.digitalWrite( ledPin, !duino.digitalRead( ledPin)); }, 500);
GPIO13 连接到 PCDuino v3 板上的内置 LED,与 Arduino UNO 板上的情况相同,因此此示例无需任何额外工作或外部组件即可正常工作。创建一个 blink.js 文件,复制/粘贴上面的代码,保存然后执行
node blink.js
现在,板载 LED 每秒应闪烁约两次。
读取 HC-SR04 超声波传感器(用于测量高达 4 米的距离,精度约为 2 厘米)也非常简单
var duino = require( 'iotduino'), pinMode = duino.PinMode, pinState = duino.PinState, pins = duino.Pins, trigPin = pins.GPIO2, echoPin = pins.GPIO3, distanceCm = -1; // the trigger pin (GPIO2) is set as OUTPUT duino.pinMode( trigPin, pinMode.OUTPUT); // the echo pin (GPIO3) is set as INPUT duino.pinMode( echoPin, pinMode.INPUT); // read the sensor every 333 milliseconds, ~3 times per second setInterval ( function () { // the sensor receives LOW at the trigger pin, // to prepare it for data reading duino.digitalWrite( trigPin, pinState.LOW); // wait for the sensor to get ready duino.delayMicroseconds( 2); // inform the sensor that we want to make a reading duino.digitalWrite( trigPin, pinState.HIGH); duino.delayMicroseconds( 10); // end the commands chain to the sensor duino.digitalWrite( trigPin, pinState.LOW); // read the value HIGH time period from the sensor // and compute the distance based on it and the physical laws distanceCm = duino.pulseIn( echoPin, pinState.HIGH, 100000) / 58.0; // show the distance value in the console console.log( "Distance: " + distanceCm.toFixed(2) + " cm"); }, 333);
上述示例需要以下硬件连接
- 传感器的 trig 引脚连接到 PCDuino 板的 GPIO2 引脚
- 传感器的 echo 引脚连接到 PCDuino 板的 GPIO3 引脚
- 传感器的 VCC 引脚连接到电源的 5V
- 传感器的 GND 引脚连接到电源的 GND。
注意: HC-SR04 传感器板需要 5V 电源。虽然 PCDuino v3 GPIO 引脚与 Arduino UNO 板的引脚功能相同(或几乎相同),但它们不耐 5V。因此,需要一个从 5V 到 3.3V 再返回的硬件电压电平转换器,以避免对 GPIO 和主板造成永久性损坏。
iotduino 模块是使用原生 C/C++ 代码编写的。在 PCDuino v3 板上进行的基准测试显示,digitalWrite 操作需要 6-7 微秒(约 140 - 160 KHz),digitalRead 操作需要 4-5 微秒(约 200 - 250 KHz)。测试是使用一百万(1,000,000)次读/写操作完成的。
原生代码执行速度足够快,可以与 DHT22 温湿度传感器使用的自定义 1-Wire 通信协议一起使用(与该传感器的通信对时间非常敏感)。
该模块的源代码可在 github 上下载。