Управление Arduino с помощью JavaScript и Johnny-Five

Arduino — один из самых простых способов для программистов начать работать с электроникой. Существуют сотни начальных проектов, но новички часто откладывают дело — учить новый язык ради эксперимента не всегда хочется. К счастью, можно работать с микроконтроллерами на языке, который вы уже знаете: JavaScript.
В этой статье мы не ограничимся миганием светодиода. Мы покажем, как с помощью Johnny-Five управлять серво-приводом с клавиатуры компьютера. Всё программируется на JavaScript, а Arduino выполняет команды через протокол Firmata.
Важно: одно предложение о терминах
- Johnny-Five — высокоуровневая JavaScript-библиотека для робототехники и управления микроконтроллерами.
- Firmata — протокол, который позволяет отправлять команды с компьютера на Arduino и управлять его ножками без загрузки собственного скетча с низкоуровневой логикой.
Список компонентов
Для проекта вам потребуется:
- Arduino Uno или совместимая плата (в оригинальном обзоре цена указывалась в USD). Подойдёт любая плата с поддержкой PWM.
- Хоббийный сервопривод, совместимый с Arduino (обычный SG90/микро-серво подойдёт для демонстрации).
- Несколько проводов типа «male–female» / «dupont» для подключения.
- USB-кабель для соединения Arduino с компьютером.

Если вы используете плату отличную от Uno, убедитесь, что у неё есть ножки с поддержкой ШИМ (PWM). Для серво обычно нужен импульс 50 Гц, но библиотека абстрагирует эти детали для большинства случаев.
Подключение и схема
Подключите сервопривод к Arduino так:

Кратко:
- Линия питания VCC (обычно красный) — к 5V Arduino.
- Линия GND (чёрный или коричневый) — к GND Arduino.
- Сигнальный провод (жёлтый/оранжевый) — к цифровой ножке, поддерживающей PWM (в примере — D10).
Важно: Многие серво потребляют заметный ток в пике. Для надёжной работы в реальных проектах используйте отдельное питание для серво с общим «землём» (GND), если сервопривод питается от внешнего источника. Для небольшой демонстрации на одном серво с короткими движениями питания от 5V Arduino обычно хватает.
Примечание: в Arduino-платах ножки с PWM обычно помечаются символом ~ рядом с номером. Подключайте сигнальный провод именно к PWM-выводу, если вы хотите управлять скоростью вращения/положением серво через библиотеку.
Подготовка Arduino IDE и загрузка Firmata
- Если ещё не установлено, загрузите и установите Arduino IDE с официального сайта.
- Подключите плату к компьютеру через USB.
- В Arduino IDE в меню Tools выберите вашу плату (Board) и порт (Port).
- В меню File > Examples > Firmata найдите и откройте скетч StandardFirmataPlus.
- Загрузите (Upload) этот скетч на плату без изменений.
StandardFirmataPlus — это стандартный скетч, который ставит Arduino в режим ожидания команд извне (по протоколу Firmata). После загрузки плата будет реагировать на команды от компьютера.

Установка Node.js и Johnny-Five
Для работы с Johnny-Five нужен Node.js и менеджер пакетов NPM.
- Скачайте Node.js с официального сайта. В исходном материале использовалась рекомендуемая версия 8.9.4 LTS. На современных машинах подойдёт любая актуальная LTS-версия Node.js.
- Установите Node.js и убедитесь, что установщик добавил node и npm в системный PATH.
- Откройте терминал (в Windows — CMD или PowerShell). Инициализируйте npm в директории проекта:
npm initПросто придерживайтесь подсказок; для простого проекта можно оставлять значения по умолчанию.
- Установите Johnny-Five и пакет для считывания нажатий клавиш:
npm install johnny-five
npm install keypressИногда порядок установки влияет на поведение npm: если возникли ошибки, попробуйте повторно установить johnny-five после keypress.

Код: пример управления сервоприводом с клавиатуры
Создайте файл test.js и вставьте следующий код. Комментарии объясняют секции.
var five = require("johnny-five");
var keypress = require("keypress");
keypress(process.stdin);
var board = new five.Board();
board.on("ready", function() {
console.log("Use Up and Down arrows for CW and CCW respectively. Space to stop.");
var servo = new five.Servo.Continuous(10);
process.stdin.resume();
process.stdin.setEncoding("utf8");
process.stdin.setRawMode(true);
process.stdin.on("keypress", function(ch, key) {
if (!key) { // if no key is pressed, return i.e do nothing.
return;
}
if (key.name === "q") {
console.log("Quitting");
process.exit();
} else if (key.name === "up") {
console.log("CW");
servo.cw();
} else if (key.name === "down") {
console.log("CCW");
servo.ccw();
} else if (key.name === "space") {
console.log("Stopping");
servo.stop();
}
});
});Пояснения по коду:
- require(“johnny-five”) импортирует библиотеку Johnny-Five.
- keypress(process.stdin) готовит поток ввода для отслеживания событий клавиатуры.
- new five.Board() автоматически пытается подключиться к плате через серийный порт.
- five.Servo.Continuous(10) создаёт объект для управления серво на ножке D10 в режиме непрерывного вращения. Обычные позиционные сервы используют five.Servo(номер), а continuous — для непрерывно-вращающихся моторов.
- Обработчик keypress выполняет команды: стрелки вверх/вниз задают направление вращения, пробел — стоп, Q — выход.
Если ваша плата не определяется автоматически, можно указать порт явно при создании Board: new five.Board({ port: “COM3” }) (в Windows) или “/dev/ttyUSB0” в Linux/macOS. Это полезно при множестве подключённых устройств.
Запуск и проверка
В терминале перейдите в папку с test.js и выполните:
node test.jsПосле запуска вы увидите сообщения о подключении платы и инструкцию. Управляйте сервоприводом стрелками и проверьте поведение. Для выхода нажмите Q.

Если всё сделано верно, сервопривод будет реагировать на нажатия клавиш. Вот анимированная демонстрация того, как это может выглядеть:

Отладка и частые проблемы
Важно: до начала отладки отключите питание, если будете менять проводку.
Распространённые причины, по которым проект может не работать:
- Неправильная проводка: питание и земля должны быть подключены, сигнальный провод на PWM-выводе.
- Нет загруженного Firmata: проверьте, что на плате загружен StandardFirmataPlus.
- Плата не определяется: проверьте драйверы USB (особенно для клонов Arduino на чипах CH340/CP210x).
- Нехватка питания: при резких движениях сервопривода потребление растёт; для нескольких серв и нагрузок используйте внешний источник питания, общий GND обязателен.
- Порт занят другим приложением: закройте Arduino IDE Serial Monitor и другие программы, которые могут держать порт.
- Несовместимость версий Node.js/npm или кешированные пакеты: попробуйте удалить node_modules и выполнить npm install заново.
Быстрая методика отладки (эвристика):
- Проверьте физические соединения и питание.
- Убедитесь, что Arduino видна в IDE и вы можете загрузить скетч.
- Загрузите StandardFirmataPlus и перезагрузите плату.
- Запустите node test.js и смотрите вывод консоли на ошибки.
- Если порт не найден — укажите порт явно.
Когда этот подход не подходит
- Нужна высокая частота управления и жёсткие временные ограничения: управление из ОС через Firmata добавляет латентность. Для критичных задач лучше реализовать логику непосредственно в Arduino (C++ / Sketche).
- Ограниченные ресурсы устройства: если плата не поддерживает Firmata или у вас «голый» микроконтроллер без последовательного интерфейса, этот способ не подойдёт.
- Потребность в автономной работе без компьютера: тогда нужно загрузить скетч с собственной логикой на плату.
Альтернативные подходы
- Python + pyFirmata/pySerial — аналогичный подход на Python.
- Node-RED — визуальная среда для интеграции сенсоров и устройств, имеет узлы для Firmata.
- Espruino / Tessel — микроконтроллеры, которые выполняют JavaScript natively на устройстве.
- Прямое написание скетчей на Arduino C/C++ — лучше для низкой латентности и автономности.
Ментальные модели и практические правила
- Правило трёх проверок: питание, земля, проводка сигнала.
- «Разделяй питание и управление»: при сомнениях подавайте питание серв напрямую от источника, а сигналы оставьте от Arduino.
- Минимизируйте количество переменных: ограничьте внешние зависимости, чтобы быстрее находить причину ошибки.
Уровни зрелости проекта
- Прототип: один серво, управление с компьютера через USB.
- Полевое испытание: добавлено устойчивое питание, корпус, минимальная защита от помех.
- Интеграция: несколько приводов, обработка ошибок, логирование, интерфейс (HTTP/WebSocket).
- Производство: надежность, безопасность питания, серийное производство, документация и тесты.
Чек-лист ролей
Для разработчика (ПО):
- Проверить версии Node.js и npm.
- Автоматизировать установку зависимостей (package.json).
- Добавить обработку ошибок и логирование.
Для аппаратчика:
- Проверить питание серв и GND.
- Убедиться, что используемые провода и разъёмы надёжны.
- Протестировать серво на отдельном питании.
Для интегратора:
- Обеспечить совместимость с ОС и драйверами.
- Настроить безопасное отключение питания и аварийные стопы.
Критерии приёмки
- Система успешно реагирует на стрелки вверх/вниз и пробел без зависаний.
- Серво не перегревается при обычной нагрузке.
- После нажатия Q процесс завершает работу и освобождает порт.
- При перезагрузке плата корректно подключается и возобновляет работу.
Мини-методология: быстрый прототип
- Соберите схему и подключите один серво к 5V, GND и PWM-пину.
- Загрузите StandardFirmataPlus на плату.
- Инициализируйте npm и установите johnny-five и keypress.
- Запустите тестовый скрипт и проверьте отклик.
- Переходите к улучшениям: интерфейс, удалённое управление, безопасность питания.
Полезные сниппеты
- Указание порта вручную при создании Board:
var board = new five.Board({ port: "COM3" });- Использование позиционного серво вместо непрерывного:
var servo = new five.Servo(10);
servo.to(90); // повернуть в позицию 90°Короткий глоссарий
- PWM — широтно-импульсная модуляция, метод управления сервоприводами и моторами.
- Firmata — протокол для управления аппаратурой по последовательному порту.
- Johnny-Five — JavaScript-библиотека для робототехники и электроники.
Безопасность и надёжность
- Не подключайте сервоприводы напрямую к плате, если они потребляют большой ток. Используйте внешнее питание с общим GND.
- Избегайте механических ограничений хода серво, чтобы не повредить привод.
- Контролируйте температуру и шум при долгой работе.
Локальные нюансы и советы
- Для клонов Arduino на контроллерах CH340 или CP210x установите соответствующие драйверы (Windows) перед использованием.
- На macOS и Linux порты обычно выглядят как /dev/tty.usbmodem или /dev/ttyUSB.
Примеры следующего шага
- Подключить энкодер для обратной связи по положению.
- Создать веб-интерфейс для удалённого управления через WebSocket.
- Сборка мини-робота с несколькими серво и датчиками.
Заключение
Мы рассмотрели, как быстро настроить управление серво через Arduino из JavaScript с помощью Johnny-Five и Firmata. Подход удобен для быстрого прототипирования, интеграции с веб-интерфейсами и работы в привычном для многих среде JavaScript. Для продакшена нужно уделить внимание питанию, надёжности и возможной необходимости перенести критичную логику на сам микроконтроллер.
Важно: экспериментируйте аккуратно и записывайте изменения в схеме. Если соберёте интересный проект — делитесь опытом и улучшениями.
Ключевые ресурсы
- Официальный сайт Johnny-Five: https://johnny-five.io
- Документация Arduino и примеры Firmata находятся в Arduino IDE в разделе Examples > Firmata.
Похожие материалы
Самоподписанный SSL в Linux — создание и настройка
Как сделать Minecraft красивее с OptiFine
Как найти литературного агента быстро
Приватное видео на YouTube: как поделиться
Как исправить ошибку 0xc000000f в Windows