Підключаємо двигун постійного струму. Мікросхема L298P

Серия-статей: Програмування Ардуіно з нуля #7

Серія-статей: Ардуїно, використання двигунів постійного струму #1

Розглянемо варіант підключення до контролера звичайного двигуна постійного струму, який можна використовувати, наприклад, для пересування робота або виконання корисної роботи.

В принципі звичайні електричні двигуни спокійно використовуються і без контролерів - достатньо підключити обмоку до мережі постійного струму, і двигун працюватиме. Тобто. можна включити в ланцюг живлення двигуна звичайне реле та керувати ним з контролера. Але нас такий варіант не влаштовує, адже ми хочемо не просто вмикати/виклякувати двигун, а регулювати швидкість та напрямок обертання.

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

Одним із найпоширеніших варіантів драйвера двигуна є L293 або L298 (відрізняються наявністю або відсутністю вбудованих захисних діодів). Для наших цілей цілком достатньо L298, тим більше, що ми використовуватимемо не голу мікросхему, а вже розпаяну на плату з усіма потрібними компонентами. Випускається безліч варіантів такої плати, найзручнішим можна вважати виконання у вигляді «мотор-шилда» для плати Arduino UNO:

Мотор шилд на базі L298P сумісний з Arduino UNO

Підключення такого шилду взагалі не вимагає паяння, достатньо помістити його зверху нашого контролера.

Для керування одним двигуном необхідно не менше двох уіфрових виходів (один для завдання напрямку, другий - швидкості) Причому відповідальний за швидкість повинен підтримувати ШІМ (позначені на контролері як PWM ~) 6, 7 (залежно від моделі мотор-шилда номери використовуваних ним вихідв можуть відрізнятися)

Тепер займемося організацією харчування. Motor-shield здатний отримувати харчування від контролера чи харчуватися незалежно. Для перемикання служить спеціальний джампер на шилді. Якщо він замкнутий, то ланцюги живлення контролера та motor-shielda замкнуті. Тобто. ми можемо підводити живлення або до виходів «Vin», і «Gnd», контролера, або до клемника живлення на шилді. Такий варіант можна використовувати за таких умов:

Напруга живлення motor-shielda знаходиться в рекомендованих для живлення контролера межах 7-12 В

Потужність двигунів, що підключаються, відповідає потужності живлення. Якщо струм живлення виявиться недостатнім, то відбудеться просадка напруги в ланцюзі живлення. А оскільки вона спільна з контролером, це може призвести до некоректної його роботи і навіть перезавантаження.

Якщо ж зняти джампер, то ланцюги живлення контролера та шилду будуть незалежними. Тобто до клемника живлення motor-shielda потрібно буде підключити живлення для двигунів. А контролер запитати від іншого джерела (або напругою 7-12 В через «Vin», або 5 В через висновок «»У такому випадку ми можемо використовувати потужніші двигуни ( аж до 18В – максимальна напруга для Motor shielda, більш потужні допускають навіть 36 В. При цьому ми не боятимемося за контролер, робота якого не буде залежати від силової частини приводу, але за це доведеться розплачуватися деяким ускладненням ланцюгів живлення. ж у мобільного робота не завжди є сенс робити два незалежні ланцюги живлення, набагато простіше запитати все від одного акумулятора)

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

У двигуна постійного струму всього два виходи, підключаємо їх до клемника на motor-shield-е (дві верхні або дві нижні клеми, центральна з'єднана з землею)

Підключення двигуна постійного струму до Arduino через драйвер L298P

Тепер приступимо безпосередньо до керування двигуном. Для пуску двигуна достатньо подати на вихід "E1" (відповідно до схеми підключений до 5 цифрового виходу) напруга 5В. Залежно від того, який рівень сигналу буде на виході «I1», змінюватиметься напрям обертання.

byte E1 = 5; // Управління швидкістю двигуна - підключення до 5 виходу

byte I1 = 4; // Управління напрямом обертання - підключення до 4 виходу

void setup()

{

pinMode (E1, OUTPUT); // Задаємо роботу відповідних пінів як виходи

pinMode (I1, OUTPUT);

digitalWrite (E1, HIGH); // На висновок ENABLE подано високий логічний рівень, двигун обертається на максимальній швидкості

digitalWrite (I1, HIGH); // На висновок I1 подано високий логічний рівень, двигун обертається в один бік

}

void loop()

{

}

Для зміни напрямку обертання – змінимо сигнал на виході I1. Для зупинки двигуна – подамо низьку напругу на вихід E1

byte E1 = 5; // Управління швидкістю двигуна– підключення до 5 виходу

byte I1 = 4; // Управління напрямом обертання - підключення до 4 виходу

void setup()

{

pinMode (E1, OUTPUT); // Задаємо роботу відповідних пінів як виходи

pinMode (I1, OUTPUT);

}

void loop()

{

digitalWrite (E1, HIGH); // На висновок ENABLE подано високий логічний рівень, двигун обертається на максимальній швидкості

digitalWrite (I1, HIGH); // На висновок I1 подано високий логічний рівень, двигун обертається в один бік

delay (2000); // Чекаємо 2 секунди

digitalWrite (I1, LOW); // На висновок I1 поданий низький логічний рівень, мотор обертається у зворотний бік

delay (2000); // Чекаємо ще 2 секунди

digitalWrite (E1, LOW); // На висновок E1 подано низький логічний рівень, двигун зупиняється

delay (2000); // Чекаємо ще 2 секунди

}

Результат - обертання двигуна в один бік протягом 2 секунд, зміна напрямок ще на дві секунди і зупинка на той же час. Потім цикл повторюється.

Тепер спробуємо регулювати швидкість. Контролер Arduino не може подавати на цифрові виходи довільну напругу (на те вони й цифрові, що у них лише два стани – HIGH (5 Вольт) та LOW (0 Вольт)). Проте ці стани він може перемикати дуже швидко (500 разів на секунду, а точніше, з частотою близько 490 Гц).

Значення напруга, регульованого за допомогою широтно-імпульсної модуляції, визначається співвідношенням часу, коли на вихід подається логічна одиниця (5 В) до часу, коли на вихід подано логічний нуль (0 В). Це значення називається «шпаруватістю»: 50% часу подається високий сигнал - відповідає підсумковій середній напрузі 2,5 В {{img|/src/arduino/PWM-50.png|intexttop|Стан цифрового виходу, який керується ШИМ зі шпаруватістю 50%.


25% часу подається високий сигнал - відповідає підсумковій середній напрузі 1,25 В {{img|/src/arduino/PWM-25.png|intexttop|Стан цифрового виходу, який управляється ШІМ зі шпаруватістю 25%} }


10% часу подається високий сигнал - відповідає підсумковій середній напрузі 0,5 В Стан цифрового виходу, який керується ШІМ зі шпаруватістю 10%} }%


Високий сигнал подається від 10% до 50% часу - відповідає плавному збільшенню напруги з 0,5 до 2,5 вольт {{img|/src/arduino/PWM-10to50.png | який управляється ШІМ зі шпаруватістю від 10 до 25%.

Показані графіки дають лише загальне уявлення, насправді частота перемикання настільки велика, що ми просто не зможемо побачити мерехтіння світлодіода або ривків двигуна, керованих ШИМ

Для того, щоб керувати висновком за допомогою ШІМ, він по-перше повинен це підтримувати (для UNO всі висновки, що підтримують ШІМ, позначені "~"). Для виведення потрібного значення використовуємо команду analogWrite(значення)Ми можемо подавати команду видати один із 255 рівнів (тобто 1 рівень – 0,019 вольта) Тобто команда analogWrite(5, 255) буде видавти на п'ятий пін 5 вольт (те ж саме, що і digitalWrite(5, HIGH)), analogWrite(5, 128) - дає нам 2.5 вольта, analogWrite(5, 25) - 0.5 вольта.

Тепер скористаємося ШИМ для керування двигуном:

byte E1 = 5; // Управління швидкістю двигуна - підключення до 5 виходу

byte I1 = 4; // Управління напрямом обертання - підключення до 4 виходу

void setup()

{

pinMode (E1, OUTPUT); // Задаємо роботу відповідних пінів як виходи

pinMode (I1, OUTPUT);

}

void loop()

{

analogWrite (E1, 255); // На виведенні ENABLE 5 вольт двигун обертається на максимальній швидкості

digitalWrite (I1, HIGH); // На висновок I1 подано високий логічний рівень, двигун обертається в один бік

delay (2000); // Чекаємо 2 секунди

analogWrite (E1, 128); // На виведенні ENABLE 2,5 вольт двигун обертається на половині максимальної швидкості

delay (2000); // Чекаємо ще 2 секунди

analogWrite (E1, 25); // На виведенні ENABLE 0,5 вольт двигун обертається на одній десятій від максимальної швидкості

delay (2000); // Чекаємо ще 2 секунди

}

Тепер двигун змінює свою швидкість у певні моменти часу. Зверніть увагу, що при спробі встановити дуже низьку швидкість обертання двигун може гудіти, але не рухатися з місця. Це пов'язано з тим, що напруги, що подається, просто недостатньо для того, щоб подолати сили тертя та інерцію ротора. Тому ми не можемо керувати двигуном на малих (близько 10-20% від максимуму) швидкостях.

Еще:

Программирование контроллеров – с чего начать (Программирование Arduino с нуля #1)
Плавный пуск двигателя постоянного тока с использованием таймеров (Arduino, использование двигателей постоянного тока #2)
Подключение периферии, платы расширения (Программирование Arduino с нуля #2)
Создание класса для работы с двигателем постоянного тока (Arduino, использование двигателей постоянного тока #3)
Организация питания для Arduino (Программирование Arduino с нуля #3)
Создание собственной библиотеки управления двигателем постоянного тока (Arduino, использование двигателей постоянного тока #4)
Подключаем сервопривод к Arduino (Программирование Arduino с нуля #4)
Создаем класс для управления сервоприводом (Программирование Arduino с нуля #6)
Подключение шагового двигателя. Контроллер L298 (Программирование Arduino с нуля #8)