Недавно GitHub опубликовал пост в блоге, который показал, как различные языки развивались в течение времени. Ранг представляет языки, используемые в публичных и частных репозиториях GitHub, за исключением вилок, обнаруженных библиотекой под названием Linguist . Как видно из этого, JavaScript определенно выигрывает гонку в самых разных областях. Язык программирования становится очень популярным выбором для игрового программирования, робототехники и устройств IoT, несмотря на очень сильную конкуренцию со стороны C, C ++ и Java. Когда JavaScript начал приводить роботов в действие, родились NodeBots .
NodeBots — это роботы, управляемые Node.js. Если вам интересно узнать о них немного больше, я предлагаю вам прочитать статью Патрика Катандзарити под названием «Введение в NodeBots ».
В этом уроке мы сделаем простой NodeBot, которым можно будет управлять из браузера. Исходный код всего проекта доступен на GitHub .
Настройка оборудования
Мы будем использовать следующее оборудование для этого проекта:
- Arduino
- 2 Моторс
- L298 Контроллер мотора
- Шнур, соединяющий Arduino с компьютером
Arduino — это платформа для создания прототипов с открытым исходным кодом, основанная на простом в использовании аппаратном и программном обеспечении. Он используется в тысячах проектов по всему миру. Причина, по которой мы используем Arduino, заключается в том, что он имеет дело с дешевой и легко расширяемой кроссплатформенной платформой (она работает на Windows, Linux и OS X).
Начнем с сборки оборудования. Представление о связях приведено ниже.
В случае, если вы обнаружите какие-либо трудности в понимании номеров контактов, обратитесь к схематической диаграмме, приведенной ниже.
Я бы посоветовал вам выбирать двигатели в соответствии с вашими потребностями (например, нагрузка, которую он должен нести). Если вы используете двигатель с более высоким номинальным напряжением, вам, возможно, придется использовать внешний источник питания, так как напряжение, предоставляемое Arduino, может быть недостаточным.
Как только мы закончим с подключениями, мы должны убедиться, что StandardFirmata установлена на плате. Firmata — это общий протокол для связи с микроконтроллерами из программного обеспечения на главном компьютере. Для этого выполните следующие простые шаги:
- Скачать Arduino IDE
- Подключите ваш Arduino или Arduino-совместимый микроконтроллер через USB
- Откройте Arduino IDE, выберите « Файл»> «Примеры»> «Firmata»> «StandardFirmata».
- Нажмите кнопку «Загрузить».
После подключения оборудования и загрузки StandardFirmata на Arduino мы можем перейти к следующему разделу, где мы создадим веб-приложение.
Начало работы с приложением
Чтобы начать с веб-приложения, давайте определим программные зависимости нашего проекта. Для этого мы создадим файл package.json
который выглядит следующим образом:
{ "name": "nodebot-sample", "dependencies": { "express": "^4.11.2", "johnny-five": "^0.8.53", "socket.io": "^1.3.3" }
Запустите npm install
в корне папки проекта после создания файла, чтобы все зависимости были установлены. Если вы не знакомы с npm , взгляните на статью под названием «Руководство для начинающих по npm — менеджер пакетов узлов» от Peter Dierx .
Серверный код
Код сервера опирается на Node.js и Express . Мы создадим файл с именем index.js
в корне каталога нашего проекта. Этот файл будет содержать всю нашу логику на стороне сервера.
var express = require('express'); var app = express(); var io = require('socket.io')(app.listen(8081)); var five = require('johnny-five'); app.use(express.static(__dirname + '/app')); app.get('/', function (res) { res.sendfile('/index.html'); }); var board = new five.Board({ repl:false });
Функция express()
является функцией верхнего уровня, экспортируемой модулем Express. express.static()
отвечает за обслуживание статических ресурсов на стороне клиента. app.get
направляет HTTP-запросы по указанному пути с помощью функции обратного вызова. Объект res
представляет собой HTTP-ответ, который экспресс-приложение отправляет, когда получает запрос. Метод sendFile
отправляет файл по указанному пути в браузер.
Мы используем Socket.IO для поддержания соединения в реальном времени между клиентом и сервером, используя возможности WebSockets и johnny-5, чтобы помочь Arduino в связи с сервером. johnny-Five — основа программирования IoT и робототехники на основе протокола Firmata.
Для начала создадим новый экземпляр Board
. После этого вся логика будет реализована после того, как плата будет готова (что означает, что событие ready
запущено). Внутри функции обратного вызова мы создаем два экземпляра Motor
, предоставляя массив с двумя числами. В частности, [3,12]
и [11,13]
представляют контакты Arduino, к которым присоединены соответствующие двигатели.
board.on('ready', function () { var speed, commands, motors; motors = { a: new five.Motor([3, 12]), b: new five.Motor([11, 13]) }; commands = null; io.on('connection', function (socket) { socket.on('stop', function () { motors.a.stop(); motors.b.stop(); }); socket.on('start', function () { speed = 255; motors.a.fwd(speed); motors.b.fwd(speed); }); socket.on('reverse', function () { speed = 120; motors.a.rev(speed); motors.b.rev(speed); }); socket.on('left', function () { var aSpeed = 220; var bSpeed = 50; motors.a.fwd(aSpeed); motors.b.rev(bSpeed); }); socket.on('right', function () { var aSpeed = 50; var bSpeed = 220; motors.a.rev(aSpeed); motors.b.fwd(bSpeed); }); }); });
Скорость двигателей указывается числом в диапазоне от 0 до 255. Метод .stop()
позволяет остановке двигателя останавливаться. Существует также альтернативный метод .brake()
который заставляет двигатель останавливаться (а не .brake()
, но он работает только для плат с выделенным тормозным штифтом. .fwd()
и .rev()
являются просто псевдонимами для .forward()
и .reverse()
. Все они принимают число в качестве аргумента в диапазоне от 0 до 255, чтобы контролировать скорость. Мы используем разные комбинации скорости движения вперед и назад для получения разных движений двигателей.
Чтобы завершить наш проект, мы должны определить, когда пользователь выбрал конкретную опцию на стороне клиента в режиме реального времени. Это где Socket.IO вступает в игру. Событие connection
наступает, когда устанавливается новое соединение с клиентом. Всякий раз, когда клиент .on()
событие, метод .on()
позволяет нам прослушивать это событие на стороне сервера и выполнять некоторые действия.
Код на стороне клиента
Реализация на стороне клиента включает создание интерфейса, в котором пользователь может выбирать различные движения двигателей. Мы начнем с создания файла index.html
внутри папки app
в корне каталога. На этой странице мы включаем клиентскую версию Socket.IO.
<body> <div class="container"> <i class="fa fa-angle-up" id="forward"></i> <i class="fa fa-angle-left" id="left"></i> <i class="fa fa-angle-down" id="reverse"></i> <i class="fa fa-angle-right" id="right"></i> <i class="fa stop" id="stop">STOP</i> </div> <script src="//cdnjs.cloudflare.com/ajax/libs/socket.io/1.3.6/socket.io.min.js"></script> <script src="app.js"></script> </body>
Socket.IO предоставляет глобальный метод, который добавляется к объекту window
, который называется io()
. socket.emit('right')
отправит сообщение обратно на сервер с именем события right
. Как только .emit()
вызывается на клиенте, выполняется обратный вызов, прикрепленный с помощью socket.on('right')
на сервере.
var socket = io(); function moveForward(){ socket.emit('start'); } function turnRight(){ socket.emit('right'); } function turnLeft(){ socket.emit('left'); } function moveReverse(){ socket.emit('reverse'); } function stop(){ socket.emit('stop'); } document.getElementById('forward').onclick = moveForward; document.getElementById('right').onclick = turnRight; document.getElementById('left').onclick = turnLeft; document.getElementById('reverse').onclick = moveReverse; document.getElementById('stop').onclick = stop;
С этим последним фрагментом мы завершили код. Теперь вы готовы управлять своими моторами из браузера. Вы даже можете привязать события keypress
клавиш к клавишам со стрелками и управлять двигателями, используя их.
Чтобы запустить сервер, откройте терминал и запустите node index.js
в корне каталога проекта. Теперь вы можете зайти на свою веб-страницу по адресу 127.0.0.1:8081
в браузере и начать управлять своими двигателями оттуда. Если есть какие-либо проблемы, такие как Board not found
, убедитесь, что соединение между Arduino и компьютером в порядке, и вы правильно загрузили StandardFirmata из Arduino IDE на плату.
Этот проект был очень маленьким примером того, чего вы можете достичь, комбинируя Node.js и Arduino. Вы можете использовать возможности WebSockets для передачи данных, полученных от датчиков ( MPU6050 ), в браузер в режиме реального времени. Вы можете отображать графики в реальном времени на основе этого и управлять двигателями на основе показаний, которые вы получаете. Подобную реализацию этих принципов можно найти здесь, которая является продолжением текущего проекта. Если вы заинтересованы в проекте, вы обязательно должны его проверить.
Выводы
В этом уроке мы научились создавать базовый NodeBot. В то же время мы также изучили различные возможности, которые предлагает Node.js, и то, как мы можем использовать его возможности для создания связи между веб-приложениями и роботами.
Надеюсь, вам понравилась статья и вы нашли еще несколько причин полюбить JavaScript. Еще раз хочу подчеркнуть, что вы можете найти исходный код всего проекта на GitHub .