65.9K
CodeProject 正在变化。 阅读更多。
Home

iotduino 将 JavaScript 带入微秒时代。

starIconstarIconstarIconstarIconstarIcon

5.00/5 (6投票s)

2014 年 12 月 10 日

CPOL

4分钟阅读

viewsIcon

18047

在本文中,我们将介绍如何使用 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 上下载。

 
© . All rights reserved.