Удаленное управление мотором постоянного тока с 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. Эти контакты будут использоваться для изменения направления движения ротора двигателя постоянного тока. Полная схема подключения приведена на рисунке ниже:

Подключение двигателя постоянного тока к 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. За основу взят миинималистичный проект с простенькими задачами - удаленное изменение скорости и направления вращения ротора двигателя постоянного тока через веб-сервер. Рекомендуем детально ознакомиться со всеми раскрытыми в статье пояснениями. Это станет для вас хорошей базой для дальнейших более сложных проектов. Допиливайте код, обогащайте его. Например, можно добавить выбор задержки между сменой направления вращения ротора двигателя и т.п. Ограничение - лишь ваш кругозор и энтузиазм.

Оставляйте Ваши комментарии, вопросы и делитесь личным опытом ниже. В дискуссии часто рождаются новые идеи и проекты!