Node-RED:Введение/Взаимодействие с Arduino
Взаимодействие с Arduino[1]
Есть несколько способов настроить взаимодействие между Arduino и Node-RED. Все они предполагают, что Arduino должна быть подключена к компьютеру-хосту при помощи последовательного USB-соединения.
Последовательная коммуникация
Поскольку платы Arduino – это устройства, «общающееся» при помощи последовательной коммуникации, для коммуникации с ними можно использовать ноды для последовательной передачи (туда и обратно) данных.
Последовательная коммуникация – очень распространенный способ программирования Arduino с помощью IDE, т.к. позволяет отправлять и получать данные по последовательному порту для взаимодействия с созданным вами проектом. Убедитесь лишь, что у вас выставлена одинаковая скорость коммуникации на обоих концах последовательного порта.
Firmata
Firmata – это протокол для коммуникации между Arduino (или другим микроконтроллером) и компьютером-хостом, обеспечивающий прямой доступ к входным/выходным контактам.
Установка
Сначала вам нужно будет загрузить на Arduino стандартный скетч Firmata при помощи стандартных инструментов загрузки, имеющихся в IDE Arduino. Как правило, для этого в IDE Arduino нужно просто кликнуть на «Файл» > «Примеры» > «Firmata» > «StandardFirmata» (File > Examples > Firmata > StandardFirmata).
Затем вам нужно будет установить в палитру (Palette) Node-RED ноды для Arduino.
Поменяйте папку на пользовательскую директорию Node-RED. Как правило это «~/.node-red».
cd ~/.node-red
Затем установите ноды Arduino:
npm install node-red-node-arduino
Наконец, перезапустите Node-RED и перезагрузите страницу с браузерным редактором. В палитре Node-RED должны появиться две новых Arduino-ноды.
Мигание светодиодом
Чтобы запустить поток для мигания светодиодом, подключенным к 13 контакту, скопируйте JSON-код ниже, кликните на кнопку с тремя полосками справа вверху, а затем на «Import» > «Clipboard» (или просто нажмите Ctrl + I ). Откроется новое окно – вставьте в поле посередине скопированный JSON-код, нажмите на кнопку «Import», разместите поток в редакторе и кликните на правую кнопку мыши.
[{"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"]]}]
Этот поток настроен на автоматическое определение платы, подключенной к последовательному порту. Если вам нужно поменять порт, сделайте двойной клик по Arduino-ноде «Pin 13», затем кликните на кнопку с иконкой карандаша и задайте нужный порт.
Затем кликните на кнопку «Deploy», после чего поток должен начать работать. Светодиод на 13 контакте должен начать включаться и выключаться раз в секунду.
Что умеют делать Arduino-ноды
Выходная нода Arduino в данный момент поддерживает три режима работы:
- Цифровые данные («0» или «1»)
- Аналоговые данные (от «0» до «255»)
- Сервопривод (от «0» до «180»)
Входная нода Arduino (она не используется в потоке выше) поддерживает работу и с цифровыми, и аналоговыми контактами. Она отправляет сообщение всякий раз, когда обнаруживает какое-либо изменение состояния контакта. Это не страшно, если вы работаете с цифровыми контактами, т.к. они, как правило, достаточно стабильны, но данные на аналоговых контактах склонны меняться с большой частотой (по умолчанию – 40 раз в секунду...). Но в настройках последовательного порта ее можно понизить до более приемлемого уровня.
Более подробно о Node.js-библиотеке «arduino-firmata» можно почитать тут.
Johnny-Five
Вы также можете воспользоваться популярной библиотекой «Johnny-Five», т.к. с ее помощью можно использовать, например, интерфейс I2C.
Один из способов воспользоваться ею – при помощи нодов «node-red-contrib-gpio», разработанных Луи Монтесом. Они поддерживают работу не только с Arduino, но и с другими платами вроде Raspberry Pi, BeagleBone Black, Galileo/Edison, Blend Micro, LightBlue Bean, Electric Imp и Spark Core, причем эта поддержка унифицирована.
Еще один способ – разрешить использование «Johnny-Five» в функциях. Это можно сделать, отредактировав секцию «globalContextSettings» в файле «settings.js» как показано ниже:
functionGlobalContext: {
// Создаем указатель к библиотеке:
jfive:require("johnny-five"),
// Создаем объект для управления платой:
j5board:require("johnny-five").Board({repl:false})
},
Мы создаем здесь объект для управления платой, чтобы ее можно было использовать в многочисленных функциях редактора Node-RED. Но имейте в виду, что одновременно можно получить доступ только к одному контакту.
Наконец, устанавливаем npm-пакет библиотеки из домашней директории Node-RED:
cd ~/.node-red
npm install johnny-five
И затем мы можем использовать все богатство функционала Johnny-Five в функциях Node-RED:
// Создаем более короткое название для объекта библиотеки:
var five = context.global.jfive;
// Создаем объект для светодиода:
var led = new five.Led(13);
// Мигаем светодиодом раз в 500 мс:
led.blink(500);
Мигание светодиодом (2)
В JSON-коде ниже представлен более продвинутый поток, включающий и выключающий светодиод, а также показывающий использование контекста для хранения состояния и объекта для контакта, к которому подключен светодиод.
Чтобы импортировать этот JSON-код в Node-RED, скопируйте его, откройте редактор, а затем нажмите горячие клавиши Ctrl + I (это откроет меню «Import») и 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"]]}]
См.также
Внешние ссылки