Управление реле с arduino через интернет. Принцип работы транзистора для плавного управления светодиодной лентой. Проверка схемы подключения

К настоящему времени системы типа «умный дом» из удивительной экзотики, доступной только самым состоятельным лицам, превратились в обыденность, к которой может приобщиться любой желающий. Выбирать есть из чего: выпуск подобных аппаратно-программных комплексов освоили очень многие разработчики. К числу наиболее известных принадлежит компания Arduino, с продукцией которой мы сейчас и познакомимся.

Что такое «умный дом»

У этого термина есть более понятный аналог - «домашняя автоматизация». Суть подобных решений состоит в том, чтобы обеспечить автоматическое выполнение различных процессов, происходящих в жилище, офисе или на специализированных объектах. Простейший пример - автоматическое включение освещения в тот момент, когда кто-то из жильцов входит в комнату.


Система «умный дом» от Arduino представляет собой комплект оборудования для управления работой различных устройств с помощью мобильного телефона на базе ОС Android

В любой системе «умный дом» можно выделить следующие составляющие:


Современные системы «умный дом» делятся на несколько разновидностей:

  1. Оснащённые собственным контроллером.
  2. Использующие в этом качестве процессор пользовательского компьютера (планшета, смартфона).
  3. Обрабатывающие информацию при помощи удалённого сервера, принадлежащего компании-разработчику (облачный сервис).

Система может не только активировать тот или иной прибор, но и проинформировать пользователя о происшедшем событии путём отправки сообщения на телефон или каким-то иным способом. Таким образом, на неё можно возложить функции сигнализации, в том числе и противопожарной.

Сценарии могут быть гораздо более сложными, чем мы описали в примерах. Например, можно научить систему включать бойлер и переводить снабжение горячей водой на него при отключении централизованной подачи, если при этом обнаруживается присутствие кого-то из жильцов в доме (помогают инфракрасные, ультразвуковые датчики, а также датчики движения).

Знакомимся с Arduino

Arduino - итальянская компания, занимающаяся разработкой и производством компонентов и программного обеспечения для простых систем «умный дом», предназначенных для неспециалистов. Примечательным является то, что этот разработчик сделал архитектуру созданных им систем полностью открытой, что дало возможность сторонним производителям разрабатывать новые и копировать уже существующие Arduino-совместимые устройства, а также выпускать ПО для них.

Набор Arduino Uno содержит необходимые компоненты для реализации устройств, описанных в прилагаемой книге

Такой подход обеспечил высокую популярность системам итальянской компании, но у него есть и недостаток: из-за того что за производство компонентов для Arduino-систем берутся, так сказать, все кому не лень, не всегда удаётся с первого раза приобрести качественное изделие. Зачастую приходится сталкиваться и с проблемой совместимости компонентов от разных производителей.

Потенциальному пользователю следует знать, что с 2008 года существуют две компании, выпускающие продукцию под торговой маркой Arduino. У первой, которая начинала это направление, официальный сайт размещён по адресу www.arduino.cc ; у второй, новообразовавшейся - по адресу www.arduino.org . То, что было разработано до раскола, на обоих сайтах представлено одинаково, а вот ассортимент новой продукции уже отличается.

ПО для систем «умный дом» Arduino имеет вид программной оболочки (называется IDE), в которой можно писать и компилировать программы. Распространяется бесплатно. Программы пишутся на языке C++.

Версии программы Arduino IDE, представленные на указанных сайтах, тоже сильно отличаются, хотя имеют одинаковые не только название, но и номера версий. Из-за этого в них довольно легко запутаться. Отличие состоит в том, что каждое ПО поддерживает свои библиотеки и платы.

«Железо» системы состоит из платы с микроконтроллером (процессорная плата) и установленных на ней плат расширения, которые в обиходе называют шилдами. Подключение шилд к процессорной плате позволяет добавлять к «умному дому» новые компоненты. Собранная система может быть как полностью автономной, так и работающей в связке с компьютером через стандартный проводной или беспроводной интерфейс.


На процессорную плату можно устанавливать специальные расширения (шилды), которые увеличивают функциональность системы

Преимущества системы Arduino

Этот аппаратно-программный комплекс привлекает пользователя такими достоинствами:

  • возможность автономной работы, обусловленная наличием собственного контроллера;
  • широкие возможности по настройке работы системы (пользователь сам пишет программу, в которой могут быть предусмотрены сценарии любой сложности);
  • простота процесса загрузки программы в контроллер: программатор для этого не требуется, достаточно иметь USB-кабель (в микроконтроллере имеется прошивка загрузчика Bootloader);
  • доступная стоимость компонентов, обусловленная отсутствием у того или иного производителя монопольных прав (архитектура является открытой).

Если загрузчик Bootloader стал работать со сбоями, либо в приобретённом микроконтроллере его не оказалось, пользователь имеет возможность прошить его самостоятельно. В программной оболочке IDE для этой цели предусмотрена поддержка ряда наиболее доступных и популярных программаторов. Кроме того, почти все процессорные платы Arduino имеют штыревой разъём, позволяющий осуществлять внутрисхемное программирование.

В программе Arduino IDE, представленной на сайте arduino.cc, заложена возможность создания пользовательских аппаратно-программных платформ, в то время как в версии программы на arduino.org такая функция отсутствует.

Какие решения предлагает Arduino

Поскольку производством Arduino-совместимых датчиков и приборов занимается множество компаний, ассортимент этой продукции довольно широк. Вот что применяется чаще всего:


Некоторые из этих устройств включены в состав базового набора Arduino Start, который у ряда производителей имеет название StarterKit.


Стартовый набор системы Arduino включает в себя процессорную плату и несколько наиболее часто используемых устройств

Исполнительная часть содержит огромный набор устройств, например:

  • электромоторы;
  • реле и различные переключатели;
  • диммеры (позволяют плавно менять интенсивность освещения);
  • доводчики дверей;
  • вентили и 3-ходовые клапаны с сервоприводами.

Если вы планируете подключить через реле Arduino освещение, то правильнее использовать в качестве светильников светодиодные лампы. Лампы накаливания при подключении через такие реле быстро горят.

Видео: начинаем работать с Arduino - управляем светодиодом через web-интерфейс

Составление проекта на Arduino

Процесс создания и настройки «умного дома» Arduino покажем на примере системы, в которую будут заложены следующие функции:

  • мониторинг температуры на улице и в помещении;
  • отслеживание состояния окна (открыто/закрыто);
  • мониторинг погодных условий (ясно/дождь);
  • генерация звукового сигнала при срабатывании датчика движения, если активирована функция сигнализации.

Систему настроим таким образом, чтобы данные можно было просматривать посредством специального приложения, а также веб-браузера, то есть пользователь сможет сделать это из любого места, где есть доступ в интернет.

Используемые сокращения:

  1. «GND» - заземление.
  2. «VCC» - питание.
  3. «PIR» - датчик движения.

Необходимые компоненты для изготовления системы «умного дома»

Для системы «умного дома» Arduino потребуется следующее:

  • микропроцессорная плата Arduino;
  • модуль Ethernet ENC28J60;
  • два температурных датчика марки DS18B20;
  • микрофон;
  • датчик дождя и снега;
  • датчик движения;
  • переключатель язычковый;
  • реле;
  • резистор сопротивлением 4,7 кОм;
  • кабель «витая пара»;
  • кабель Ethernet.

Стоимость всех компонентов составляет примерно 90 долларов.


Для изготовления системы с необходимыми нам функциями потребуется набор устройств стоимостью около 90 долларов

Сборка «умного дома»: пошаговая инструкция

Вот в какой последовательности необходимо действовать.

Подключение исполнительных и сенсорных устройств

Подключаем все компоненты согласно схеме.


Сборка системы в основном сводится к подключению исполнительных устройств к соответствующим контактам процессорной платы

Разработка программного кода

Пользователь пишет всю программу целиком в оболочке Arduino IDE, для чего последняя оснащена текстовым редактором, менеджером проектов, компилятором, препроцессором и средствами для заливки программного кода в микропроцессор платы Arduino. Разработаны версии IDE для операционных систем Mac OS X, Windows и Linux. Язык программирования - С++ с некоторыми упрощениями. Пользовательские программы для Arduino принято называть скетчами (sketch) или набросками, программа IDE сохраняет их в файлы с расширением «.ino».

Функцию main(), которая в С++ является обязательной, оболочка IDE создаёт автоматически, прописывая в ней ряд стандартных действий. Пользователь должен написать функции setup() (выполняется единоразово во время старта) и loop() (выполняется в бесконечном цикле). Обе эти функции для Arduino являются обязательными.

Заголовочные файлы стандартных библиотек вставлять в программу не нужно - IDE делает это автоматически. К пользовательским библиотекам это не относится - они должны быть указаны.

Добавление библиотек в «Менеджер проекта» IDE осуществляется несколько необычным способом. В виде исходных текстов, написанных на С++, они добавляются в особую папку в рабочем каталоге оболочки IDE. После этого названия этих библиотек появятся в соответствующем меню IDE. Те, что отметит пользователь, будут внесены в список компиляции.

В IDE предусмотрен минимум настроек, а возможность настройки компилятора отсутствует вовсе. Таким образом, начинающий программист застрахован от ошибок.

Вот пример самой простой программы, заставляющей каждые 2 секунды мигать подключённый к 13-му выводу платы светодиод:

void setup () { pinMode (13, OUTPUT); // Назначение 13 вывода Arduino выходом}

void loop () { digitalWrite (13, HIGH); // Включение 13 вывода, параметр вызова функции digitalWrite HIGH - признак высокого логического уровня

delay (1000); // Цикл задержки на 1000 мс - 1 секунду

digitalWrite (13, LOW); // Выключение 13 вывода, параметр вызова LOW - признак низкого логического уровня

delay (1000); // Цикл задержки на 1 секунду}

Однако в настоящий момент перед пользователем далеко не всегда встаёт необходимость лично писать программу: в сети выложено множество готовых библиотек и скетчей (загляните сюда: http://arduino.ru/Reference). Имеется готовая программа и для системы, рассматриваемой в этом примере. Её нужно загрузить, распаковать и импортировать в IDE. Текст программы снабжён комментариями, поясняющими принцип её работы.


Все программы на Arduino работают по одному принципу: пользователь посылает запрос процессору, а тот загружает необходимый код на экран компьютера или смартфона

Когда пользователь нажимает в браузере или установленном на смартфоне приложении кнопку «Refresh» (Обновление), микроконтроллер Arduino осуществляет отсылку данных этому клиенту. С каждой из страниц, обозначенных как «/tempin», «/tempout», «/rain», «/window», «/alarm», поступает программный код, который и отображается на экране.

Установка клиентского приложения на смартфон (для ОС Android)

Для получения данных от системы «умный дом» в сети можно скачать готовое приложение.

Вот что необходимо сделать владельцу гаджета:


С помощью этого приложения можно не только получать информацию от системы «умный дом», но и управлять ею - включать и отключать сигнализацию. Если она включена, то при срабатывании датчика движения приложению будет отправлено уведомление. Опрос системы Arduino на предмет срабатывания датчика движения приложение выполняет с периодичностью раз в минуту.

Активировав иконку «Настройки», можно отредактировать свой IP-адрес.

Настройка браузера на работу с «умным домом»

В адресной строке браузера следует ввести XXX.XXX.XXX.XXX/all, где «XXX.XXX.XXX.XXX» - ваш IP-адрес. После этого появится возможность получать данные от системы и осуществлять управление ею.

Представленный здесь программный код позволяет через браузер включать и выключать свет, тогда как в приложении для Android-смартфона такая функция не реализована.

Работа с роутером


Настройка учётной записи на noip.com

Этот этап не является обязательным, но он необходим, если вы хотите присвоить адресу доменное имя. Для этого надо зарегистрироваться на сайте https://www.noip.com/ , перейти в раздел «Add host» и ввести IP-адрес системы.


После регистрации на сайте noip.com доступ к системе можно получать не только по IP-адресу, но и по полному доменному имени

Создание проекта завершено, можно проверять работоспособность системы.

Видео: умный дом на «Ардуино»

Особенности работы некоторых аппаратных средств Arduino

Ввиду того что Arduino-совместимые компоненты выпускаются множеством сторонних компаний, качество продукции которых сама компания Arduino никак не контролирует, пользователь с большой вероятностью может приобрести компонент, работающий не совсем корректно.

Похожая ситуация сложилась в сфере разработки персональных компьютеров. В своё время компания IBM сделала архитектуру своих компьютеров открытой, вследствие чего IBM-совместимые компьютеры и отдельные компоненты стали выпускать многие компании. В итоге «персоналки» этого типа широко распространились по всему миру, однако, качество комплектующих и степень их совместимости во многих случаях оказывались не на самом высоком уровне. Противоположной тактики придерживалась компания Apple. Она ограничила круг разработчиков, имеющих доступ к архитектуре, и такую же политику провела в сфере разработки ПО. В итоге компьютеры Apple оказались менее распространёнными и более дорогими, но зато по качеству они на порядок превосходят IBM-совместимые устройства, работающие под Windows.

В отношении некоторых комплектующих для систем Arduino пользователи заметили следующее:

  1. Датчик температуры DHT11, поставляемый с базовым набором (StarterKit), даёт значительную погрешность в 2–3 градуса. В помещении рекомендуют применять температурный датчик DHT22, дающий более точные показания, а для установки на улицу - DHT21, способный работать при отрицательных температурах и имеющий защиту от механических повреждений.
  2. На некоторых микропроцессорных платах Arduino при замыкании подключённых к ним реле выходит из строя COM-порт. Из-за этого на микроконтроллер не удаётся загрузить скетч: как только начинается заливка, процессор перезагружается. Реле при этом щёлкает, COM-порт отключается и процесс загрузки скетча прекращается.
  3. Датчик закрытия окна/двери иногда преподносит сюрпризы в виде ложных срабатываний. С учётом этого скетч пишут так, чтобы система производила необходимое действие только по получении нескольких сигналов подряд.
  4. Для настройки управления процессами при помощи хлопков некоторые пользователи по неопытности вместо микрофона заказывают детектор звука с ручной настройкой порога. Для подобных целей этот компонент не подходит, так как имеет слишком малый радиус действия: хлопать приходится не далее 10 см от детектора. Кроме того, этот датчик передаёт сигналы импульсами малой продолжительности, так что при наличии большого скетча, на обработку которого уходит сравнительно много времени, микроконтроллер просто не успевает их зафиксировать.
  5. Для устройства противопожарной сигнализации следует использовать датчик дыма, а не датчик огня. Последний регистрирует пламя не далее 30 см от себя.
  6. На случай сбоя в работе микроконтроллера или ошибки в коде лучше применять нормально замкнутые реле с последовательно подключёнными ручными выключателями.

Чтобы избежать покупки низкокачественных комплектующих, бывалые пользователи рекомендуют предварительно изучать отзывы о них, опубликованные в Сети. Недорогие датчики можно покупать в нескольких вариантах, чтобы лично проверить, какой из них работает лучше.

Возможно, система «умный дом» от компании Arduino является не самой качественной, но зато широчайший выбор компонентов и их доступная стоимость точно сделали её одной из самых популярных. Воспользовавшись нашими советами, вы быстро научитесь создавать проекты Arduino, автоматизируя различные домашние процессы.

Ардуино идеально подходит для управления любыми устройствами. Микропроцессор ATmega с помощью программы-скетча манипулирует большим количеством дискретных выводов, аналогово-цифровых входов/выводов и ШИМ-контроллерами.

Благодаря гибкости кода микроконтроллер ATmega широко используется в модулях различной автоматики, в том числе на его основе возможно создать контроллер управления светодиодным освещением.

Принцип управления нагрузкой через Ардуино

Плата Ардуино имеет два типа портов вывода: цифровой и аналоговый (ШИМ-контроллер). У цифрового порта возможно два состояния – логический ноль и логическая единица. Если подключить к нему светодиод он либо будет светиться, либо не будет.

Аналоговый выход представляет собой ШИМ-контроллер, на который подаётся сигнал частотой около 500Гц с регулируемой скважностью. Что такое ШИМ-контроллер и принцип его работы можно найти в интернете. Через аналоговый порт возможно не только включать и выключать нагрузку, а и изменять напряжение (ток) на ней.

Синтаксис команд

Цифровой вывод:

pinMode(12, OUTPUT); — задаём порт 12 портом вывода данных;
digitalWrite(12, HIGH); — подаём на дискретный выход 12 логическую единицу, зажигая светодиод.

Аналоговый вывод:

analogOutPin = 3; – задаём порт 3 для вывода аналогового значения;
analogWrite(3, значение); – формируем на выходе сигнал с напряжением от 0 до 5В. Значение – скважность сигнала от 0 до 255. При значении 255 максимальное напряжение.

Способы управления светодиодами через Ардуино

Напрямую через порт можно подключить лишь слабый светодиод, да и то лучше через ограничительный резистор. Попытка подключить более мощную нагрузку выведет его из строя.

Для более мощных нагрузок, в том числе светодиодных лент, используют электронный ключ – транзистор.

Виды транзисторных ключей

  • Биполярный;
  • Полевой;
  • Составной (сборка Дарлингтона).
Способы подключения нагрузки
Через биполярный транзистор Через полевой транзистор Через коммутатор напряжения

При подаче высокого логического уровня (digitalWrite(12, HIGH);) через порт вывода на базу транзистора через цепочку коллектор-эмиттер потечет опорное напряжение на нагрузку. Таким образом можно включать и отключать светодиод.

Аналогичным образом работает и полевой транзистор, но поскольку у него вместо «базы» сток, который управляется не током, а напряжением, ограничительный резистор в этой схеме необязателен.

Биполярный вид не позволяет регулировать мощные нагрузки. Ток через него ограничен на уровне 0,1-0,3А.

Полевые транзисторы работают с более мощными нагрузками с током до 2А. Для ещё более мощной нагрузки используют полевые транзисторы Mosfet с током до 9А и напряжением до 60В.

Вместо полевых можно использовать сборку Дарлингтона из биполярных транзисторов на микросхемах ULN2003, ULN2803.

Микросхема ULN2003 и принципиальная схема электронного коммутатора напряжения:

Принцип работы транзистора для плавного управления светодиодной лентой

Транзистор работает как водопроводный кран, только для электронов. Чем выше напряжение, подаваемое на базу биполярного транзистора либо сток полевого, тем меньше сопротивление в цепочке эмиттер-коллектор, тем выше ток, проходящий через нагрузку.

Подключив транзистор к аналоговому порту Ардуино, присваиваем ему значение от 0 до 255, изменяем напряжение, подаваемое на коллектор либо сток от 0 до 5В. Через цепочку коллектор-эмиттер будет проходить от 0 до 100% опорного напряжения нагрузки.

Для управления светодиодной лентой arduino необходимо подобрать транзистор подходящей мощности. Рабочий ток для питания метра светодиодов 300-500мА, для этих целей подойдет силовой биполярный транзистор. Для большей длины потребуется полевой транзистор.

Схема подключения LED ленты к ардуино:

Управление RGB лентой с помощью Andurino

Кроме однокристальных светодиодов, Ардуино может работать и с цветными LED. Подключив выводы каждого цвета к аналоговым выходам Ардуино можно произвольно изменять яркость каждого кристалла, добиваясь необходимого цвета свечения.

Схема подключения к Arduino RGB светодиода:

Аналогично построено и управление RGB лентой Arduino:

Аrduino RGB контроллер лучше собирать на полевых транзисторах.

Для плавного управления яркостью можно использовать две кнопки. Одна будет увеличивать яркость свечения, другая уменьшать.

Скетч управления яркостью светодиодной ленты Arduino

int led = 120; устанавливаем средний уровень яркости

void setup() {
pinMode(4, OUTPUT); устанавливаем 4й аналоговый порт на вывод
pinMode(2, INPUT);

pinMode(4, INPUT); устанавливаем 2й и 4й цифровой порт на ввод для опроса кнопок
}
void loop(){

button1 = digitalRead(2);

button2 = digitalRead(4);
if (button1 == HIGH) нажатие на первую кнопку увеличит яркость
{
led = led + 5;

analogWrite(4, led);
}
if (button2 == HIGH) нажатие на вторую кнопку уменьшит яркость
{
led = led — 5;

analogWrite(4, led);
}

При удержании первой или второй кнопки плавно изменяется напряжение, подаваемое на управляющий контакт электронного ключа. Тогда и произойдет плавное изменение яркости.

Модули управления Ардуино

Для создания полноценного драйвера управления светодиодной лентой можно использовать модули-датчики.

ИК-управление

Модуль позволяет запрограммировать до 20 команд.

Радиус сигнала около 8м.

Цена комплекта 6 у.е.

По радиоканалу

Четырёхканальный блок с радиусом действия до 100м

Цена комплекта 8 у.е.

Позволяет включать освещение еще при приближении к квартире.

Бесконтактное

Датчик расстояния способен по движению руки увеличивать и уменьшать яркость освещения.

Радиус действия до 5м.

Цена модуля 0,3 у.е.

Как управлять Ардуино с компьютера через USB. Расскажем, как произвести включение светодиода и управлять сервомотором на Arduino с компьютерной клавиатуры через функцию Serial.available() и Serial.read() . Данные функции проверяют, поступают ли какие-то команды на микроконтроллер по последовательному порту, а затем считывают поступающие команды, вводимые в Serial monitor с компьютера.

Управление Ардуино через компьютер

Функция Serial.available() получает количество байт доступных для чтения из последовательного порта. Это те байты которые отправлены с компьютера и записаны в буфер последовательного порта. Буфер Serial monitor Arduino может хранить максимум до 64 байт. Функция используется также при подключении Bluetooth модуля к Ардуино и полезна при отладке устройства на проектирования.

При тестировании и настройке различных устройств, управляемых через Bluetooth, например, роботом или Лодкой на Ардуино вам пригодится знание, как управлять светодиодом и сервомотором через компьютер. Поэтому рассмотрим сейчас простое управление сервоприводом через компьютер по USB кабелю. При этом через монитор можно отправлять не только цифры, но и буквы латинского алфавита.

Как управлять Ардуино с клавиатуры

Для занятия нам понадобятся следующие детали:

  • плата Arduino Uno / Arduino Nano / Arduino Mega;
  • макетная плата;
  • 1 светодиод и резистор 220 Ом;
  • 1 сервопривод;
  • провода «папа-папа» и «папа-мама».

Остальные исполнительные устройства для Arduino UNO вы можете взять на свое усмотрение и самостоятельно попробовать управлять ими через компьютер с помощью USB кабеля. Соберите на макетной плате схему с одним светодиодом из первого занятия Что такое Ардуино и как им пользоваться, а после сборки схемы со светодиодом загрузите следующий скетч в микроконтроллер.

Скетч. Управление Ардуино с компьютера

int val; pinMode (13, OUTPUT ); // объявляем пин 13 как выход } void loop () { if (val == "1") {digitalWrite (13, HIGH );} // при 1 включаем светодиод if (val == "0") {digitalWrite (13, LOW );} // при 0 выключаем светодиод } }

Пояснения к коду:

  1. функция Serial.available() проверяет поступление команд с компьютера;
  2. функция Serial.read() читает данные, поступившие в Serial monitor.
  3. в условном операторе if (val == "1") стоит знак двойное равенство «соответствие», а в скобках необходимо использовать одинарные кавычки.

После сборки схемы загрузите следующий скетч в плату

Скетч. Управление сервоприводом с компьютера

#include // подключаем библиотеку для сервопривода Servo servo; // объявляем переменную servo типа "servo" int val; // освобождаем память в контроллере для переменой void setup () { Serial .begin (9600); // подключаем последовательный порт servo.attach (11); // привязываем сервопривод к выходу 11 } void loop () { // проверяем, поступают ли какие-то команды if (Serial .available ()) { val = Serial .read (); // переменная val равна полученной команде if (val == "1") { servo.write (10); } // при 1 поворачиваем серво на 10 if (val == "2") { servo.write (45); } // при 2 поворачиваем серво на 45 if (val == "3") { servo.write (90); } // при 3 поворачиваем серво на 90 } }

Пояснения к коду:

  1. в некоторых примерах программ можно встретить такой вариант проверки появления данных в Serial monitor if (Serial.available()>0) .
  2. в качестве команд можно использовать не только цифры, но и буквы. При этом имеет значение какая буква — прописная или строчная.

В статье рассмотрено как передавать команды Arduino для удаленного управления периферийными устройствами.

Рассмотрен простейший пример: управление двигателем постоянного тока. Уверен, многим этот пример будет интересен, так это основа автоматизации вашего умного дома. Использовать приведенный ниже материал можно для управления жалюзи или ролетами, в которых тоже используются двигатели постоянного тока, но большей мощности. Для реализации проекта вам понадобятся Arduino и некоторые навыки работы с Node.js и JavaScript.

Оборудование и софт, которые вам понадобятся

Кроме Arduino Uno и монтажной платы, вам понадобятся:

  • двигатель постоянного тока, с номинальным напряжением около 5 Вольт, чтобы запитать его непосредственно от Arduino. Могут подойти даже двигатели от игрушек: детских машинок и т.п.
  • в этом проекте мы будем вращать вал двигателя в двух направлениях. Если мы используем транзистор, вращение будет только в одну сторону. Для реализации вращения в двух направлениях, задействуем драйвер двигателя .

Полный список необходимых компонентов для проекта:

  • плата Arduino Uno R3;
  • драйвер двигателя L293D;
  • двигатель постоянного тока 5 В;
  • монтажная плата и коннекторы.

Кроме того, вам понадобится 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;

Serial.begin(9600);

// Объявляем переменную для хранения значений скорости

int motor_speed;

setMotor(true, motor_speed);

// функция для управления двигателем

void setMotor(boolean forward, int 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

setMotor(true, motor_speed);

Загрузите приведенный скетч на Arduino и мотор должен начать разгоняться до максимального значения. После этого скорость упадет до нуля и разгон начнется заново. Если все отработало как указано выше, можно переходить к следующей части нашего проекта.

Собираем все вместе

На данном этапе мы уже реализовали управление двигателем постоянного тока через Arduino. Теперь давайте соберем все вместе и разработаем веб-интерфейс для нашего проекта.

Во-первых, нам надо изменить скетч Arduino, чтобы он мог он мог получать данные с хоста. После этого мы используем Node.js, чтобы обеспечить красивый интерфейс пользовательский интерфейс. Если вы никогда не занимались веб-приложениями, не волнуйтесь, в гайде детально рассмотрен каждый шаг.

Давайте начнем со скетча Arduino. Это скетч, который мы используем в этой части:

// библиотеки

#include

// создаем 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");

// Handle REST calls

rest.handle(Serial);

При изучении скетча вы увидите, что он отличается от предыдущего. В нем тот же блок для инициализации контактов двигателя, но есть еще aREST для получения команд. Например, чтобы установить заданную скорость мотора, мы реализуем запрос с компьютера вида:

Похожие запросы мы будем делать с нашего ПУ для управления другими пинами. Например, пинами, которые отвечают за направление.

Последний блок состоит в разработке веб-интерфейса для удаленного управления скоростью мотора. Для этого мы будем использовать 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

button.btn.btn-block.btn-lg.btn-primary#1 Forward

button.btn.btn-block.btn-lg.btn-danger#2 Reverse

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

После этого запустите приложение с помощью:

После этого вы можете перейти в ваш браузер и набрать в строке адреса следующее:

http://localhost:3000

В результате отобразится следующий интерфейс:

Дальше можно тестить и играться. Например, устанавливая направление вращения или используя слайдер для изменения скорости вращения. Мотор должен реагировать на ваши нажатия. Можно использовать ваш смартфон или планшет. Для этого достаточно использовать IP вашего компьютера и благополучно менять скорость двигателя с вашего мобильного устройства.

Дальнейшие направления развития проекта

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

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

  • Tutorial
  • Recovery Mode

Эта статья предназначена для новичков. Здесь будет описано как из web приложения при помощи ajax запросов посылать команды phyton скрипту, который будет передавать их через serial port непосредственно на наш arduino.
Вы приобрели себе Arduino, попробовали несколько примеров, поигрались со скетчами. Но вам этого мало, вы хотите управлять, управлять всем этим добром через интернет. Самый простой способ - это приобрести шилдик с Ethernet-портом и подключить его к Arduino (или приобрести платку с уже встроенным Ethernet). Но она и стоит дороже и в управлении надо поднатаскаться.

Для работы нам понадобятся:
- HTTP сервер
- интерпретатор python
- Arduino

Тут я опишу где взять первое и второе, и как их подружить

Теперь по порядку. Как HTTP сервер я использую Apache. Установить его не составит труда. Если вы совсем новичок и используете windows, то можете взять пакет Denwer с официального сайта, в его составе есть Apache.
Python (я использовал версию 3.3) можете взять так же с официального сайта и установить. Теперь нам надо подружить наш Apache и python. Самый простой способ - это запускать python как cgi. Для этого открываем файл httpd.conf в папке conf в том месте где вы поставили свой apache (если вы поставили denwer то путь будет примерно следующим: [буква виртуального диска]:\usr\local\bin\apache)

Ищем строчку

AddHandler cgi-script .cgi

Добавляем в конце через пробел.py и смотрим, чтоб в начале строки не было знака #. Сохраняем, перезапускам сервер.
Теперь для проверки тесной дружбы pythone и apache можно создать тестовый файлик и положить его в домашнюю папку.
#!/Python33/python.exe print ("STATUS: 200 OK\n\n") print ("hello world")
Обратите внимание что первой строкой мы показываем где у нас лежит интерпретатор языка. У меня, например, он лежит по адресу C:/Python33/python.exe. Думаю, разберетесь. Назовите его как хотите и зайдите на него через браузер, например, так: localhost/my_first_test_phyton_file.py. Если увидите «hello world», то все хорошо.

Код основного управляющего скрипта на JavaScript предельно прост:
//Порт к которому подключен Arduino var serialPort = "COM5"; //непосредственно управляющая функция var Arduino = function(command, callback){ $.get("c.py",{ c:command, p:serialPort }, callback); }

Единственное что тут надо менять, как вы догадались, это порт, на котором у вас подключен arduino. Его всегда можно посмотреть в windows используя Диспетчер устройств. Мы его будем передавать в наш python скрипт чтоб тот знал на какой serial port отправлять полученные данные.
Теперь, если мы сделаем вызов нашей функции, например: Arduino(123), то скрипт создаст ajax запрос вида с.py?c=123&p=COM5 и пошлет его на наш python скрипт c.py. Рассмотрим, что он из себя представляет:
#!/Python33/python.exe import serial import cgi print ("STATUS: 200 OK\n") req = cgi.FieldStorage(); ser = serial.Serial(req["p"].value, 9600, timeout=1) ser.write(bytes(req["c"].value,"latin")) ser.close() print ("ok")
Фактически он просто принимает значение параметра «с», передает его в serial port «p» и пишет «ok». Дешево и сердито.

Для тех, кто хочет не только отдавать, но и принимать, напишем больше кода

Немного усовершенствуем нашу клиентскую часть.
//непосредственно управляющая функция var Arduino = function(sp, errorCallback) { this.serialPort = sp; this.errorCallback = errorCallback || function(){ console.log("Error"); } this.send = function(data, callback){ var callback = callback; var self = this; data["p"] = this.serialPort; data["s"] = Math.round(Math.random()*1000); //на всякий случай, чтобы браузер не кешировал $.ajax({ url:"c.py", data:data, success:function(data){ if($.trim(data) == "error"){ self.errorCallback(); } else { if(typeof callback == "function") callback(data); } } }); } //передаем this.set = function(command, callback){ this.send({ c:command, r:0 }, callback); } //передаем и ожидаем ответ this.get = function(command, callback){ this.send({ c:command, r:1 //флаг отвечающий за режим "ожидаем ответа" }, callback); } }
Теперь, поскольку мы превратили Arduino в класс, то простейший вызов будет примерно таким:
var myArduino = new Arduino("COM5"); myArduino.set(113); //зажигаем светодиод на пине 13 myArduino.get(36,function(data){console.log(data)}); //смотрим состояние пина 6. и выводим его в консоль
Ну и, конечно, надо немного изменить серверную часть:
#!/Python33/python.exe import serial import cgi print ("STATUS: 200 OK\n") req = cgi.FieldStorage(); try: ser = serial.Serial(req["p"].value, 9600, timeout=1) except: print("error") exit() ser.write(bytes(req["c"].value,"latin")) if int(req["r"].value) == 1: res = ""; while not res: res = ser.readline() print(res.decode("UTF-8")) else: print ("ok") ser.close()
Тут почти ничего не поменялось, кроме того, что когда сервер в запросе получает параметр r=1 то он ожидает от Arduino ответ.
И мы добавили проверку на то, смог ли наш скрипт открыть serial port. Если нет, то вернет ключевое слово «error»


Теперь давайте рассмотрим скетч для arduino, который все это принимает и обрабатывает:
#include Servo myservo; void setup() { Serial.begin(9600); } String getParam(){ String re; while (Serial.available()) { re.concat(Serial.read()-48); } return re; } int getPin(String p){ return p.substring(0,2).toInt(); } int getVal(String p){ return p.substring(2,6).toInt(); } // Главный цикл void loop() { while (Serial.available()) { char command = (char)Serial.read(); String param = getParam(); int pin = getPin(param); int p; switch (command) { case "0": //Digital write pinMode(pin,OUTPUT); digitalWrite(pin, LOW); break; case "1": //Digital write pinMode(pin,OUTPUT); digitalWrite(pin, HIGH); break; case "2": //Servo myservo.attach(pin); p = getVal(param); myservo.write(p); break; case "3": //Digital read pinMode(pin,INPUT); Serial.print(digitalRead(pin)); break; case "4": { //Analog read int aPin = A0; switch (pin) { case 1: aPin = A1; break; case 2: aPin = A2; break; case 3: aPin = A3; break; case 4: aPin = A4; break; case 5: aPin = A5; break; } Serial.print(analogRead(aPin)); } break; case "5": //Analog write pinMode(pin,OUTPUT); p = getVal(param); analogWrite(pin, p); break; } } }
По serial port мы будем передавать команды вида: 1234567 где:
- номер команды
- номер пина
- данные для пина, если надо.
Например:
113 - установит пин 13 на вывод и передаст по нему состояние HIGH (то-есть включит).
013 - установит пин 13 на вывод и передаст по нему состояние LOW (то-есть выключит).
209100 - установит пин 9 как управляющий сервоприводом и передаст ему значение 100 через ШИМ модуляцию.
310 - установит пин 10 на ввод и считает с него данные HIGH / LOW и вернет как 1 или 0 соответственно.
Вы запросто можете дописывать и свои команды в switch case блок.
Теперь добавим немного красоты в нашу frontend часть и получим, например, такое

Далее я добавил немного магии юзер-интерфейса. Но его я не буду описывать, все интересующиеся могут взять его из архива с проектом .
Для web-части использовал Bootstrap (исключительно из-за удобства и его «резиновости») и jQuery (для ajax).
Теперь посмотрим как это работает.
Сначала надо указать на каком порту у вас устройство и сколько пинов имеет. Потом выбрать на каком пине у вас что находится, и вперед к управлению.

Из недостатков такого подхода можно отметить относительно медленную скорость обмена данных. Чтоб узнать состояние, например, кнопки надо посылать запросы, но слишком часто это делать нельзя, так как можем упереться в занятый serial port. На веб-сокетах работало бы быстрее, но это уже чуть более продвинутая тема, которую я, если захотите, освещу позже.
Проверялось все под Windows 8 х64. Наверно, есть какие-то особенности реализации всего этого под другие системы, буду рад услышать об этом в комментариях.
Теперь о том, где все это может пригодится: например можно сделать демонстрационный стенд; управлять положением камеры; подключить датчик температуры и прочие приборы и удаленно наблюдать за каким нибудь процессом и т.д.

Архив с проектом
Для запуска на iPad в полный экран я использовал бесплатную программу oneUrl

В тематические хабы не вставил только лишь из за отсутствия кармы.
Это первая моя статья. Буду рад ответить на вопросы.

UPD: По просьбам трудящихся я потестил так же этот метод на MacOS. Особых проблем не возникло. На маке обычно уже стоит по умолчинию python, единственное что надо сделать, это подружить его с apache. Первая строка в c.py будет
#!/usr/bin/python
Так же, возможно у вас не будет установленно расширение для питона pyserial, оно устанавливается простой командой в консоли:
easy_install -U pyserial
Далее следует обратить внимание, что обычно предустановленная версия python достаточно старая и может не работать строка
ser.write(bytes(req["c"].value,"latin"))
Я её заменил на
ser.write(bytes(req["c"].value.decode("latin")))
Все заработало.
Не забудьте посмотреть на каком порту у вас подключится девайс. Это удобно смотреть например через саму программу Arduino. Меню Сервис->Последовательный порт. У меня например он имел такой вот вид: /dev/cu.usbmodemfd141
Желаю всем удачных опытов.

Теги:

  • arduino
  • python
  • diy или сделай сам
  • умный дом
Добавить метки