有多种方法可以使用 Node-RED 与 Arduino 进行交互。它们都假设 Arduino 通过 USB 串口连接到主机计算机。
注意: 您不能同时使用 Arduino IDE 和 Arduino 节点,因为它们会产生冲突。如果您希望从 IDE 重新编程 Arduino,您需要停止运行 Node-RED。
Arduino 云允许与注册为物联网设备的 Arduino 板进行交互。可以在面板中安装节点,以便轻松地从物联网设备轮询数据或接收实时通知(有关详细信息和安装,请参见 https://flows.nodered.org/node/@arduino/node-red-contrib-arduino-iot-cloud)。
由于 Arduino 表现为一个串口设备,因此可以使用串口输入/输出节点与其通信。
如果您使用 IDE 对 Arduino 进行编程,通常就是这种情况,因为您可以通过串口发送和接收输入来与您的创作进行交互。只需确保您在两端设置了相同的串口速度(波特率)。
Firmata 是一种用于在 Arduino(以及其他微控制器)和主机计算机之间通信的协议,提供对 IO 引脚的直接访问。
首先,您需要使用标准的 Arduino 软件下载工具将默认的 Firmata 程序(sketch)加载到 Arduino 上。这通常可以在 Arduino IDE 的菜单中找到
Files - Examples - Firmata - Standard Firmata
然后,您需要将 Node-RED Arduino 节点安装到面板中。
将目录更改为您的 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 输出节点目前支持三种操作模式
Arduino 输入节点,可在面板中找到但在此示例中未使用,可以支持数字和模拟引脚。每当检测到变化时,输入节点就会发送一条消息。对于数字输入来说这可能没问题,因为它们往往相当稳定,但模拟读数通常会以全采样率(默认:每秒 40 次……)进行。这可以在串口的配置中进行更改,以将其降低到一个更易于管理的速率。
Node.js 的 arduino-firmata 库的详细信息可以在这里找到。
您也可以使用流行的 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"]]}]
版权所有 OpenJS 基金会和 Node-RED 贡献者。保留所有权利。OpenJS 基金会拥有注册商标并使用商标。有关 OpenJS 基金会的商标列表,请参阅我们的商标政策和商标列表。未在 OpenJS 基金会商标列表上标明的商标和徽标是其各自所有者的商标™或注册®商标。使用它们并不意味着与其有任何关联或得到其认可。
OpenJS 基金会 | 使用条款 | 隐私政策 | OpenJS 基金会章程 | 商标政策 | 商标列表 | Cookie 政策