Статьи

Управление мотоциклом с помощью Arduino и Node.js

Недавно 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 .