Удаленное управление мотором постоянного тока с Arduino и Node.js
В статье рассмотрено как передавать команды Arduino для удаленного управления периферийными устройствами.
Рассмотрен простейший пример: управление двигателем постоянного тока. Уверен, многим этот пример будет интересен, так это основа автоматизации вашего умного дома. Использовать приведенный ниже материал можно для управления жалюзи или ролетами, в которых тоже используются двигатели постоянного тока, но большей мощности. Для реализации проекта вам понадобятся Arduino и некоторые навыки работы с Node.js и JavaScript.
Оборудование и софт, которые вам понадобятся
Кроме Arduino Uno и монтажной платы, вам понадобятся:
- двигатель постоянного тока, с номинальным напряжением около 5 Вольт, чтобы запитать его непосредственно от Arduino. Могут подойти даже двигатели от игрушек: детских машинок и т.п.
- в этом проекте мы будем вращать вал двигателя в двух направлениях. Если мы используем транзистор, вращение будет только в одну сторону. Для реализации вращения в двух направлениях, задействуем драйвер двигателя L293D.
Полный список необходимых компонентов для проекта:
- плата Arduino Uno R3;
- драйвер двигателя L293D;
- двигатель постоянного тока 5 В;
- монтажная плата и коннекторы.
С точки зрения софта. Конечно же, понадобится Arduino IDE. Для управления двигателем напрямую с веб-страницы, вам также понадобится библиотека aREST library. На сайте Arduino-diy.com есть подробная инструкция по установке дополнительных библиотек для Arduino.
Кроме того, вам понадобится Node.js. В нем мы реализуем пользовательский интерфейс. Скачать Node.js можно здесь.
Подключение оборудования
Нам необходимо правильно подключить двигатель и драйвер. Сначала установите на монтажную плату драйвер L293D. Рекомендуем устанавливать драйвер по центру монтажной платы, как это показано на рисунке ниже. Драйвер начинается с дорожки 3 и заканчивается на дорожке 10. Теперь подключите дорожки 8 и 9 к 5 В Arduino. Контакт 5 - к контакту GND на Arduino. Осталось 3 контакта , которые работают на вход и 2 - на выход.
Цепь, которая работает на выход, простая: два контакта output подключаем к контактам двигателя постоянного тока. Контакты output - это 3 и 6. Первый контакт для подключения - это пин 1. Так называемый Enable контакт. Это контакт, который мы используем для включения/выключения двигателя и изменения его скорости вращения. Подключите этот контакт к 6 пину на Arduino. В конце концов, мы хотим подключить контакты 2 и 7 от L293D к пинам 4 и 5 на Arduino. Эти контакты будут использоваться для изменения направления движения ротора двигателя постоянного тока. Полная схема подключения приведена на рисунке ниже:

Проверка схемы подключения
Перед реализацией удаленного управления, надо убедиться, что электросхема с драйвером L293D составлена и подключена корректно. Для проверки реализуем простенький скетч, благодаря которому двигатель разгонится и будет вращаться без остановки. Для этого используем следующий скетч:
// Инициализируем контакты мотора
int motorPinPlus = 4;
int motorPinMinus = 5;
int motorPinEnable = 6;
void setup()
{
pinMode(motorPinPlus, OUTPUT);
pinMode(motorPinMinus, OUTPUT);
pinMode(motorPinEnable, OUTPUT);
Serial.begin(9600);
}
void loop()
{
// Объявляем переменную для хранения значений скорости
int motor_speed;
// Вращаем ротор двигателя в заданном направлении
for (motor_speed = 0; motor_speed < 250; motor_speed++)
{
setMotor(true, motor_speed);
delay(10);
}
}
// функция для управления двигателем
void setMotor(boolean forward, int motor_speed)
{
digitalWrite(motorPinPlus, forward);
digitalWrite(motorPinMinus, !forward);
analogWrite(motorPinEnable, motor_speed);
}
Основа данного скетча - функция setMotor. Эту же функцию мы будем использовать в остальной части нашего проекта. Давайте разберем ее более детально:
// Функция для управления мотором
void setMotor(boolean forward, int motor_speed){
digitalWrite(motorPinPlus, forward);
digitalWrite(motorPinMinus, !forward);
analogWrite(motorPinEnable, motor_speed);
}
Задействовано два входа: направление и скорость. Первый шаг заключается в том, чтобы реализовать две операции digitalWrite() для установки направления вращения ротора двигателя. Один контакт на микросхеме L293D получает сигнал 5В, а второй - 0 вольт. После этого мы используем команду analogWrite(), чтобы изменять скорость вращения ротора мотора с использованием широтно-импульсной (ШИМ) модуляции. С помощью этой функции можно изменять направление вращения двигателя. Например, для ускорения мы используем:
// Вращаем ротор двигателя в заданном направлении
for (motor_speed = 0; motor_speed < 250; motor_speed++)
{
setMotor(true, motor_speed);
delay(10);
}
Загрузите приведенный скетч на Arduino и мотор должен начать разгоняться до максимального значения. После этого скорость упадет до нуля и разгон начнется заново. Если все отработало как указано выше, можно переходить к следующей части нашего проекта.
Собираем все вместе
На данном этапе мы уже реализовали управление двигателем постоянного тока через Arduino. Теперь давайте соберем все вместе и разработаем веб-интерфейс для нашего проекта.
Во-первых, нам надо изменить скетч Arduino, чтобы он мог он мог получать данные с хоста. После этого мы используем Node.js, чтобы обеспечить красивый интерфейс пользовательский интерфейс. Если вы никогда не занимались веб-приложениями, не волнуйтесь, в гайде детально рассмотрен каждый шаг.
Давайте начнем со скетча Arduino. Это скетч, который мы используем в этой части:
// библиотеки
#include <aREST.h>
// создаем aREST
aREST rest = aREST();
// Инициализируем пины мотора
int motorPinPlus = 4;
int motorPinMinus = 5;
int motorPinEnable = 6;
void setup(void)
{
// запускаем обмен данных по серийному протоколу связи и объявляем пины мотора
pinMode(motorPinPlus, OUTPUT);
pinMode(motorPinMinus, OUTPUT);
pinMode(motorPinEnable, OUTPUT);
Serial.begin(115200);
// даем имя и ID нашему устройству
rest.set_id("001");
rest.set_name("motor_control");
}
void loop() {
// Handle REST calls
rest.handle(Serial);
}
При изучении скетча вы увидите, что он отличается от предыдущего. В нем тот же блок для инициализации контактов двигателя, но есть еще aREST для получения команд. Например, чтобы установить заданную скорость мотора, мы реализуем запрос с компьютера вида:
/analog/6/200
Похожие запросы мы будем делать с нашего ПУ для управления другими пинами. Например, пинами, которые отвечают за направление.
Последний блок состоит в разработке веб-интерфейса для удаленного управления скоростью мотора. Для этого мы будем использовать Node.js, который позволяет разрабатывать приложения, работающие на стороне сервера в Javascript. Этот туториал не про Node.js или Javascript, но основные моменты надо рассмотреть. Конечно же, все файлы прилагаются на GitHub.
Нам надо создать три файла: главный файл Node.js, сам интерфейс и кусок Javascript для обработки кликов в нашем пользовательском интерфейсе. Давайте начнем с файла Node.js. Код начинается с подгружения и настройки модуля Express, который представляет из себя фреймворк для простого создания сервера с Node.js:
// Модуль
var express = require('express');
var app = express();
// Объявляем порт
var port = 3000;
// Отображаем движок
app.set('view engine', 'jade');
// Настраиваем общедоступную папку
app.use(express.static(__dirname + '/public'));
// Интерфейс
app.get('/', function(req, res){
res.render('dashboard');
});
После этого мы импортируем модуль Node-aREST, который обеспечивает связь между нашим сервером и платой Arduino:
var rest = require("arest")(app);
В этом файле мы также должны определить, к какому серийному порту подключена плата Arduino:
rest.addDevice('serial','/dev/tty.usbmodem1a12121',115200);
Конечно же, вам надо изменить это значение в соответствии с вашим серийным портом. Найти ваш серийный порт можно в Arduino IDE в меню Tools>Port.
Давайте заглянем в файл интерфейса, который расположен в dashboard.jade. Jade - язык, который по сути упрощает написание HTML - разметки. В Jade содержится описание интерфейса, который потом обрабатывается с помощью Node.js & Express. Ниже приведен Jade файл для нашего проекта. В нем создаются две кнопки (для направлений) и один слайдер (для изменения скорости двигателя):
h1 Motor Control
.row.voffset
.col-md-4
button.btn.btn-block.btn-lg.btn-primary#1 Forward
.col-md-4
button.btn.btn-block.btn-lg.btn-danger#2 Reverse
.col-md-4
input(type='range',min='0',max='255',value='0',id='motorspeed')
В конце мы должны добавить Javascript для обработки кликов пользователя по кнопкам и слайдеру. Это код для кнопки ‘Forward’ ('Вперед'):
$("#1").click(function() {
$.get('/motor_control/digital/4/1', function() {
$.get('/motor_control/digital/5/0');
});
});
Как мы видим, пин 4 установлен в HIGH, а пин 5 в LOW. Другие кнопки отрабатывают с точностью до наоборот. То есть, при их нажатии, мотор будет двигаться в противоположном направлении.
Для того, чтобы установить скорость мотора, мы определяем, когда пользователь отпустил слайдер. Реализуется это с помощью mouseup():
$("#motorspeed").mouseup(function(){
// Получаем значение скорости
speed = $("#motorspeed").val();
// Отсылаем команду
$.get("/motor_control/analog/6/" + speed);
});
Теперь можем перейти к тестированию проекта удаленного управления двигателем через веб-сайт. Не забывайте, что все исходники кода для программ, вы можете найти на GitHub. Сначала загрузите скетч remote_motor на Arduino. После этого убедитесь, что вы загрузили все файлы интерфейса и настроили ваш серийный порт в главном файле app.js.
Перейдите в эту папку через терминал и пропишите следующее:
sudo npm install express jade arest
После этого запустите приложение с помощью:
node app.js
После этого вы можете перейти в ваш браузер и набрать в строке адреса следующее:
http://localhost:3000
В результате отобразится следующий интерфейс:

Дальше можно тестить и играться. Например, устанавливая направление вращения или используя слайдер для изменения скорости вращения. Мотор должен реагировать на ваши нажатия. Можно использовать ваш смартфон или планшет. Для этого достаточно использовать IP вашего компьютера и благополучно менять скорость двигателя с вашего мобильного устройства.
Дальнейшие направления развития проекта
Приведенный выше туториал очень важен для понимания основ удаленного управления вашими устройствами с помощью Arduino. За основу взят миинималистичный проект с простенькими задачами - удаленное изменение скорости и направления вращения ротора двигателя постоянного тока через веб-сервер. Рекомендуем детально ознакомиться со всеми раскрытыми в статье пояснениями. Это станет для вас хорошей базой для дальнейших более сложных проектов. Допиливайте код, обогащайте его. Например, можно добавить выбор задержки между сменой направления вращения ротора двигателя и т.п. Ограничение - лишь ваш кругозор и энтузиазм.
Оставляйте Ваши комментарии, вопросы и делитесь личным опытом ниже. В дискуссии часто рождаются новые идеи и проекты!