четверг, 6 августа 2015 г.

Простое управление приборами с компьютера.

Имея плату Arduino (можно заказать по этой ссылке), компьютер, некоторые детали, инструменты любой желающий сможет организовать простое управление бытовыми приборами с этого компьютера. Множество приборов используемых в быту имеют множество функций, например большинство современных телевизоров могут показывать некоторое количество разных каналов, у вентилятора м.б. некоторое количество разных режимов работы и т.д. Для того чтобы сделать такое сложное управление как например переключение каналов или режимов работы, помимо перечисленного выше понадобятся дополнительные знания, детали и инструменты но сделать простое включение и выключение под силу каждому кто это перечисленное имеет. Arduino связывается с компьютером через USB порт, передачу информации с компьютера на Arduino можно осуществлять через среду разработки для Arduino (называется Arduino IDE) которую можно скачать с страницы на официальном сайте Arduino. Существует множество разнообразных модулей для взаимодействия Arduino с внешним миром, например специальный модуль с блоком реле для коммутации нагрузок, при использовании таких модулей работа сильно упрощается, здесь же мы рассмотрим самостоятельное изготовление модуля с одним реле для включение/выключения бытовых приборов, при необходимости можно изготовить более одного такого модуля и использовать их с одним Arduino тем самым сделав возможным простое управление множеством бытовых приборов. Arduino (любое) имеет некоторое количество выводов общего назначения которые обозначаются, на плате, просто цифрами или цифрами с волнистым знаком "~". Подключив Arduino к компьютеру и записав в него (в Ардуино) специальный скетч (программа для Arduino) можно с этого компьютера через программу "Arduino IDE" управлять этими выводами делая на них высокое напряжение (примерно +5В (HIGH)) или низкое (примерно 0В (LOW)). Также на Arduino есть вывод "GND" (на плате так и обозначен). Если на одном из выводов общего назначения высокое напряжение то подключив что либо проводящее ток между этим выводом и выводом "GND" через то что подключено потечёт электрический ток и величина этого тока будет зависеть от сопротивления этого предмета и рассчитать её можно по закону Ома, т.е. чем меньше сопротивление том больше ток, но если сопротивление будет слишком низким то через Arduino потечёт слишком большой ток и оно перегорит. Максимальный ток который может выдать вывод общего назначения Arduino может быть разным в зависимости от используемого в нём микроконтроллера но обычно это 40мА = 0.04А - этого может быть недостаточно для того чтобы включить реле которое будет включать прибор (приборы) поэтому для усиления тока необходимо использовать дополнительный элемент например биполярный транзистор. Биполярный транзистор имеет три вывода: эмиттер, коллектор, база. Максимальный ток транзистора также ограничен как и у Ардуино и обычно он больше, например у популярного КТ315 максимальный ток равен 100мА = 0.1А. Биполярные транзисторы бывают двух типов n-p-n и p-n-p использовать можно оба типа но по разному и далее рассмотрим использование транзистора КТ315 тип которого n-p-n. Для того чтобы транзистор усилил ток из Ардуино необходимо соединить его базу с выводом Ардуино ЧЕРЕЗ РЕЗИСТОР сопротивлением 1кОм (на резисторе м.б. написано 1к), эмиттер этого транзистора соединить с "GND" Arduino и минусом питания или "GND" источника питания напряжение которого равно напряжению обмотки имеющегося реле (допустим 12В) один из выводов обмотки реле соединить с коллектором транзистора другой с плюсом источника питания (+12В допустим) и ещё одной не влияющей на усиление но ОЧЕНЬ важной деталью является диод который нужно соединить анодом с коллектором и катодом с плюсом источника питания (+12В). Если диод импортный то на скорее всего на его корпусе будет светлая полоса - она указывает на катод, другой вывод диода это анод. Оставшиеся выводы реле - это выводы его контактов, если их два и они не замкнуты то при подаче достаточного тока на обмотку реле эти контакты замкнуться, их нужно соединить последовательно с прибором и это последовательное соединение можно втыкать в розетку, тогда при замыкании контактов на прибор поступит 220В и он включиться. Описанное выше можно изобразить на картинке:
Рисунок 1 - Управление прибором с компьютера

Это нестандартная схема для лучшего понимания, обычно используют схемы такие:
Рисунок 2 - Управление прибором с компьютера 

Хотя в этой схеме тоже присутствует нестандартное обозначение платы Ардуино. На рисунке обозначено Arduino UNO (можно заказать по этой ссылке) но можно использовать и любое другое. Соединения можно делать например на макетной плате и проводами или пайкой. После того как всё правильно соединено и проверено можно подключить Ардуино по USB к компьютеру и загрузить в неё скетч:

char pc_code=0;

void setup()
{
pinMode(2, OUTPUT);
Serial.begin(9600);
}

void loop()
{
  if (Serial.available() > 0)
  {
    pc_code = Serial.read();
    if(pc_code=='a')
    {
      digitalWrite(2, HIGH);
    }
    else if(pc_code=='b')
    {
      digitalWrite(2, LOW);
    }
  }
}

О том как правильно настроить Ардуино и загрузить в неё скетч уже описано на странице "Простое управление шаговым двигателем с компьютера через ардуино". Далее для включения прибора необходимо на Ардуино отослать символ "a" для выключения символ "b". Для того чтобы отослать символ на ардуино можно, в среде Arduino IDE, войти по вкладке Инструменты-Монитор последовательного порта и в появившемся окне в верхнем текстовом поле вписывать символы и отсылать нажатием кнопки "отправить" символ придёт на ардуино и для данного случая если отослать символ "a" то прибор включиться, если "b" то соответственно выключиться. Если Ардуино не принимает символы то нужно в правом нижнем углу окна монитора последовательного порта установить такую же скорость какая прописана в скетче т.е. 9600 бод. Для того чтобы включать 2 прибора можно немного изменить скетч:

char pc_code=0;

void setup()
{
pinMode(2, OUTPUT);
pinMode(3, OUTPUT);
Serial.begin(9600);
}

void loop()
{
  if (Serial.available() > 0)
  {
    pc_code = Serial.read();
    if(pc_code=='a')
    {
      digitalWrite(2, HIGH);
    }
    else if(pc_code=='b')
    {
      digitalWrite(2, LOW);
    }
    else if(pc_code=='c')
    {
      digitalWrite(3, HIGH);
    }
    else if(pc_code=='d')
    {
      digitalWrite(3, LOW);
    }
  }
}

Второй модуль с реле надо аналогично подключать к выводу 3 Ардуино а для его включения посылать "c" для выключения "d". Аналогично можно изменить скетч для управления большим количеством реле также можно через одно реле подключать параллельно несколько приборов но ток потребляемый всеми приборами не должен превышать максимальный ток контактов реле. Процесс сборки, демонстрацию работы и некоторые дополнительные рекомендации можно увидеть на видео:
Часть 2

Часть 3

Доработанная программа для управления приборами  UniversalRelay 2.
Часть 4 (создание программы)

Последняя часть

КАРТА БЛОГА (содержание)

понедельник, 3 августа 2015 г.

Контроллер шагового двигателя.

Контроллер для непосредственного управления шаговым двигателем является наиболее удобным устройством для использования с такими двигателями в случаях когда не требуется сложное программное управление. Если стоит задача изготовить такой контроллер то перед разработчиком возникает ряд трудностей, например изготовление интерфейса для удобного использования данного контроллера, решить эту задачу можно разными способами. Один из способов это использование аналогового устройства ввода (потенциометра, энкодера и т.д.) для регулировки скорости и кнопок для запуска, реверса и остановки. Такой способ хорош в случаях когда в данном контроллере планируется использовать микроконтроллер со встроенным АЦП, имеется возможность подключения недорогого энкодера или др. Также можно использовать семисегментный индикатор для отображения скорости и кнопки для всего управления контроллером. Ещё одной проблемой является организация управления самим двигателем. При всей кажущейся простоте данной задачи всё же могут возникнуть проблемы с недостаточной производительностью или памятью микроконтроллера, например в случае если необходим микрошаговый режим управления двигателем и большие обороты то не каждый микроконтроллер сможет с этим справиться, но полушаговый режим с отображением на семисегментный индикатор - задача посильная даже для микроконтроллера например PIC16F84. Рассмотрим схему:

Рисунок 1 - Контроллер шагового двигателя

Если например необходимо 4 вывода общего назначения задействовать как входы (4 для кнопок и 2 для датчиков крайнего положения) и с учётом того что для управления двигателем нужно 4 провода то на вывод на индикатор останется только два вывода микроконтроллера. Решить проблему можно например использованием дополнительной микросхемы двоичного счётчика например 4024, в таком случае один вывод микроконтроллера можно соединить с выводом RESET счётчика а другой вывод микроконтроллера соединить с выводом CLOCK счётчика тогда подав импульс сначала на RESET потом пачку импульсов количество которых равно коду для высвечивания на индикаторе нужной цифры можно высветить на индикаторе нужную цифру. У счётчика имеется 7 выводов для отображения цифры а у индикатора семь выводов для отображения цифры и один для отображения точки. Для отображения точки можно оставшийся вывод микроконтроллера соединить с выводом для отображения точки на индикаторе а выходные выводы счётчика соединить входными выводами индикатора так как будет удобнее для разводки платы по тому что составить коды для цифр по схеме будет проще чем мучиться со сложной разводкой. В ходе проверки было выяснено что выход RA4/TOCKI микроконтроллера PIC16F84 является выходом с открытым стоком т.е. он может только просаживать на землю но не подтягивать к питанию поэтому для решения этой проблемы был установлен резистор R24. Все проблемы на этапе разработки решить всё же не удалось т.к. семисегментный индикатор светит достаточно тускло но в общем и целом контроллер работоспособен.


Демонстрация работы на видео:

Программа для микроконтроллера писалась в среде MikroC, скачать проект можно по ссылке: https://yadi.sk/d/XPxB278qiF4uz.

КАРТА БЛОГА (содержание)