与 Arduino 交互

有多种方法可以使用 Node-RED 与 Arduino 进行交互。它们都假设 Arduino 通过 USB 串口连接到主机计算机。

注意: 您不能同时使用 Arduino IDE 和 Arduino 节点,因为它们会产生冲突。如果您希望从 IDE 重新编程 Arduino,您需要停止运行 Node-RED。

Arduino 云

Arduino 云允许与注册为物联网设备的 Arduino 板进行交互。可以在面板中安装节点,以便轻松地从物联网设备轮询数据或接收实时通知(有关详细信息和安装,请参见 https://flows.nodered.org/node/@arduino/node-red-contrib-arduino-iot-cloud)。

串口

由于 Arduino 表现为一个串口设备,因此可以使用串口输入/输出节点与其通信。

如果您使用 IDE 对 Arduino 进行编程,通常就是这种情况,因为您可以通过串口发送和接收输入来与您的创作进行交互。只需确保您在两端设置了相同的串口速度(波特率)。

Firmata

Firmata 是一种用于在 Arduino(以及其他微控制器)和主机计算机之间通信的协议,提供对 IO 引脚的直接访问。

安装

首先,您需要使用标准的 Arduino 软件下载工具将默认的 Firmata 程序(sketch)加载到 Arduino 上。这通常可以在 Arduino IDE 的菜单中找到

    Files - Examples - Firmata - Standard Firmata

然后,您需要将 Node-RED Arduino 节点安装到面板中。

请检查 `npm -v` 的版本至少为 2.x - 如果不是 - 请使用 sudo npm i -g npm@latest hash -r 更新它

将目录更改为您的 Node-RED 用户目录,通常是 ~/.node-red

    cd ~/.node-red

然后安装 Arduino 节点

    npm install node-red-node-arduino

最后重启 Node-RED,并在浏览器中重新加载编辑器。此时,面板中应该有两个新的 Arduino 节点。

要运行一个使用 LED 13 的“闪烁”流,请复制以下流程并将其粘贴到“导入节点”对话框中(在下拉菜单中选择从剪贴板导入,或按 Ctrl-i, Ctrl-v)。点击确定后,在工作区中点击以放置新节点。

[{"id":"d7663aaf.47194","type":"arduino-board","device":""},{"id":"dae8234f.2517e","type":"inject","name":"0.5s tick","topic":"","payload":"","payloadType":"date","repeat":"0.5","crontab":"","once":false,"x":150,"y":100,"z":"359a4b52.ca65b4","wires":[["56a6f8f2.a95908"]]},{"id":"2db61802.d249e8","type":"arduino out","name":"","pin":"13","state":"OUTPUT","arduino":"d7663aaf.47194","x":570.5,"y":100,"z":"359a4b52.ca65b4","wires":[]},{"id":"56a6f8f2.a95908","type":"function","name":"Toggle output on input","func":"\n// If it does exist make it the inverse of what it was or else initialise it to false\n// (context variables persist between calls to the function)\ncontext.level = !context.level || false;\n\n// set the payload to the level and return\nmsg.payload = context.level;\nreturn msg;","outputs":1,"noerr":0,"x":358,"y":100,"z":"359a4b52.ca65b4","wires":[["2db61802.d249e8"]]}]

此流被设置为自动尝试在某个串口上检测板子。如果您需要更改此设置,请双击标记为 Pin 13 的节点——即 Arduino 节点。点击铅笔图标,并根据需要更改端口定义。

点击部署按钮,流程应该开始运行。LED 13 应该开始以每秒一次的频率开关。

功能

Arduino 输出节点目前支持三种操作模式

  • 数字 - 0 或 1
  • 模拟 - 0 到 255
  • 伺服 - 0 到 180

Arduino 输入节点,可在面板中找到但在此示例中未使用,可以支持数字和模拟引脚。每当检测到变化时,输入节点就会发送一条消息。对于数字输入来说这可能没问题,因为它们往往相当稳定,但模拟读数通常会以全采样率(默认:每秒 40 次……)进行。这可以在串口的配置中进行更改,以将其降低到一个更易于管理的速率。

Node.js 的 arduino-firmata 库的详细信息可以在这里找到。


Johnny-Five

您也可以使用流行的 Johnny-Five 库,因为它增加了像 I2C 这样的功能。

一种使用方法是通过 Luis Montes 的 node-red-contrib-gpio 节点,该节点还以一致的方式为许多其他板子增加了支持,例如 Raspberry Pi、BeagleBone Black、Galileo/Edison、Blend Micro、LightBlue Bean、Electric Imp 和 Spark Core。

另一种方法是使其在函数内可用。这可以通过编辑 settings.js 中的 globalContextSettings 部分来实现

functionGlobalContext: {
   jfive:require("johnny-five"),                        // this is the reference to the library
   j5board:require("johnny-five").Board({repl:false})   // this actually starts the board link...
},

我们在这里启动板子连接,以便工作区内的多个函数可以使用它,不过您应该小心确保每个引脚只被访问一次。

最后在您的 Node-RED 主目录中安装 npm

cd ~/.node-red
npm install johnny-five

然后您就可以在函数中访问 Johnny-Five 的所有丰富功能了……

var five = context.global.jfive;    // create a shorter alias
var led = new five.Led(13);         // instantiate the led
led.blink(500);                     // blink it every 500 ms

注意: 这是一个简单但糟糕的例子,因为每次调用函数时都会创建 led 引脚……所以只有在您只部署并调用它一次的情况下才行。

下面的流程展示了一个更高级的例子,它可以打开和关闭一个闪烁的 led,并展示了如何使用上下文来保存状态和 led 引脚的单个实例。

可以通过使用 ctrl-c (复制) / ctrl-i (导入) / ctrl-v (粘贴) 将其导入到工作区。

[{"id":"62f58834.9d0a78","type":"inject","name":"","topic":"","payload":"1","payloadType":"string","repeat":"","crontab":"","once":false,"x":226,"y":326,"z":"359a4b52.ca65b4","wires":[["ae84ad08.517b5"]]},{"id":"ae84ad08.517b5","type":"function","name":"1 = start flash, 0 = stop","func":"var five = context.global.jfive;\ncontext.led = context.led || new five.Led(13);\ncontext.switch = context.switch || 0;\ncontext.switch = msg.payload;\nconsole.log(typeof(context.switch));\nif (context.switch == 1) {\n    context.led.blink(500);\n}\nif (context.switch == 0) {\n    context.led.stop().off();\n}\nreturn msg;","outputs":1,"noerr":0,"x":447,"y":349,"z":"359a4b52.ca65b4","wires":[["df638a80.209c78"]]},{"id":"df638a80.209c78","type":"debug","name":"","active":true,"console":"false","complete":"false","x":645,"y":349,"z":"359a4b52.ca65b4","wires":[]},{"id":"d79bc51d.286438","type":"inject","name":"","topic":"","payload":"0","payloadType":"string","repeat":"","crontab":"","once":false,"x":224.4000244140625,"y":364.60003662109375,"z":"359a4b52.ca65b4","wires":[["ae84ad08.517b5"]]}]