与Arduino交互

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

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

Arduino云

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

串行

由于Arduino作为串行设备出现,因此可以使用串行输入/输出节点与之通信。

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

Firmata

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

安装

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

    文件 - 示例 - Firmata - 标准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.5秒滴答","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":"根据输入切换输出","func":"\n// 如果存在,则使其为相反值,否则初始化为false\n// (上下文变量在调用函数之间持久存在)\ncontext.level = !context.level || false;\n\n// 将负载设置为级别并返回\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"),                        // 这是库的引用
   j5board:require("johnny-five").Board({repl:false})   // 这实际上启动了电路板连接...
},

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

最后在Node-RED主目录内安装npm

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

然后您可以在函数中访问Johnny-Five的所有丰富性

var five = context.global.jfive;    // 创建一个简短的别名
var led = new five.Led(13);         // 实例化LED
led.blink(500);                     // 每500毫秒闪烁一次

注意: 这是一个简单但不好的示例,因为每次调用函数时都会创建LED引脚… 因此仅在您只部署一次并且仅调用一次的情况下可以使用。

闪烁 2

以下流程展示了一个更高级的示例,该示例打开和关闭一个闪烁的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 = 开始闪烁,0 = 停止","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"]]}]