Node-RED:Введение/Взаимодействие с Arduino

Материал из Онлайн справочника
Перейти к навигацииПерейти к поиску

Перевод: Максим Кузьмин
Проверка/Оформление/Редактирование: Мякишев Е.А.



Взаимодействие с Arduino[1]

Есть несколько способов настроить взаимодействие между Arduino и Node-RED. Все они предполагают, что Arduino должна быть подключена к компьютеру-хосту при помощи последовательного USB-соединения.

Примечание

Вы не сможете одновременно использовать IDE Arduino и Arduino, т.к. они будут конфликтовать друг с другом. Таким образом, если вам нужно будет перепрограммировать Arduino при помощи IDE Arduino, то вам сначала нужно будет остановить Node-RED.

Последовательная коммуникация

Поскольку платы Arduino – это устройства, «общающееся» при помощи последовательной коммуникации, для коммуникации с ними можно использовать ноды для последовательной передачи (туда и обратно) данных.

Последовательная коммуникация – очень распространенный способ программирования Arduino с помощью IDE, т.к. позволяет отправлять и получать данные по последовательному порту для взаимодействия с созданным вами проектом. Убедитесь лишь, что у вас выставлена одинаковая скорость коммуникации на обоих концах последовательного порта.

Firmata

Firmata – это протокол для коммуникации между Arduino (или другим микроконтроллером) и компьютером-хостом, обеспечивающий прямой доступ к входным/выходным контактам.

Установка

Сначала вам нужно будет загрузить на Arduino стандартный скетч Firmata при помощи стандартных инструментов загрузки, имеющихся в IDE Arduino. Как правило, для этого в IDE Arduino нужно просто кликнуть на «Файл» > «Примеры» > «Firmata» > «StandardFirmata» (File > Examples > Firmata > StandardFirmata).

Затем вам нужно будет установить в палитру (Palette) Node-RED ноды для Arduino.

Примечание

Убедитесь, что менеджер пакетов «npm -v» имеет как минимум версию 2.x, а если нет, обновите его при помощи следующей команды:

sudo npm i -g npm@2.xhash -r

Поменяйте папку на пользовательскую директорию 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"]]}]

См.также

Внешние ссылки