Веб-интерфейсы и программная платформа Node.js становятся все более популярными в современном мире. В этой статье мы рассмотрим проект управления яркостью свечения светодиода, подключенного к Arduino Uno, через веб-интерфейс с помощью платформы Node.js. Если добавить в этот проект WiFi модуль ESP8266, то светодиодом данным способом можно будет управлять из любой точки Земли, в которой есть интернет. Подобные проекты весьма популярны в рамках концепции интернета вещей (IoT – Internet of Things). Для примера можно посмотреть похожий проект управления сервомотором по Wi-Fi с помощью Arduino и веб-браузера.
Что такое Node.js
Node или Node.js - это программная платформа, основанная на движке V8 (транслирующем JavaScript в машинный код), превращающая JavaScript из узкоспециализированного языка в язык общего назначения. Node.js добавляет возможность JavaScript взаимодействовать с устройствами ввода-вывода через свой API, который написан на C++, подключать другие внешние библиотеки, написанные на разных языках, обеспечивая вызовы к ним из JavaScript-кода. Node.js применяется преимущественно на сервере, выполняя роль веб-сервера, но есть возможность разрабатывать на Node.js и десктопные оконные приложения и даже программировать микроконтроллеры (википедия).
В этом проекте мы будем управлять яркостью свечения светодиода двумя способами:
- при помощи JavaScript кода в платформе Node.js;
- с помощью платформы Node.js и веб-интерфейса из любого браузера. В данном случае плата Arduino будет выступать в роли веб-сервера, а HTML страницы будут располагаться на вашем компьютере.
Необходимые компоненты
Аппаратное обеспечение
- Плата Arduino Uno (купить на AliExpress).
- Светодиод (купить на AliExpress).
- Резистор 1 кОм (купить на AliExpress).
Программное обеспечение
- Arduino IDE – для загрузки скетча в плату Arduino Uno.
- Firmata – это протокол для взаимодействия с различными микроконтроллерами с помощью программного обеспечения на компьютере или смартфоне. Программное обеспечение Firmata можно скачать для взаимодействия практически с любыми платами, например, Arduino, Teensy. Библиотека Firmata уже встроена в Arduino IDE, поэтому у вас не будет необходимости скачивать ее откуда либо. В качестве примера ее использования можно посмотреть статью про управление Arduino с помощью Raspberry Pi и pyFirmata.
- Johnny-Five – JavaScript платформа, ориентированная на взаимодействие с робототехникой и интернетом вещей. Используется как своеобразный мост (шлюз) между платой Arduino и компьютером. Более подробно объяснена далее в данной статье.
Схема проекта
Схема проекта управления светодиодом с помощью платы Arduino и платформы Node.js показана на следующем рисунке. Как видите, она очень проста – нужно всего лишь подключить светодиод к плате Arduino.
Установка платформы Node.js
Выполните следующую последовательность шагов.
Шаг 1. Скачайте Node.js с официального сайта.
Шаг 2. Запустите скачанный exe-файл и следуйте инструкциям установщика.
Шаг 3. После установки перезагрузите компьютер чтобы получить возможность использовать все функции Node.js.
Шаг 4. Чтобы проверить что Node.js правильно установлена можно в командной строке набрать команду Node –v.
Шаг 5. После исполнения этой команды вам будет показана версия вашей Node.js (если она действительно установлена).
Установка библиотеки Johnny-Five
После установки Node.js создайте на вашем компьютере отдельную папку (с именем, например, “LED_Control”) чтобы хранить все файлы рассматриваемого нами проекта в одном месте. Теперь скачайте в эту папку библиотеку Johnny-Five, выполнив следующую последовательность шагов.
Шаг 1. Откройте окно с командной строкой.
Шаг 2. Смените папку на “LED_Control” (или как она у вас названа) с помощью команды ‘cd’. Кто застал времена операционной системы MS DOS наверняка хорошо помнят эту команду.
Шаг 3. Выполните команду ‘npm install johnny-five’.
Шаг 4. В результате выполнения этой команды установятся все компоненты библиотеки Johnny-Five.
Шаг 5. Также для работы нашего проекта необходимо будет установить еще три библиотеки:
- express: серверная оболочка HTTP;
- socket.io: библиотека WebSockets;
- serialport: оболочка последовательного порта.
Шаг 6. Введите в командной строке следующие команды одна за другой (не все сразу) чтобы установить эти библиотеки:
npm install express
npm install socket.io
npm install serialport
Рассмотрим последовательно две составляющих нашего проекта:
- мигание светодиодом с помощью Arduino и Node.js;
- управление яркостью свечения светодиода через веб-интерфейс с помощью Arduino и Node.js.
Мигание светодиодом с помощью Arduino и Node.js
Для этого нам необходимо чтобы плата Arduino могла исполнять команды с компьютера. Чтобы получить такую возможность нам необходимо установить программное обеспечение Firmata в плату Arduino Uno, выполнив следующую последовательность шагов:
- Подключите плату Arduino Uno к компьютеру с помощью USB кабеля.
- Откройте Arduino IDE и выберите там в инструментах (Tools) плату Arduino Uno. Если используете другой тип платы Arduino, то вам следует выбрать его.
- Выберите COM порт, к которому подключена плата Arduino Uno.
- Теперь в пункте меню Menu -> File -> Examples -> Firmata -> StandardFirmata найдите скетч Firmata.
- Загрузите этот скетч (“StandardFirmata”) в плату Arduino выбрав пункт меню File -> Upload.
После этого плата Arduino будет готова к исполнению команд, поступающих с компьютера.
Написание программы Node.js для мигания светодиодом
Чтобы написать программу Node.js откройте любой текстовый редактор ((Notepad, Notepad++ и т.п.), вставьте туда код программы, приведенный в конце данной статьи и сохраните его с расширением ‘.js’ (например, blink_led.js) в папку “LED_Control”, которую вы создали ранее для хранения всех файлов этого проекта. Здесь же мы обсудим наиболее важные фрагменты этого кода.
Вначале инициализируем контакт платы Arduino, к которому подключен светодиод – в нашем случае это контакт 5 платы Arduino. Словосочетание ‘var’ в Node.js обозначает объявление переменной.
1 |
var led_pin=5; |
Также в программе необходимо подключить модуль johnny-five и выбрать плату. Модули в Node.js – это практически то же самое что и библиотеки в Arduino. Функция ‘require()’ позволяет получить доступ к модулю.
1 2 |
var johnny_five=require("johnny-five"); var arduino_board=new johnny_five.Board(); |
Функция console.log позволяет нам вывести сообщение на экран. Контакт, к которому подключен светодиод, устанавливается в режим работы на вывод данных. Далее следует задержка между миганиями светодиода.
1 2 3 |
console.log("LED has Started Blinking!"); var led = new johnny_five.Led(led_pin); led.blink(100); |
Теперь, чтобы запустить программу, выполните следующую последовательность шагов:
- откройте командную строку;
- с помощью команды ‘cd’ смените текущий каталог на каталог “LED_Control”;
- запустите на выполнение команду ‘Node led_blink.js’. Если она успешно выполнится, то вы увидите сообщение "LED has Started Blinking!" как показано на следующем рисунке.
Светодиод, подключенный к контакту 5 платы Arduino, начнет мигать. На этом первая часть нашего проекта будет закончена.
Управление яркостью свечения светодиода через веб-интерфейс с помощью Arduino и Node.js
В этой части проекта нам необходимо будет произвести такие операции как конфигурация платы Arduino Uno, установка веб-интерфейса и написание программы для платформы Node.js. Рассмотрим эти операции более подробно.
Конфигурация платы Arduino Uno для управления яркостью свечения светодиода
Для этого вам необходимо будет загрузить в плату Arduino Uno скетч “arduino_control.ino”. Этот скетч вместе с другими необходимыми файлами для проекта вы можете скачать по следующей ссылке. Также он приведен в конце данной статьи. Рассмотрим основные фрагменты кода скетча “arduino_control.ino”.
Вначале необходимо установить скорость 9600 бод.
1 |
Serial.begin(9600); |
Далее мы непрерывно проверяем данные, поступающие в последовательный порт, и передаем принятый байт на контакт 5 платы Arduino Uno. На этом контакте доступно формирование ШИМ (широтно-импульсной модуляции).
1 2 |
while(!Serial.available()); analogWrite(5, Serial.read()); |
На этом конфигурация платы Arduino Uno для этой части проекта будет закончена. То есть мы просто принимаем байты из последовательного порта связи и используем значения этих байтов для формирования ШИМ на контакте 5 платы Arduino Uno – соответственно, благодаря изменениям скважности (коэффициента заполнения) ШИМ изменяется и яркость свечения светодиода.
Установка веб-интерфейса
Чтобы управлять яркостью свечения светодиода с помощью веб-интерфейса мы напишем небольшой фрагмент кода в HTML файл – в этом случае наш веб-интерфейс будет работать в любом браузере. Для этого выполните следующую последовательность шагов:
1. Внутри каталога “LED_Control” (мы его создали ранее чтобы хранить в нем все файлы нашего проекта) создайте новый каталог с именем “public”.
2. Скопируйте в этот каталог файлы “index.html” и “style.css”, которые вы ранее уже скачали в составе архива по этой ссылке.
3. Эти файлы создадут на веб-странице слайдер, с помощью которого можно будет управлять яркостью свечения светодиода используя Node.js и Arduino.
Для управления светодиодом с помощью данной веб-страницы со слайдером нам необходимо будет создать веб-сервер, на котором и будет располагаться (хоститься) эта веб-страница.
Программа Node.js для управления яркостью свечения светодиода
В этой части проекта мы напишем скетч “brightness_control.js” используя Node.js. Запуск на выполнение этого скетча будет во многом похож на мигание светодиода с помощью Node.js, которое мы рассмотрели в первой части этой статьи.
Для написания программы для Node.js откройте любой текстовый редактор (Notepad, Notepad++ и т.п.), скопируйте в него код программы ‘brightness_control”, приведенный в конце данной статьи (также его можно скачать по этой ссылке) и сохраните его с расширением ‘.js’ – то есть вы получите файл brightness_control.js в каталоге “LED_Control”, который вы создали ранее для хранения всех файлов этого проекта.
Также, как и в программе для мигания светодиодом, которую мы рассмотрели ранее в данной статье, в этой программе нам тоже понадобятся модули (библиотеки). Нам будут необходимы модули ‘express’, ‘http’ и ‘serial port’.
1 2 3 4 5 |
var express = require('express'); app = express(); server = require('http').createServer(app); io = require('socket.io').listen(server); var SerialPort = require("serialport")//.SerialPort |
После этого установим необходимый COM порт и скорость передачи для него. Не забудьте перед названием COM порта записать символ ‘/’.
1 |
var serialPort = new SerialPort("/COM4", { baudRate: 9600 }); |
Далее начнем “слушать сервер” (listen the server) на порту 8080.
1 |
server.listen(8080); |
Для начала установим яркость свечения светодиода равную 0. Затем мы будем передавать желаемое значение яркости с помощью модуля сокетов (sockets module), который по сути является модулем веб-сокетов. Эти данные будут приниматься веб-интерфейсом с помощью протокола сокетов (socket protocol).
1 2 3 4 5 6 |
io.sockets.on('connection', function (socket) { socket.on('led', function (data) { brightness = data.value; var buf = new Buffer(1); buf.writeUInt8(brightness, 0); serialPort.write(buf); |
После этого мы будем передавать (emit) значение яркости светодиода, полученное от сокета (socket), на контакт, к которому подключен светодиод (LED pin).
1 2 3 4 |
io.sockets.emit('led', {value: brightness}); }); socket.emit('led', {value: brightness}); }); |
Также для целей отладки добавим в конец программы команду вывода сообщения на экран. Делать мы это будем с помощью команды console.log.
1 |
console.log("Web Server Started go to 'http://localhost:8080' in your Browser."); |
Теперь, чтобы запустить программу на выполнение, выполните следующую последовательность шагов:
- откройте окно с командной строкой;
- с помощью команды ‘cd’ смените текущий каталог на каталог “LED_Control”;
- запустите на выполнение команду ‘Node brightness_control.js’. Если она успешно выполнится, то вы увидите сообщение "Web Server Started go to "http://localhost:8080" in your Browser." как показано на следующем рисунке.
Теперь запустите в браузер и напишите там в строке адреса (url) “localhost:8080”. Чтобы изменять яркость свечения светодиода просто передвигайте слайдер на созданной веб-странице.
Исходный код программы (скетча)
Все файлы для этого проекта можно скачать по следующей ссылке.
Программа Node.js для мигания светодиодом
1 2 3 4 5 6 7 8 |
var led_pin=5; var johnny_five=require("johnny-five"); var arduino_board=new johnny_five.Board(); arduino_board.on("ready", function() { console.log("LED has Started Blinking!"); var led = new johnny_five.Led(led_pin); led.blink(100); }); |
Программа для Arduino для управления яркостью свечения светодиода
1 2 3 4 5 6 7 8 9 |
void setup() { Serial.begin(9600); } void loop() { while(!Serial.available()); // ждем пока байт не будет приянт analogWrite(5, Serial.read()); //передаем принятый байт на контакт 5 } |
Программа Node.js для управления яркостью свечения светодиода
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
var express = require('express'); app = express(); server = require('http').createServer(app); io = require('socket.io').listen(server); var SerialPort = require("serialport")//.SerialPort var serialPort = new SerialPort("/COM4", { baudRate: 9600 }); server.listen(8080); app.use(express.static('public')); var brightness = 0; io.sockets.on('connection', function (socket) { socket.on('led', function (data) { brightness = data.value; var buf = new Buffer(1); buf.writeUInt8(brightness, 0); serialPort.write(buf); io.sockets.emit('led', {value: brightness}); }); socket.emit('led', {value: brightness}); }); console.log("Web Server Started go to 'http://localhost:8080' in your Browser."); |
При выполнении программы появляется следующая ошибка:
C:\LED_Control>node blink_led.js
C:\LED_Control\node_modules\johnny-five\lib\board.js:42
serialport.list().then(results => {
^
TypeError: serialport.list is not a function
at Board.detect (C:\LED_Control\node_modules\johnny-five\lib\board.js:42:16)
at new Board (C:\LED_Control\node_modules\johnny-five\lib\board.js:291:23)
at Object. (C:\LED_Control\blink_led.js:2:11)
at Module._compile (node:internal/modules/cjs/loader:1256:14)
at Module._extensions..js (node:internal/modules/cjs/loader:1310:10)
at Module.load (node:internal/modules/cjs/loader:1119:32)
at Module._load (node:internal/modules/cjs/loader:960:12)
at Function.executeUserEntryPoint [as runMain] (node:internal/modules/run_main:81:12)
at node:internal/main/run_main_module:23:47
Node.js v18.17.1
А библиотека для работы с последовательным портом нормально установилась (npm install serialport)?