Управление Arduino с JavaScript и Johnny‑Five
Краткое содержание
- Что нужно: Arduino, сервомотор, провода, USB-кабель, Node.js.
- Подключение: питание 5 В, общий GND, управляющий провод к PWM‑пину (в примере — D10).
- Программирование: загрузите StandardFirmataPlus, установите johnny-five и keypress, запустите node test.js.
Аппаратный список
Для проекта вам понадобятся:
- Arduino Uno или совместимая плата.
- Хоббийный сервомотор (совместимый с Arduino).
- Несколько перемычек (hook up wire).
- USB‑кабель для подключения Arduino к компьютеру.
Важно: многие клоны Arduino и недорогие сервоприводы работают нормально, но обращайте внимание на питание сервомотора — некоторые сервоприводы потребляют больше тока, чем может выдержать USB‑порт.
Схема подключения
Подключите сервомотор к Arduino следующим образом:

- Линия питания VCC (красный провод) — к 5V на плате Arduino.
- Общий провод GND (чёрный или коричневый) — к GND на Arduino.
- Сигнальный провод (жёлтый или оранжевый) — к цифровому PWM‑пину, в примере используется пин 10.
Примечание: пин не обязательно должен быть именно 10, но он должен поддерживать PWM (часто помечается как ~10).
Подготовка платы и загрузка Firmata
- Подключите плату к компьютеру через USB.
- Откройте Arduino IDE.
- В меню Tools выберите вашу плату (Board) и порт (Port).
Если это ваш первый опыт с Arduino, руководства по началу работы помогут настроить среду. После выбора платы и порта загрузите пример StandardFirmataPlus:
- File → Examples → Firmata → StandardFirmataPlus.
- Нажмите Upload.
Этот скетч не требует изменений: он позволяет внешнему ПО (нашему Node.js‑скрипту) посылать команды на плату по протоколу Firmata.
Важно: если у вас нестабильная связь, попробуйте перезагрузить плату и убедиться, что последовательный порт не занят другой программой.
Установка Node.js и npm
Johnny‑Five — JavaScript‑фреймворк для робототехники, поэтому нам нужен Node.js.
- Скачайте инсталлятор с официального сайта Node.js. В статье использовалась рекомендованная LTS‑версия 8.9.4, но можно установить текущую LTS‑версию.
- Запустите .msi (Windows) и убедитесь, что установщик добавил Node.js и npm в PATH.
После установки откройте Командную строку (CMD) или PowerShell.
Инициализация проекта и установка пакетов
В каталоге проекта выполните:
npm initСледуйте подсказкам (можно оставить значения по умолчанию). Затем установите пакеты:
npm install johnny-five
npm install keypressЕсли при установке johnny-five возникнут проблемы, попробуйте сначала установить keypress, а затем повторить установку johnny‑five — иногда порядок влияет на поведение npm.
JavaScript и Johnny‑Five — основы
Johnny‑Five предоставляет абстракции для входов/выходов плат Arduino: цифровые пины, аналоговые, серво, датчики и пр. В этом примере мы будем работать с сервомотором.
Ключевые понятия:
- Firmata: протокол, который позволяет управлять Arduino из внешней программы (наше Node.js‑приложение).
- Board: объект Johnny‑Five, представляющий подключённую плату.
- Servo: объект для управления сервоприводом; бывает позиционный и continuous (непрерывного вращения).
Код — управление сервом с клавиатуры
Создайте файл test.js и вставьте код ниже. Он инициализирует johnny‑five и keypress, создаёт объект Servo.Continuous на пине 10 и реагирует на нажатия клавиш.
var five = require("johnny-five");
var keypress = require("keypress");
// Включаем прослушивание stdin
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. Q to quit.");
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) {
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();
}
});
});Примечание: если автоопределение порта не работает, можно явно указать порт при создании Board:
var board = new five.Board({ port: "COM3" }); // Windows
// или
var board = new five.Board({ port: "/dev/ttyUSB0" }); // LinuxОтличие позиционного и непрерывного сервомотора
- five.Servo(10) — позиционный сервопривод: вы задаёте угол (servo.to(90)).
- five.Servo.Continuous(10) — сервопривод непрерывного вращения: методы cw(), ccw(), stop().
Если у вас обычный сервопривод (поворотный), замените конструкцию на:
var servo = new five.Servo(10);
// и вместо servo.cw()/ccw() используйте servo.to(0/180) или servo.sweep()Запуск и ожидание результата
Запустите скрипт в каталоге проекта:
node test.jsВ консоли вы увидите информацию о плате и подсказку. Нажмите стрелки вверх/вниз для вращения, пробел для остановки, Q для выхода.
Если всё подключено правильно, сервомотор начнёт реагировать на нажатия. Небольшая демонстрация работы мотора:
Советы по электропитанию и безопасности
Важно учитывать токовые характеристики сервомотора:
- Некоторым сервам требуется более высокий ток, чем может дать USB‑порт (обычно ~500 mA). В таких случаях используйте внешний источник питания 5V с общим GND.
- Никогда не подключайте питание внешнего источника без общей земли с Arduino — это приведёт к неправильной работе или повреждению.
Важно: не подключайте и не отключайте провода при включенном питании, чтобы не повредить электронику.
Полезные расширения и альтернативные подходы
- Управление через веб‑интерфейс: запустите Express и сокеты, чтобы получать команды из браузера и пересылать их на Johnny‑Five.
- Использование Raspberry Pi: Johnny‑Five работает нативно на Raspberry Pi, что даёт меньше зависимости от ПК.
- Использование Python/pyFirmata: если предпочитаете Python, pyFirmata даёт похожую функциональность.
Отладка и типичные проблемы
- Плата не обнаруживается: убедитесь, что драйвер установлен и выбран правильный COM‑порт.
- Скетч Firmata не загружен: проверьте Arduino IDE, повторно загрузите StandardFirmataPlus.
- Серво дергается или не вращается: проверьте питание, общий GND и корректность пинов.
- npm‑установки падают: обновите npm, попробуйте удалить папку node_modules и package-lock.json и установить снова.
Быстрый список для отладки
- Проверить физические подключения (VCC, GND, сигнал).
- Проверить, загружен ли StandardFirmataPlus.
- Убедиться в наличии порта и доступности его для Node.js.
- Запустить скрипт node test.js и наблюдать сообщения в консоли.
- Если нужно, включить детальный лог в johnny‑five (см. документацию).
Мини‑методология — как перейти от идеи к результату за 1–2 часа
- Подготовьте комплект: плата, сервомотор, провода, USB‑кабель.
- Подключите и загрузите StandardFirmataPlus через Arduino IDE (15–20 мин).
- Установите Node.js и npm (10–15 мин).
- Создайте проект npm и установите johnny‑five и keypress (5–10 мин).
- Напишите/скопируйте скрипт, запустите и отладьте (20–30 мин).
Таблица совместимости и заметки по миграции
- Arduino Uno/Nano/Mega: поддерживаются (Mega может иметь другие нумерации портов).
- Клоны Arduino: чаще всего работают, но могут требовать установки драйверов (CH340 и проч.).
- Raspberry Pi: поддержка через IO‑пины и дополнительную библиотеку либо через Firmata.
Краткий совет по миграции: если автоопределение порта не работает на вашей ОС, указывайте порт явно в new five.Board({ port: ‘…’ }).
Роль‑ориентированные чеклисты
Разработчик:
- Установить Node.js и npm.
- Настроить среду разработки (IDE).
- Интегрировать johnny‑five с системой контроля версий.
Хоббист/ученик:
- Узнать расположение пинов на плате.
- Подключить сервомотор и загрузить StandardFirmataPlus.
- Попробовать готовый скрипт и экспериментировать с командами.
Инженер по безопасности:
- Проверить токи и тепловые характеристики сервомотора.
- Обеспечить общую землю и защиту от короткого замыкания.
Критерии приёмки
- Скрипт запускается командой node test.js без ошибок.
- В консоли отображается подсказка управления (стрелки/пробел/Q).
- Нажатие клавиш вызывает ожидаемое поведение сервомотора (вращение/останов/выход).
Когда подход не подойдёт — ограничения и крайние случаи
- Если нужен прецизионный контроль угла (например, для робота‑манипулятора), используйте позиционные сервоприводы и методы servo.to(angle).
- Для тяжёлых нагрузок servos непрерывного вращения и hobby‑класса не подойдут — нужны мотор‑редукторы и драйверы.
- В автономных системах без ПК вместо Firmata лучше писать скетч полностью на Arduino.
Короткий словарь терминов
- Firmata — протокол для управления платой Arduino извне.
- PWM — широтно‑импульсная модуляция, используется для управления скоростью/позицией.
- Continuous servo — сервопривод для непрерывного вращения (методы cw/ccw).
Итог
Johnny‑Five позволяет быстро и просто управлять устройствами на базе Arduino с помощью знакомого JavaScript. Это отличный способ начать робомейкинг, интегрировать аппаратные эксперименты в web‑проекты и собирать прототипы. Как только базовая связка работает, можно расширять проект: управлять несколькими сервами, добавлять датчики и веб‑интерфейс, переносить логику на Raspberry Pi.
Важно: всегда следите за питанием сервомотора и общей землёй. Удачных экспериментов и безопасных сборок!