Гид по технологиям

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

8 min read Arduino Обновлено 13 Apr 2026
Управление Arduino с JavaScript и Johnny-Five
Управление Arduino с JavaScript и Johnny-Five

control-arduino-js

Arduino — один из самых простых способов для программистов начать работать с электроникой. Существуют сотни начальных проектов, но новички часто откладывают дело — учить новый язык ради эксперимента не всегда хочется. К счастью, можно работать с микроконтроллерами на языке, который вы уже знаете: JavaScript.

В этой статье мы не ограничимся миганием светодиода. Мы покажем, как с помощью Johnny-Five управлять серво-приводом с клавиатуры компьютера. Всё программируется на JavaScript, а Arduino выполняет команды через протокол Firmata.

Важно: одно предложение о терминах

  • Johnny-Five — высокоуровневая JavaScript-библиотека для робототехники и управления микроконтроллерами.
  • Firmata — протокол, который позволяет отправлять команды с компьютера на Arduino и управлять его ножками без загрузки собственного скетча с низкоуровневой логикой.

Список компонентов

Для проекта вам потребуется:

  • Arduino Uno или совместимая плата (в оригинальном обзоре цена указывалась в USD). Подойдёт любая плата с поддержкой PWM.
  • Хоббийный сервопривод, совместимый с Arduino (обычный SG90/микро-серво подойдёт для демонстрации).
  • Несколько проводов типа «male–female» / «dupont» для подключения.
  • USB-кабель для соединения Arduino с компьютером.

how to control arduino with javascript

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

Подключение и схема

Подключите сервопривод к Arduino так:

how to control arduino with javascript

Кратко:

  • Линия питания VCC (обычно красный) — к 5V Arduino.
  • Линия GND (чёрный или коричневый) — к GND Arduino.
  • Сигнальный провод (жёлтый/оранжевый) — к цифровой ножке, поддерживающей PWM (в примере — D10).

Важно: Многие серво потребляют заметный ток в пике. Для надёжной работы в реальных проектах используйте отдельное питание для серво с общим «землём» (GND), если сервопривод питается от внешнего источника. Для небольшой демонстрации на одном серво с короткими движениями питания от 5V Arduino обычно хватает.

Примечание: в Arduino-платах ножки с PWM обычно помечаются символом ~ рядом с номером. Подключайте сигнальный провод именно к PWM-выводу, если вы хотите управлять скоростью вращения/положением серво через библиотеку.

Подготовка Arduino IDE и загрузка Firmata

  1. Если ещё не установлено, загрузите и установите Arduino IDE с официального сайта.
  2. Подключите плату к компьютеру через USB.
  3. В Arduino IDE в меню Tools выберите вашу плату (Board) и порт (Port).
  4. В меню File > Examples > Firmata найдите и откройте скетч StandardFirmataPlus.
  5. Загрузите (Upload) этот скетч на плату без изменений.

StandardFirmataPlus — это стандартный скетч, который ставит Arduino в режим ожидания команд извне (по протоколу Firmata). После загрузки плата будет реагировать на команды от компьютера.

how to control arduino with javascript

Установка Node.js и Johnny-Five

Для работы с Johnny-Five нужен Node.js и менеджер пакетов NPM.

  1. Скачайте Node.js с официального сайта. В исходном материале использовалась рекомендуемая версия 8.9.4 LTS. На современных машинах подойдёт любая актуальная LTS-версия Node.js.
  2. Установите Node.js и убедитесь, что установщик добавил node и npm в системный PATH.
  3. Откройте терминал (в Windows — CMD или PowerShell). Инициализируйте npm в директории проекта:
npm init

Просто придерживайтесь подсказок; для простого проекта можно оставлять значения по умолчанию.

  1. Установите Johnny-Five и пакет для считывания нажатий клавиш:
npm install johnny-five
npm install keypress

Иногда порядок установки влияет на поведение npm: если возникли ошибки, попробуйте повторно установить johnny-five после keypress.

how to control arduino with javascript

Код: пример управления сервоприводом с клавиатуры

Создайте файл 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.

how to control arduino with javascript

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

how to control arduino with javascript

Отладка и частые проблемы

Важно: до начала отладки отключите питание, если будете менять проводку.

Распространённые причины, по которым проект может не работать:

  • Неправильная проводка: питание и земля должны быть подключены, сигнальный провод на PWM-выводе.
  • Нет загруженного Firmata: проверьте, что на плате загружен StandardFirmataPlus.
  • Плата не определяется: проверьте драйверы USB (особенно для клонов Arduino на чипах CH340/CP210x).
  • Нехватка питания: при резких движениях сервопривода потребление растёт; для нескольких серв и нагрузок используйте внешний источник питания, общий GND обязателен.
  • Порт занят другим приложением: закройте Arduino IDE Serial Monitor и другие программы, которые могут держать порт.
  • Несовместимость версий Node.js/npm или кешированные пакеты: попробуйте удалить node_modules и выполнить npm install заново.

Быстрая методика отладки (эвристика):

  1. Проверьте физические соединения и питание.
  2. Убедитесь, что Arduino видна в IDE и вы можете загрузить скетч.
  3. Загрузите StandardFirmataPlus и перезагрузите плату.
  4. Запустите node test.js и смотрите вывод консоли на ошибки.
  5. Если порт не найден — укажите порт явно.

Когда этот подход не подходит

  • Нужна высокая частота управления и жёсткие временные ограничения: управление из ОС через Firmata добавляет латентность. Для критичных задач лучше реализовать логику непосредственно в Arduino (C++ / Sketche).
  • Ограниченные ресурсы устройства: если плата не поддерживает Firmata или у вас «голый» микроконтроллер без последовательного интерфейса, этот способ не подойдёт.
  • Потребность в автономной работе без компьютера: тогда нужно загрузить скетч с собственной логикой на плату.

Альтернативные подходы

  • Python + pyFirmata/pySerial — аналогичный подход на Python.
  • Node-RED — визуальная среда для интеграции сенсоров и устройств, имеет узлы для Firmata.
  • Espruino / Tessel — микроконтроллеры, которые выполняют JavaScript natively на устройстве.
  • Прямое написание скетчей на Arduino C/C++ — лучше для низкой латентности и автономности.

Ментальные модели и практические правила

  • Правило трёх проверок: питание, земля, проводка сигнала.
  • «Разделяй питание и управление»: при сомнениях подавайте питание серв напрямую от источника, а сигналы оставьте от Arduino.
  • Минимизируйте количество переменных: ограничьте внешние зависимости, чтобы быстрее находить причину ошибки.

Уровни зрелости проекта

  1. Прототип: один серво, управление с компьютера через USB.
  2. Полевое испытание: добавлено устойчивое питание, корпус, минимальная защита от помех.
  3. Интеграция: несколько приводов, обработка ошибок, логирование, интерфейс (HTTP/WebSocket).
  4. Производство: надежность, безопасность питания, серийное производство, документация и тесты.

Чек-лист ролей

Для разработчика (ПО):

  • Проверить версии Node.js и npm.
  • Автоматизировать установку зависимостей (package.json).
  • Добавить обработку ошибок и логирование.

Для аппаратчика:

  • Проверить питание серв и GND.
  • Убедиться, что используемые провода и разъёмы надёжны.
  • Протестировать серво на отдельном питании.

Для интегратора:

  • Обеспечить совместимость с ОС и драйверами.
  • Настроить безопасное отключение питания и аварийные стопы.

Критерии приёмки

  • Система успешно реагирует на стрелки вверх/вниз и пробел без зависаний.
  • Серво не перегревается при обычной нагрузке.
  • После нажатия Q процесс завершает работу и освобождает порт.
  • При перезагрузке плата корректно подключается и возобновляет работу.

Мини-методология: быстрый прототип

  1. Соберите схему и подключите один серво к 5V, GND и PWM-пину.
  2. Загрузите StandardFirmataPlus на плату.
  3. Инициализируйте npm и установите johnny-five и keypress.
  4. Запустите тестовый скрипт и проверьте отклик.
  5. Переходите к улучшениям: интерфейс, удалённое управление, безопасность питания.

Полезные сниппеты

  • Указание порта вручную при создании 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.
Поделиться: X/Twitter Facebook LinkedIn Telegram
Автор
Редакция

Похожие материалы

Самоподписанный SSL в Linux — создание и настройка
Безопасность

Самоподписанный SSL в Linux — создание и настройка

Как сделать Minecraft красивее с OptiFine
Minecraft

Как сделать Minecraft красивее с OptiFine

Как найти литературного агента быстро
Издательство

Как найти литературного агента быстро

Приватное видео на YouTube: как поделиться
Видео

Приватное видео на YouTube: как поделиться

Как исправить ошибку 0xc000000f в Windows
Windows

Как исправить ошибку 0xc000000f в Windows

Признаки взлома Wi‑Fi и как защитить сеть
Безопасность

Признаки взлома Wi‑Fi и как защитить сеть