Аппаратный взлом с помощью JavaScript
Опубликовано: 2022-03-10Интернет вещей (IoT) позволил Интернету выйти за пределы браузера. Состоящие из электронных сетевых устройств, эти «вещи» могут взаимодействовать с физическим миром через датчики, которые передают данные, которые они собирают, обратно в свои экосистемы.
В настоящее время эти устройства в основном представляют собой продукты, разработанные с определенной целью, типичным примером которых является фитнес-браслет, отслеживающий активность. Он передает собранную информацию в приложение, которое затем может анализировать данные и предлагать предложения и мотивацию для дальнейшего продвижения пользователя.
Дальнейшее чтение на SmashingMag:
- Выбор правильного инструмента для прототипирования
- Как создать прототип IoT: создание оборудования
- Опыт прототипа IoT: настройка программного обеспечения
- Прототипирование iOS с помощью TAP и Adobe Fireworks
При создании устройств IoT задача обычно делится между двумя ролями: инженер по оборудованию создает физическое устройство, а разработчик — экосистему. Однако это не всегда необходимо. В случае JavaScript его изоморфная природа позволяет использовать один язык на нескольких платформах, включая аппаратное обеспечение.
Это Джордж, говорящее растение, (довольно сварливое) дополнение к Интернету вещей. Его датчики собирают данные об окружающей среде, включая уровень влажности почвы, температуру окружающей среды и интенсивность света. Со своим светодиодным лицом 8 × 8 он может визуализировать свое неудовольствие и, используя HTML5 Web Speech API, саркастически отвечать на ваши обыденные вопросы. Джордж — отличный пример того, как можно использовать веб-технологии в сочетании с аппаратным обеспечением для предоставления новых и увлекательных впечатлений.
В этой статье рассматриваются основы того, как приступить к созданию собственных устройств IoT с помощью JavaScript .
Начиная
Создание прототипов оборудования и устройств, подключенных к Интернету, традиционно было тем, чем могли заниматься только инженеры-электрики. Это изменилось с появлением плат разработки , таких как Arduino UNO, Particle (ранее Spark Core) и Raspberry Pi.
Платы для разработки имитируют материнскую плату на компьютере. У них есть входные и выходные разъемы, такие как USB и питание, а также контактные платы, которые позволяют добавлять внешние компоненты. Чип микроконтроллера действует как процессор, запуская код приложения и взаимодействуя с входами и выходами. Этот чип относительно медленный, специально разработанный для выполнения простых задач, таких как считывание данных датчиков. Тем не менее, он также имеет возможность переключения, что позволяет изменять источник питания освещения, двигателей и многих других компонентов.
В последние несколько лет движение производителей набирает обороты, и создание IoT-устройств стало крупным бизнесом. Это расширило рынок макетных плат, и теперь предлагается широкий ассортимент, каждая из которых имеет свои особенности. Конкуренция заставила многих сосредоточиться на уникальных преимуществах, таких как беспроводная связь (с чипами Wi-Fi и Bluetooth), размер и время автономной работы. При проектировании собственных устройств вам необходимо учитывать, какие физические атрибуты вам потребуются . Точно так же программное обеспечение также будет учитываться при принятии решения, например, язык программирования, который вы можете использовать на плате. Тщательно изучите и выберите доску, которая лучше всего соответствует вашим потребностям.
В приведенных здесь примерах мы используем Arduino UNO. Эта конкретная плата для разработки, вероятно, является самой популярной на рынке, потому что она очень проста в использовании. Если вы только начинаете, мы рекомендуем купить стартовый комплект, что-то вроде того, что предлагает Arduino. Он будет поставляться с совместимыми компонентами для выбранной вами платы разработки и, как правило, большим количеством документации, которая поможет вам начать работу.
Основы электричества и цепей
Как следует из названия, электронная схема имеет круглую форму. Электроны текут от положительного конца источника питания (например, батареи) по цепи к отрицательному концу того же источника питания.
Самый простой способ понять физику того, что происходит внутри электрической цепи, — сравнить ее с системой резервуаров для воды. Вода в трубе течет так же, как электроны в проводе . Эти электроны формируют электрический ток, питающий компоненты цепи.
Точно так же, как количество воды, хранящейся в баке, влияет на давление в кране, чем больше электронов в источнике питания, тем больше он заряжен. Это напряжение . Чем выше напряжение, тем большее электрическое давление существует между отрицательным и положительным полюсами, контролируя скорость электронов по цепи.
Точно так же, как объем воды, протекающей по трубе, ток цепи относится к числу электронов, протекающих по проводу. Это важно при построении схемы, потому что вам нужно убедиться, что каждый компонент получает достаточно для выполнения своей задачи. Ток измеряется в амперах или амперах (А) и может дать нам информацию о количестве использованных электронов. Например, если двигатель потребляет 100 миллиампер (мА), а аккумулятор имеет емкость 1000 миллиампер в час (мАч), то мы можем проработать двигатель в течение 10 часов без подзарядки.
Когда компонентам в цепи требуется меньший ток для работы, чем есть в цепи, они могут получить слишком большую мощность и выйти из строя. В этой ситуации необходимо ввести сопротивление , чтобы этого не произошло. Используя нашу аналогию с водой, диаметр трубы будет ограничивать количество воды, которое может пройти через нее, точно так же, как сопротивление ограничивает поток электронов.
Резисторы - это компоненты, используемые для уменьшения тока. Они различаются по величине сопротивления, которое они прикладывают, что показано цветными полосами снаружи резистора. Разные цвета представляют разные числа, и сложение этих полос вместе покажет сопротивление этого конкретного резистора. (Доступны калькуляторы!) Чем выше значение, тем большее сопротивление прикладывается к цепи и тем меньше вероятность повреждения компонента. Используя закон Ома — сопротивление равно напряжению, деленному на ток (или R = V / I
), — вы можете рассчитать точный резистор, необходимый в цепи.
Привет мир
Ознакомившись с основами, мы можем рассмотреть простой пример, чтобы наглядно представить, как все это сочетается друг с другом. Мы займемся разработкой оборудования «Hello World»: заставим мигать светодиод.
Как уже упоминалось, вы можете использовать любую из нескольких макетных плат. В этом примере мы будем использовать Arduino UNO. Мы также будем использовать Mac под управлением Mac OS X, но все примеры также должны работать в Windows.
Аппаратное обеспечение
Тебе понадобится:
- 1 × Ардуино УНО
- 1 × макетная плата без пайки
- 1 × стандартный светодиод
- 1 × резистор 220 Ом
- 2 соединительных кабеля
Это включает в себя несколько компонентов, которые еще не были упомянуты:
- Соединительные кабели используются для направления потока электронов точно так же, как любой провод используется в цепи.
- Светодиод — это сокращение от светоизлучающего диода , который по сути представляет собой небольшую лампочку . У него одна длинная нога и одна короткая нога. Более длинная ветвь указывает, куда должен входить положительный поток схемы, а более короткая ветвь - отрицательный выход. Если вы сделаете это неправильно, светодиод не загорится.
- Макетная плата без пайки (белый блок с отверстиями) — это инструмент для создания прототипов, который позволяет создавать схемы без пайки, что позволяет легко изменять и исправлять схему , а также повторно использовать компоненты. Они бывают разных форм и размеров, но все выполняют одну и ту же роль.
На изображении ниже показано течение тока. Компоненты можно использовать для соединения секций вместе, как это делают светодиод и резистор в следующем примере. На больших макетных платах внешние вертикальные линии обычно используются для соединения положительных и отрицательных соединительных кабелей, чтобы разделить разрабатываемую схему.
Вставьте свои компоненты, как показано на схеме ниже — совместите штифт за штырьком. Это облегчит задачу при переходе к следующему разделу.
Чтобы запустить схему, подключите перемычку к контакту 10 на Arduino. Это точка, в которой Arduino начинает общаться со схемой. Вы можете использовать любой пронумерованный контакт с правой стороны Arduino — просто убедитесь, что ваш код относится к правильному.
Чтобы обеспечить идеальное количество тока, протекающего через светодиод, необходим резистор. В отличие от светодиода, не имеет значения, каким образом он вставлен в цепь.
Независимо от того, пропускает ли контакт 10 ток или нет (управляется вашим кодом), будет определяться, горит светодиод или нет.
Затем другая перемычка подключается к отрицательной стороне светодиода и возвращается на землю, чтобы замкнуть цепь. Простой!
После завершения ваша схема должна выглядеть примерно так, как показано на рисунке ниже. Подключите это к компьютеру через USB. Следующая задача — настроить Arduino для работы с JavaScript.
Прежде чем писать какое-либо программное обеспечение, нам нужно убедиться, что на Arduino установлена правильная прошивка , чтобы она работала с JavaScript. Прошивка по сути предоставляет API для компьютера, так что код может взаимодействовать с платой через порт USB.
Загрузите и установите интегрированную среду разработки (IDE) с веб-сайта Arduino. Затем откройте IDE, убедившись, что ваш Arduino подключен через USB.
Прежде чем запускать что-либо, вам также необходимо убедиться, что у вас есть правильный USB-порт. Перейдите в «Инструменты» → «Порт». Имена могут различаться, поэтому рекомендуется выбирать порт, в имени которого есть «tty» и «usb» в Mac OS X и «COM» в Windows.
После завершения вы можете загрузить прошивку. Выберите «Файл» → «Примеры» → «Firmata» → «Стандартная фирма». После этого выберите «Файл» → «Загрузить на Mac» (или «Sketch» → «Загрузить в Windows»).
Теперь пришло время написать немного JavaScript!
Программное обеспечение
Чтобы управлять светодиодом с помощью JavaScript, нам понадобится библиотека Johnny-Five, созданная для Node.js. По сути, это библиотека, созданная командой Bocoup, чтобы сделать аппаратное обеспечение более доступным для веб-сообщества. Если вы не знаете, что такое Node.js и как его использовать, у Эллиота Бонневилля есть отличное введение на этом сайте.
Поскольку ядро нашего примера использует Arduino, эта библиотека позволяет нашей машине подключаться к оборудованию через порт USB.
Для начала вам необходимо установить Node.js. Если это не так, вы можете загрузить его с веб-сайта Node.js. Это также установит Node Package Manager (npm), который мы будем использовать для установки всех зависимостей для приложения. Пример запускается на Mac с использованием терминала в качестве инструмента командной строки; однако, поскольку Node.js является мультиплатформенным, он может работать на любой машине.
Весь код, представленный в этой статье, доступен на GitHub.
Чтобы установить все зависимости, необходимые для этого проекта, вам потребуется создать файл package.json
, который можно взять из приведенного ниже кода. Это список библиотек, необходимых для запуска примера. Когда команда install
будет инициализирована, npm выйдет и получит все ингредиенты, необходимые для запуска. Этот файл должен находиться в вашей корневой папке.
{ "name": "Hardware-Hacking-with-JavaScript", "description": "Smashing Magazine - Hardware Hacking with JavaScript", "version": "0.0.1", "homepage": "https://www.james-miller.co.uk/", "keywords": ["arduino","tutorial","hardware"], "author": { "name":"James Miller & Mate Marschalko" }, "repository": { "type": "git", "url": "git://github.com/jimhunty/Hardware-Hacking-with-JavaScript.git" }, "bugs": "https://github.com/jimhunty/Hardware-Hacking-with-JavaScript/issues", "license": "MIT", "dependencies": { "johnny-five": "^0.9.13" } }
В инструменте командной строки убедитесь, что вы находитесь в той же папке, которую вы создали для этого примера с файлом package.json
; затем запустите npm install
. Если у вас нет прав для установки этих пакетов, используйте вместо этого sudo npm install
.
Теперь вам нужно создать код приложения для запуска нашего примера. Мы назвали этот файл blink-led.js
. В комментариях подробно описано, что происходит.
// Johnny-Five is our JavaScript framework for accessing Arduino. var jfive = require("johnny-five"); var board, led; board = new jfive.Board(); // Similar to jQuery, we wait for the board to be ready. board.on("ready", function() { // 10 represents the pin number that the LED is plugged into. led = new jfive.Led(10) // The LED blinks (ie turns on and off) every 1000 milliseconds. led.blink(1000); });
Сначала загружаются библиотеки, затем инициализируются переменные. Новый экземпляр Board
создается с помощью конструктора, а функция on ready
разогревает доску и готовит ее к получению инструкций. Поскольку вы подключили соединительный кабель, который подключается к светодиоду, к контакту 10, его необходимо определить в переменной led
. Затем метод blink
используется для включения и выключения света с фазами в 1 секунду.
Теперь у вас есть все необходимое, чтобы начать это световое шоу — включите музыку! Убедитесь, что ваш Arduino подключен и схема настроена. В командной строке запустите node blink-led.js
, заменив имя файла тем, что вы назвали своим кодом. Теперь у вас должен быть мигающий свет.
Попробуйте изменить код, чтобы свет мигал быстрее или медленнее. Каждый раз, когда вы это делаете, вам нужно будет перезапустить свой код в Терминале. Вы можете попробовать led.pulse()
; при этом светодиод будет появляться и гаснуть, а не просто переключаться без перехода.
Домашний мониторинг
Вы уже многому научились! Теперь вы можете применить эти знания и создать простую систему домашнего мониторинга , аналогичную коммерческим продуктам, таким как Nest и Hive.
На этот раз вы будете использовать датчик температуры, подключенный к Arduino с сервера Node.js. Температура будет считываться датчиком и передаваться в браузер, который будет отображать данные на простой веб-странице.
Аппаратное обеспечение
Тебе понадобится:
- 1 × Ардуино УНО
- 1 × макетная плата без пайки
- 1 × датчик температуры TMP36
- 3 соединительных кабеля
Датчик температуры, выбранный для этого примера, доступен в большинстве стартовых наборов, и его покупка по отдельности невероятно дешева.
В предыдущем примере мигания светодиода вы устанавливаете соединение между сервером Node.js, работающим на компьютере, и Arduino. Это соединение также можно использовать для чтения данных с датчиков, подключенных к Arduino.
Выше показана законченная схема. Попробуйте сопоставить этот пин за пином.
Будьте осторожны при обращении с датчиком температуры, потому что ноги легко перепутать. Плоская сторона компонента находится спереди и должна быть обращена к вам, когда вы подключаете датчик. Поскольку каждая из трех ножек имеет разное назначение, неправильное их подключение приведет к тому, что ваша схема не будет работать.
Аналоговые входные контакты — это пять контактов, расположенных вдоль левой стороны платы. Arduino имеет как аналоговые, так и цифровые контакты, как входные, так и выходные. Цифровые означают, что есть только два состояния — включено и выключено (или электрический сигнал и отсутствие электрического сигнала) — и отлично подходят для кнопок и других бинарных переключателей, которые интерпретируют только два состояния. Аналоговый ввод, с другой стороны, может представлять диапазон значений , а контакты аналогового ввода на Arduino могут измерять любое напряжение от 0 до 5 вольт (и выдавать 10-битное значение этого показания). Показания температуры от датчика будут возвращены в виде измерения переменного сопротивления, которое пропорционально температуре воздуха.
Подключите сигнальный контакт в середине датчика к аналоговому входу A0. Подключите левый контакт к контакту 5V (положительный), а правый контакт к земле (отрицательный), чтобы замкнуть цепь.
Теперь ваша схема должна выглядеть примерно так, как на картинке выше. Далее вам нужно создать новый файл для чтения датчика температуры. Этот файл начнется так же, как и в предыдущем примере, загружая библиотеку Johnny-Five, инициализируя новый экземпляр платы, а затем добавляя прослушиватель событий on ready
.
var jfive = require("johnny-five"); board = new jfive.Board(); board.on("ready", function() { // We create a new sensor instance and define the sensor type and the pin it's connected to. var tempSensor = new jfive.Thermometer({ controller: "TMP36", pin: "A0" }); // We add an event listener to the sensor and handle the incoming data. tempSensor.on("data", function() { // The data object also has a fahrenheit property, if that's what we are after. console.log(this.celsius + "°C"); }); });
Сохраните этот фрагмент кода как temperature.js
и запустите его из консоли, введя node temperature.js
.
Поскольку в коде использовался console.log
, показания будут выводиться в Терминал для отладки.
Серверы и сокеты
Теперь у вас есть рабочий термометр, работающий в Node.js. Один только этот простой пример открывает целый ряд возможностей, если учесть все различные модули Node.js, доступные для обработки и использования этих данных. Вы можете сохранить это в Google Spreadsheet, твитнуть или написать об этом, или даже передать эти данные в браузер в режиме реального времени с помощью WebSockets — это то, что вы собираетесь делать дальше!
Чтобы установить соединение с браузером и передать данные датчиков, нам нужно запустить HTTP-сервер Node.js для обслуживания нашего HTML-документа, а затем открыть соединение WebSocket между ними. Запуск веб-сервера в Node.js относительно прост с библиотекой Express. Сначала установите его из терминала:
npm install --save express
После установки эти строки кода создадут экземпляр сервера:
// Load libraries and then initialize the server. var app = require('express')(); var http = require('http').Server(app); // When the user requests the root of the page (/), we respond with index.html. app.get('/', function(req, res){ res.sendFile(__dirname + '/index.html'); }); // We listen for connections on port 3000. http.listen(3000, function(){ console.log('listening on *:3000'); });
Сохраните это как файл server.js
.
В этом коде сервера первые две строки загружают необходимые библиотеки и создают экземпляр HTTP-сервера. Затем простая логика маршрутизации обслуживает файл index.html
из папки проекта, когда пользователь запрашивает корень ( /
). Наконец, порт 3000
прослушивает соединения.
Чтобы проверить это, создайте стандартный файл index.html
в корне папки проекта. В командной строке перейдите в папку вашего проекта и введите node server.js
. Если вы затем https://localhost:3000
или IP-адрес вашего компьютера и порт (например, https://190.140.0.00:3000
) в браузере, вы должны увидеть стандартную страницу index.html
. Это означает, что ваш сервер настроен.
Это было определенно проще, чем настроить сервер Apache!
Прежде чем объединить этот фрагмент кода с temperature.js
Temperature.js, мы настроим соединение WebSocket.
WebSocket позволяет открыть сеанс связи между браузером и сервером. С помощью этого API вы можете отправлять двусторонние сообщения в режиме реального времени и получать ответы, основанные на событиях, без необходимости запрашивать ответ. Socket.IO — это модуль Node.js, который вы собираетесь использовать для установки и обработки этого соединения. Установите Socket.IO так же, как вы установили Express и Johnny-Five:
npm install --save socket.io
Заметили, как ваш файл package.json
теперь обновляется с помощью Express и Socket.IO в зависимостях? Это означает, что любой, кто хочет запустить ваше приложение со своего компьютера, может просто запустить npm install
, и все зависимости модуля, которые вы загрузили, будут установлены сразу. Хороший! Теперь вы можете добавить функциональность WebSocket в работающий код server.js
. Ниже приведен полный пример:
var app = require('express')(); var http = require('http').Server(app); // Load the Socket.IO library. var io = require('socket.io')(http); app.get('/', function(req, res){ res.sendfile('index.html'); }); // Establish the WebSocket connection with the browser. io.on('connection', function(socket){ console.log('a user connected'); }); http.listen(3000, function(){ console.log('listening on *:3000'); });
Сначала загружается Socket.IO, а затем создается прослушиватель событий on connection
. Это сработает, когда пользователь загрузит файл index.html
.
На странице index.html
необходимо инициализировать клиентскую библиотеку Socket.IO для взаимодействия с сервером. Чтобы подготовить свой HTML-файл к этому, добавьте приведенный ниже фрагмент кода прямо перед закрывающим тегом body
:
<script src="https://cdn.socket.io/socket.io-1.2.0.js"></script> <script> var socket = io(); </script>
Теперь соединение должно быть установлено, и вы должны увидеть сообщение «Пользователь подключился» в командной строке при загрузке индексной страницы по ссылке localhost.
Теперь вы можете отправлять сообщения в браузер с сервера с помощью функции socket.emit()
. Вы можете сделать это, заменив предыдущую функцию в server.js
:
io.on('connection', function(socket){ console.log('a user connected'); socket.emit('Server message', “Hello from the server!”); });
Вот как вам нужно изменить index.html
, чтобы получить сообщение:
<script src="https://cdn.socket.io/socket.io-1.2.0.js"></script> <script> var socket = io(); socket.on('Server message', function (message) { console.log(message); }); </script>
Если вы все сделали правильно, вы должны увидеть сообщение «Привет с сервера!» сообщение в консоли вашего браузера. Поздравляем! Это означает, что вы установили соединение WebSocket в режиме реального времени между HTTP-сервером Node.js и браузером!
Это действительно очень полезно, и не только для этого проекта. Соединение WebSocket можно использовать для связи между несколькими браузерами для создания чат-приложений, многопользовательских игр и многого другого!
Теперь пришло время объединить файл temperature.js
, который отвечает за связь с Arduino, с нашим новым кодом сервера WebSocket, который отвечает за подключение к браузеру.
Это требует расширения server.js
:
var app = require('express')(); var http = require('http').Server(app); var io = require('socket.io')(http); var jfive = require("johnny-five"); var board = new jfive.Board(); var board, socket, connected = false; app.get('/', function(req, res){ res.sendFile(__dirname + '/index.html'); }); io.on('connection', function(s){ console.log('A user has connected'); // Tracking connection connected = true; // Saving this for the board on ready callback function socket = s; }); board.on("ready", function() { console.log('board has connected'); var tempSensor = new jfive.Thermometer({ controller: "TMP36", pin: "A0" }); tempSensor.on("data", function() { // We send the temperature when the browser is connected. if(connected) socket.emit('Temperature reading', this.celsius); }); }); http.listen(3000, function(){ console.log('listening on *:3000'); });
Здесь вы просто скопировали из temperature.js
строку, которая загружает Johnny-Five и инициализирует плату, а также всю board on ready
функции.
Вы также добавили две новые переменные: одну для отслеживания подключений WebSocket, а другую для хранения экземпляра сокета, чтобы другие функции были доступны — в данном случае для функции board on ready
, которая использует его для отправки и получения сообщений.
Теперь необходимо обновить файл index.html
, чтобы он обрабатывал данные, поступающие через Temperature reading
соединение. Приведенный ниже код необходимо добавить в документ HTML в элементах скрипта, где ранее существовал обработчик Server message
.
socket.on('Temperature reading', function (message) { console.log(message); });
Интерфейс
Последнее, что нужно сделать, это добавить несколько строк HTML и CSS в index.html
, чтобы отображать показания температуры в удобном для пользователя виде. Вы также собираетесь обновить цвет фона, чтобы он менялся между синим (холодный) и оранжевым (горячий) в зависимости от температуры. HTML очень прост: всего один элемент h1
для хранения числа.
В body
нужно добавить следующее.
<h1 class="temperature">0C</h1>
Большой тонкий шрифт должен очень хорошо сочетаться с цифрами; попробуйте Lato, бесплатный шрифт из библиотеки Google Fonts. Загрузите это в раздел head
документа:
<link href='https://fonts.googleapis.com/css?family=Lato:100' rel='stylesheet' type='text/css'>
Стиль в этом примере минимален. Единственный сложный момент — это способ загрузки метки temperature
. Он берет имя класса со свойством CSS content
и добавляет его к псевдоэлементу :before
.
body { background-color: hsl(0, 60%, 65%); transition: background-color 1s; } h1 { font-family: 'Lato', sans-serif; font-size: 120px; font-weight: 100; color: white; text-align: center; margin: 60px; } h1:before{ content: attr(class) ":"; font-size: 22px; position: relative; top: -69px; left: 0; text-transform: uppercase; }
Это уже выглядит красиво!
Чтобы закончить, добавьте несколько строк JavaScript для обновления значений при получении сообщения WebSocket и для изменения цвета фона.
<script src="https://cdn.socket.io/socket.io-1.2.0.js"></script> <script> var socket = io(), temperature = document.querySelector(".temperature"); socket.on('Temperature reading', function(message) { // Rounding down the decimal values and adding C temperature.innerHTML = parseInt(message) + "C"; // Calculating the hue for the background color and changing it var hue = 200 - (parseInt(message) * 5); document.body.style.backgroundColor = "hsl(" + hue + ", 60%, 65%)"; }); </script>
Готово! Показания температуры Arduino теперь будут отображаться в реальном времени в браузере.
Заключение
Хотя перспектива создания собственного оборудования может быть пугающей, надеюсь, после работы с этими двумя примерами вы уже обдумываете возможности и планируете свой следующий проект. Многие компоненты совместимы с библиотекой Johnny-Five, а это означает, что единственным ограничением является ваше воображение.
Ресурсы
- «Взлом оборудования с помощью JavaScript», Джеймс Миллер и Мейт Маршалко, GitHub
Весь код, необходимый для этого проекта - Джонни-Пять, Рик Уолдрон, GitHub
«Среда программирования робототехники на JavaScript» - Веб на устройствах, Мате Маршалко
Веб-сайт по взлому электроники с помощью JavaScript и других веб-технологий. - Сделать
Интернет-журнал Maker Media, предназначенный для производителей, предлагающий новые проекты, а также советы. - Руководство экспериментатора Arduino для Node.js
Другие проекты JavaScript и Arduino с Johnny-Five