Начало работы с хакерством аппаратного обеспечения может показаться довольно пугающим для некоторых. Мир электроники совершенно чужд большинству разработчиков; кроме того, это требует написания кода на C/C++, что эффективно, но не все чувствуют себя комфортно с этим. Однако движение Nodebots — это отличный способ начать разработку аппаратного обеспечения с использованием JavaScript. В этой статье я хочу провести вас через несколько базовых вещей, чтобы начать работу.
Существует довольно много различных проектов, направленных на разработку аппаратного обеспечения с использованием JavaScript. Некоторые из них поставляются со специальным оборудованием, например, Tessel или Espruino. Оба этих проекта замечательны, но в этой статье мы сосредоточимся на другом варианте.
Вариант, который мы будем использовать, — это npm-модуль `johnny-five`. Johnny-Five не ограничен определенным оборудованием, а поддерживает широкий спектр различных микроконтроллерных платформ (включая Tessel) с помощью различных плагинов ввода-вывода. Единственный недостаток заключается в том, что некоторые из этих платформ (например, Arduino) не позволяют выполнять JS-код непосредственно на микроконтроллере. Вместо этого вы выполняете его на «хост-системе».
Для Arduino это работает так: вы выполняете JS-код на своей «хост-системе» (например, на компьютере) с использованием Node.js, и модуль `johnny-five` отправляет действия через модуль `serialport` на ваш Arduino, на котором запущена прошивка `firmata`, предназначенная для удаленного управления Arduino. Таким образом, у нас есть полный контроль над оборудованием, пока оно подключено к нашему компьютеру.
Для этого руководства вам понадобится несколько вещей. Прежде всего, на вашем компьютере должны быть установлены следующие программы:
— Node.js и npm
— Arduino IDE для загрузки прошивки `firmata` на ваш микроконтроллер
— Ваш любимый текстовый редактор
Кроме того, вам понадобятся некоторые аппаратные компоненты:
— Arduino (или клон Arduino). Я буду использовать Arduino Nano. Проверьте страницу Johnny-Five на наличие поддерживаемых моделей
— 1 красный светодиод
— 1 кнопка
— 1 резистор на 220 Ом (с полосками Красный-Красный-Коричневый). Обратите внимание, что для светодиодов разных цветов могут потребоваться разные значения сопротивления
— 1 резистор на 10 кОм (с полосками Коричневый-Черный-Оранжевый)
— 1 макетная плата для сборки схемы – достаточно примерно такого размера
— Несколько соединительных или монтажных проводов для подключения всего
Первое, что нам нужно сделать, — это убедиться, что ваш Arduino правильно распознается. Подключите его к компьютеру и откройте меню `Tools`. Там выберите соответствующую плату, которую вы используете — в моем случае это был Arduino Nano.
Также убедитесь, что вы выбрали правильный порт в меню `Tools → Port`. Он должен содержать что-то вроде `usbserial`. Если такой порт не указан, убедитесь, что у вас установлены необходимые драйверы для вашего Arduino.
Далее нам нужно установить прошивку firmata на наш Arduino, чтобы иметь возможность с ним взаимодействовать. Откройте Arduino IDE и установите библиотеку `Servo`, нажав на `Sketch → Include Library → Manage Libraries` и найдя библиотеку.
Последним шагом нужно загрузить файл `StandardFirmataPlus.ino` в каталог вашего проекта Arduino (по умолчанию на Mac это `~/Documents/Arduino`) и загрузить его на Arduino. Вы можете найти каталог Arduino, перейдя в Preferences и посмотрев на *Sketchbook location*.
Скачайте файл `StandardFirmataPlus.ino` с GitHub и поместите его в каталог `StandardFirmataPlus` внутри вашего каталога Arduino. Откройте файл `StandardFirmataPlus.ino` и нажмите кнопку *Upload*. Это скомпилирует код и загрузит его на ваш Arduino. Вы можете закрыть Arduino IDE после завершения загрузки. Теперь все готово для работы с JavaScript!
Примечание: Если загрузка кода не удалась, попробуйте установить библиотеку «Firmata» тем же способом, что и библиотеку «Servo».
Эквивалентом «Hello World» в аппаратном обеспечении, вероятно, является мигание светодиодов. Хорошая новость в том, что на платах Arduino обычно уже есть светодиод, который мы можем использовать, чтобы проверить, все ли работает, без необходимости что-либо подключать. Итак, давайте начнем!
Создайте новый проект Node.js в любом месте на вашем компьютере (например, в домашнем каталоге), выполнив следующие команды в командной строке:
«`bash
mkdir nodebot-test
cd nodebot-test
npm init -y
«`
Затем установите модуль `johnny-five`:
«`bash
npm install johnny-five
«`
Создайте файл `index.js` и добавьте в него следующий код:
«`javascript
const { Board, Led } = require(‘johnny-five’);
const board = new Board();
board.on(‘ready’, onReady);
function onReady() {
const led = new Led(13);
led.blink(500);
}
«`
Этот код создаст новый экземпляр Board и будет ждать события `ready`. Это означает, что библиотека `johnny-five` подключилась к Arduino. Затем мы вызовем функцию `onReady`, которая пока отсутствует. Добавьте ее, вставив следующие строки в конец вашего файла `index.js`:
Теперь все, что нам нужно сделать, — это запустить наш скрипт:
«`bash
node index.js
«`
В консоли должно появиться несколько сообщений, а затем начаться REPL-сессия следующего вида:
«`
1456096608916 Device(s) COM3
1456096608939 Connected COM3
1456096613968 Repl Initialized
>>
«`
Кроме того, вы должны увидеть, как светодиод на плате начинает мигать. Вы можете остановить мигание, введя в REPL:
«`
led.stop();
«`
Конечно, просто взаимодействие с аппаратным обеспечением на плате довольно ограничено и не совсем то, что мы обычно хотим делать при хакерстве оборудования. Для этого нам нужно взаимодействовать с внешним оборудованием. Итак, давайте приступим, взяв следующие компоненты:
— 1 резистор на 220 Ом (Красный-Красный-Коричневый)
— 1 светодиод
— Ваша макетная плата
— Несколько проводов
Отключите Arduino и подключите все следующим образом на макетной плате:
Вам нужно создать следующую цепь:
Пин D6 на вашем Arduino (или любой другой цифровой пин) → одна сторона резистора → длинная ножка светодиода (анод) → короткая ножка светодиода (катод) → GND на вашем Arduino
С этой схемой, если мы включим пин `D6`, светодиод начнет светиться.
Теперь давайте обновим наш код, чтобы использовать этот светодиод. Все, что вам нужно сделать, — это передать `6` в качестве аргумента конструктору `Led`. Обратите внимание, что это может отличаться для другой платы Arduino или если вы выбрали другой порт. Внесите изменения в ваш `index.js`:
«`javascript
function onReady() {
const led = new Led(6);
led.blink(500);
}
«`
Что такое хакерство оборудования без взаимодействия с пользователем? Давайте добавим кнопку. Возьмите оставшиеся компоненты:
— 1 резистор на 10 кОм (Коричневый-Черный-Оранжевый)
— 1 кнопка
— Оставшиеся провода
Добавьте их в цепь следующим образом:
Подключите один пин к 5V на вашем Arduino, а диагонально противоположный пин — к резистору на 10 кОм и к пину `D5` на вашем Arduino. Подключите другой конец резистора к `GND` вашего Arduino, чтобы замкнуть цепь.
Ваша установка должна выглядеть примерно так:
Работа с такими вещами, как кнопки, — это то, где хакерство оборудования с использованием JavaScript действительно проявляет свои сильные стороны. Если мы хотим узнать, была ли кнопка нажата или отпущена, все, что нам нужно сделать, — это слушать события `press`/`release`. Это так просто. Измените ваш `index.js`:
«`javascript
function onReady() {
const led = new Led(6);
const button = new five.Button(5);
button.on(‘press’, () => {
led.on();
});
button.on(‘release’, () => {
led.off();
});
}
«`
Моя любимая часть nodebots заключается в том, что мы можем использовать всю экосистему npm. Давайте быстро запустим веб-сервер с использованием `express` и будем зажигать светодиод при каждом запросе, а также использовать `got` для выполнения HTTP-запроса `POST` на RequestBin.
Установите два модуля с помощью `npm`:
«`bash
npm install express got
«`
Затем подключите две зависимости и создайте приложение express. Измените ваш `index.js`:
«`javascript
const express = require(‘express’);
const got = require(‘got’);
const { Board, Led, Button } = require(‘johnny-five’);
const app = express();
const board = new Board();
board.on(‘ready’, onReady);
function onReady() {
const led = new Led(6);
const button = new five.Button(5);
app.get(‘/’, (req, res) => {
led.on();
setTimeout(() => led.off(), 1000);
res.send(‘LED is on for 1 second!’);
});
app.listen(3000, () => {
console.log(‘Server is listening on port 3000’);
});
}
«`
Далее нам нужно скорректировать обработчики событий для кнопки и заставить сервер `express` начать прослушивание:
«`javascript
function onReady() {
const led = new Led(6);
const button = new five.Button(5);
button.on(‘press’, () => {
got.post(‘YOUR_REQUEST_BIN_URL’);
});
app.get(‘/’, (req, res) => {
led.on();
setTimeout(() => led.off(), 1000);
res.send(‘LED is on for 1 second!’);
});
app.listen(3000, () => {
console.log(‘Server is listening on port 3000’);
});
}
«`
Обязательно замените `YOUR_REQUEST_BIN_URL` на действительный URL RequestBin. Вы можете создать его на их сайте.
Теперь перезапустите вашу программу и дождитесь сообщения о том, что сервер начал прослушивание. Перейдите на http://localhost:3000, и вы должны увидеть, как светодиод загорается на одну секунду. Обновите страницу, и это произойдет снова. Затем нажмите кнопку и обновите страницу RequestBin, чтобы увидеть запрос, который был отправлен.
Отлично, вот и все! Вы только что сделали свои первые шаги в удивительном мире nodebots. Но это только начало. Теперь пришло время найти проект и начать изучать, какие детали вам для него нужны. Если вы хотите получить представление о том, как подходить к этим вещам, ознакомьтесь с моей статьей о том, как я взломал кофемашину с использованием Johnny-Five и Tessel. Также проверьте, есть ли рядом с вами местные встречи nodebots. Другие полезные ресурсы:
— Страница примеров Johnny-Five, показывающая, как взаимодействовать с различными компонентами
— `nodebots-workshop` с разнообразными упражнениями
— Замечательный список nodebots на GitHub
Если у вас есть классные аппаратные проекты, которые вы создаете или планируете создать с использованием JS, я был бы рад о них услышать! Также не стесняйтесь обращаться, если у вас есть вопросы.