Arduino-управление на постояннотоков електромотор с H-Bridge драйвер

    Тази статия е естествено продължение на моите експерименти с микропроцесорната платка Arduino. Управлението на постояннотоков електромотор е често срещано и се използва в най-различни устройства в бита като вентилатори, абсорбатори или дори играчки, включително радиоуправляеми или роботизирани. Постояннотоковият мотор позволява въртене по часовниковата стрелка или обратно, намаляване или увеличаване на оборотите. Тези функции се осъществяват с различни схеми на управление, като най-популярен е така наречения "Н"-мост (H-Bridge). От моята статия "Електронно управление на сервомотор за стабилизатор" може да почерпите повече информация за принципа, по който е изграден и работи Н-моста. Наред с транзисторните мостове, съм дал примери с два такива реализирани с интегрални схеми L6203 и TC4420. Разбира се, в практиката са известни и се използват още доста други подобни ИС както единични в корпус, така и двойни или четворни – L9110, MC33152-34152, L293B, L298, SN754410, а напоследък все по-голяма популярност намират готовите модули за сервоуправление, често наричани драйвери за сервомотор като DRV8833-8835-8838, MAX14870 или цели завършени модулни платки, наричани шийлд. Но аз ще разгледам само тези, с които съм се сблъскал и се намират лесно на българския пазар.


    Драйвер L9110:

    В комплекта "Arduino UNO R3 Kit", който бях закупил, имаше MOSFET драйвер с интегрална схема L9110 за управление на постояннотоков електродвигател. Макар че тя е доста "слабичка", все пак е достатъчна за тестове с малък електромотор, стига да се спазят техническите изисквания, като най-вече захранващо напрежение до 12V и консумиран от мотора ток до 800mA. Естествено, тези параметри не ме задоволяваха и потърсих друга интегрална схема с по-добри технически показатели, но най-вече напрежение и ток, каквато е MC33152-D, позволяваща контролиране на мотор с ток до 1,5А и напрежение 6,5V-18V. Интегрална схема MC33152, драйвер за един електромотор, може да се закупи у нас.

    Двете интегрални схеми са еднотипни, съдържащи два MOSFET драйвера, образуващи H-Bridge, с два отделни входа за управление и два изхода, към които може да се включи електромотор. Към архива съм приложил файлове с подробни технически параметри, а тук по-долу схема на корпусите и означение на изводите им:

    Този експеримент не беше самоцелен. Управлението на електромотор е в основата на създаването на роботизирани механизми и шасита. Именно от тази гледна точка той беше интересен за мен. От друга страна, както и преди съм споменавал, всеки мой експеримент е опит върху определена методика, която на по-късен етап мога да използвам в следващ проект.

    Ето опростена принципна схема на включване на модулите, като реализацията е изцяло върху бредборд:


Архив [gif,spl7][33kb]

    Принципната схема може да се покаже още по-ефектно по следния начин:

   С потенциометъра Р1 ще променям входното напрежение на аналоговия вход А0 на платката Arduino, ще детектирам чрез програмния код определени напрежения, при които моторът ще бъде в състоянията STOP, LEFT, RIGHT, тоест изключен и не се върти, върти се в една посока, върти се в обратната посока. Тези команди могат да бъдат наименовани в скеча като FORWARD - REVERSE или CW - CCW (напред-назад, по часовника и обратно на часовника). Или както на вас ви хрумне и ви е по-удобно. Аз използвам означенията LEFT (L), RIGHT (R). Желателно е в паралел на батерията на захранването да се включи филтров кондензатор 100nF. Както е известно постояннотоковите мотори се задвижват чрез четки и колектор, което предизвиква доста искрови смущения. За да избягна тези смущения и направя работата на Arduino платката стабилна паралелно на изводите на мотора също съм поставил филтрови кондензатори по 47nF, запоени за корпуса на мотора, който е добре да бъде заземен, както е показано на схемата. В моя експеримент на бредборда не съм поставял филтрови кондензатори, но това зависи изключително от качеството на мотора.

    И така какви функции трябва да решавам с програмния код?

   А) изключено състояние (STOP). За целта определям два прага на напрежението на вход А0, например през около 100mV (5000mV/1024*100=50). Долния праг наименувам treshold1, а горния праг treshold2. За всеки праг задавам стойност на АЦП, която има следния вид:

    treshold1 = 400,
    treshold2 = 450

    Следователно за да имаме функцията STOP трябва в прозореца "400-450" програмния код да извади на двата цифрови изхода pin2 и pin3 състояния LOW.

    Б) състояние въртене наляво (LEFT). Очевидно следвайки горната логика, извън избрания прозорец и над горния праг pin2 трябва да придобие състояние LOW, а pin3 HIGH.

    В) състояние въртене обратно (RIGHT). Това движение е обратно на предишното и следователно програмния код трябва да обърне състоянията на pin2 и pin3

    След като накратко описах основните функции на скеча, бих искал да отбележа, че и без т. А (STOP) могат да се постигнат същите състояния и посоки на въртене. Но, повярвайте ми, най-добре е да не разчитаме на НЕдефинирано състояние. Именно това е причината, да въведа в програмния код няколко реда, с които изрично да определя командата STOP. В противен случай е възможно в следствие на случайни флуктуации (или искрене на мотора) в така нареченото състояние в прозореца "400-450" да се получат неопределени случайни включвания на мотора.

    Дефинирането на прозореца правя с една сложничка логическа функция в която трябва да се изпълняват няколко условия и да се задават едновременно две команди.

    Ето какво имам предвид:

    "if (analogValue>threshold1 && analogValue<threshold2)
    (digitalWrite(LEFT, LOW), (RIGHT, LOW));
    еlse .....................",

    след което се изпълняват всички други команди от цикъла на програмния код.

    Тези команди се усещат с въртене на оста на потенциометъра, като в определена част моторът спира, над нея се върти в едната посока, а под нея в другата и при връщане на оста в обратна посока се моторът преминава през същите състояния или ако оставим оста на потенциометъра в позиция STOP въртенето дефинитивно спира. В зависимост от приложението на този код в различни проекти и устройства, стойностите на threshold1 и threshold2 могат да бъдат различни от тези които съм дал аз. Естествено и изпълнителния механизъм или електромотор. На следващите снимки съм показал импровизирания монтаж с който изпълних този експеримент:

    Обръщам внимание на искрогасящите кондензатори на мотора на снимката в ляво, а вдясно с качествен мотор, но без филтрови кондензатори:

    Програмния код на описания експеримент е "sketch_Servo_Statement.ino".


    Драйвер MC33152-D:

    Тази интегрална схема е лесно достъпна на нашия пазар, за разлика от описания драйвер с ИС L9110, китайско производство. По принцип на работа двете интегрални схеми са напълно идентични, като разлика има в полза на МС33152 – по-високото напрежение за захранване на електродвигателя и по-голямата издръжливост на товар с ток до 1,5А. Тези дребни наглед разлики позволяват да се разшири гамата на използваните електромотори, които отговарят по технически параметри на посочените стойности.

    На следващата фигура ви показвам графичното изпълнение на принципната схема на свързване, която няма да показвам, като моля да обърнете внимание на различното разположение на изводите на двата моста L9110 и MC33152-D, показани на фигурата в началото на статията.

    С втория експеримент, в който съм избрал драйвер MC33152 съм експериментирал коренно различен програмен скеч, който позволява изпълнението на следните команди – STOP-START, FORWARD-REVERSE, а също ускоряване-намаляване на скоростта на въртене на електромотора. Съвкупността от тези команди позволява схемата да се използва за управление на различни устройства в дома, но и за роботизирани електронни играчки. Командите се подават чрез натискане на четири бутона:

    Btn1 – STOP - START (стоп, старт)
    Btn2 – FORWARD - REVERSE (напред, назад)
    Btn3 – ACCELERATE (ускоряване)
    Btn4 – DE-ACCELERATE (намаляване)

    Командите се осъществяват само чрез цифровите пинове на платката Arduino, за разлика от предходния експеримент, в който участваше аналогов вход А0.

    Ако проследите програмния код, ще забележите, че една и съща команда се повтаря през интервал определен чрез delay(). Целта е да се избегне трепкането на контактите или лош контакт на бутоните. По принцип същия ефект може да се постигне ако към съответния бутон се добави прекъсване.

    if(digitalRead(btn1pin)==LOW) //детектира състояние "0" на бутона
    delay(10); //delay 10ms за елиминиране на трепкане на бутона
    if(digitalRead(btn1pin)==LOW) //потвърждава натискане на бутона

    Друга особеност, която го отличава от предишния експеримент е използването на цифрови пинове за подаване на команди, както определяне на едно променливо състояние state = 0, което в програмния код променя състоянието си като 0, 1 или 2 с което се променят съответните команди за движение на електромотора.

    На горните снимки експеримента съм осъществил с електромотор с редуктор от китайски стабилизатор на променливо напрежение, а на видеото по-долу с редуктор от селсин с електромотор на 12 волта. Програмният код за този експеримент е "sketch_motor_PROBA_Raboti.ino".

    Със следващото видео демонстрирам управлението на електромотор и командите, които той изпълнява от микропроцесорната развойна платка Arduino UNO R3:


 

    След като завърших тези експерименти, реших, че ако скеча се използва за телеуправление на модели, е по-целесъобразно командите FORWARD-REVERSE (НАПРЕД-НАЗАД) да не се изпълняват САМО с бутон_2, при което, без междинно състояние СТОП, се получава рязко обръщане на посоките. След кратко обмисляне на проекта, въведох промени в с програмния скеч, така че:

    Btn_1 – включва и спира движение на мотора само НАПРЕД (STOP-START-FORWARD)
    Btn_2 – включва и спира движение на мотора само НАЗАД (STOP-START-REVERSE)

    Всеки един от двата бутона изпълнявайки командата СТОП (STOP) спира както своето движение, така и движението, запуснато от другия бутон, тоест – тази команда се съвместява от двата бутона.

    Тези промени са много по-полезни и мобилни при използване на скеча за дистанционно управление на движещи се модели. Осигурените команди са както следва:

    START FORWARD
    STOP FORWARD
    START REVERSE
    STOP REVERSE

    В командите за промяна на скоростта (оборотите) на мотора не съм правил, тъй като те са достатъчни. Така последната редакция на този програмен код може да намерите в скеча: "motor_Rev_2_raboti.ino". Командите за ускоряване и намаляване на скоростта на мотора остават същите.

    Със следващото видео демонстрирам практическата реализация и командите, които чрез Arduino платформата управляват постояннотоков електромотор. Като такъв съм използвал редуктори от различни фабрични устройства на които съм монтирал електромотори със захранващо напрежение 12V.

Литература:

1. DC Motor Control using Arduino
2. DC motor speed and direction control using Arduino
3. L293D H Bridge DC motor controller with Arduino
4. Николай Николов, Валери Терзиев, "Пропорционално телеуправление – изпълнителни механизми" / сп. "Радио, телевизия и електроника", 1988 / кн. 4
5. Справочни данни L9110, MC33152

Валери Терзиев
7 юли 2016 година