Практичне програмування arduino

Настала пора Arduino покерувати моторчиками :)

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

L293D містить два драйвера для управління електродвигунами невеликої потужності. Має дві пари входів для керуючих сигналів і дві пари виходів для підключення електромоторів. Крім того, у L293D є два входи для включення кожного з драйверів. Ці входи використовуються для управління швидкістю обертання електромоторів за допомогою ШІМ (PWM).

Розглянемо блок-схему L293D, наведену в datasheet-е (нумерація для SO-корпусу):

Практичне програмування arduino

До виходів OUTPUT1 і OUTPUT2 підключається електромотор MOTOR1 (для мікросхеми в DIP-корпусі - ніжки 3 і 6).
Відповідно MOTOR2 підключається до виходів OUTPUT3 і OUTPUT4 (ніжки 11 і 14).

Сигнали, що подаються на ENABLE1 (2) керують відповідним драйвером (ніжки 1 і 9 відповідно).

Подаючи на вхід ENABLE1 сигнал HIGH (або просто з'єднавши з плюсом джерела живлення + 5V) - включаємо драйвер 1-го моторчика.
Якщо при цьому на входи INPUT1 і INPUT2 сигнали не подавати, то моторчик обертатися не буде.
Подаючи HIGH на INPUT1 і LOW на INPUT2 ми змусимо моторчик обертатися. А якщо тепер поміняти сигнали місцями і подавати на INPUT1 сигнал LOW, а на INPUT2 сигнал HIGH - ми змусимо моторчик обертатися в іншу сторону.

Аналогічно для другого драйвера.

Практичне програмування arduino

Вихід Vss (ніжка 16) відповідає за харчування самої мікросхеми, а вихід Vs (ніжка 8) відповідає за харчування моторчиков - це забезпечує поділ електроживлення для мікросхеми і для керованих нею двигунів, що дозволяє підключити електродвигуни з напругою живлення відмінним від напруги живлення мікросхеми. Поділ електроживлення мікросхем і електродвигунів також необхідно для зменшення перешкод, викликаних кидками напруги, пов'язаними з роботою моторів.

Чотири контакту GND (ніжки 4, 5, 12,13) ​​потрібно з'єднати із Землею. Так само ці контакти забезпечують тепловідвід від мікросхеми.

Якщо використовувати мікросхему L293E. то допустимий струм навантаження на кожен канал уже буде 1А (а піковий струм - 2А), але доведеться використовувати зовнішні захисні діоди, які у L293D вбудовані в саму мікросхему.

Спробуємо змоделювати як Arduino справляється з управлінням моторчиками :)

Запускаємо Proteus і відкриваємо проект з Arduino :)
Додамо на схему наш драйвер - L293D

З'єднаємо висновки Vss і Vs з позитивним полюсом батареї, висновки GND з'єднаємо з землею, а до висновків 3,6 і 11,14 подсоединим моторчики - відповідно MOTOR1 і MOTOR2.

Практичне програмування arduino

В реальній схемі - паралельно до моторчика потрібно припаяти конденсатор - він допомагає впоратися з наведеннями від працюючого електродвигуна (це поширена практика - розберіть будь-яку іграшку з моторчиком і побачите, що прямо до моторчика припаяний керамічний конденсатор номіналом десь в 0,1 мкф)

А як же поєднати входи драйверів? Для початку, подивимося - як взагалі це працює на практиці :)
Завантажимо в МК скетч Blink або Blink_HL, а далі, як показано на малюнку, з'єднаємо INPUT1 і ENABLE1 з digital pin 13, до якого підключений світлодіод, а INPUT2 з'єднаємо з землею. Запустимо симуляцію і побачимо, що моторчик одну секунду обертається в одну сторону, а потім зупиняється на секунду. Тобто отримали моторчіковий Blink :)

Отже, виходить, що для управління одним моторчиком потрібно три порти (один з них - PWM).
Якщо швидкістю обертання моторчика управляти не потрібно, то можна заощадити на PWM-портах (ENABLE1 і ENABLE2). Тоді, для управління одним моторчиком потрібно буде задіяти два порти.

Отже, визначимося з портами (в дужках - відповідний номер ніжки МК з pin mapping):

Змінимо наш проект в Proteus-е:

Практичне програмування arduino

А тепер напишемо скетч.

Для зручності - будемо зберігати номери портів не в звичайних змінних типу int, а об'єднаємо їх структурою:


проте, якщо просто оголосити таку структуру в коді скетчу, наприклад так:


Те при спробі скомпілювати - отримаємо помилку:

error: variable or field 'set_m_pins' declared void In function 'void setup ()':
- справа в тому, що додаткові структури даних повинні оголошуватися в заголовних (.h) файлах.
Тобто потрібно створити бібліотечний файл і підключитися його до скетчу директивою #include

Однак, тут компілятору не подобається саме звернення до нового типу даних за вказівником.


Три секунди обидва моторчика обертаються вперед, потім пів-секунди другої моторчик обертається назад, а потім знову вперед.

Практичне програмування arduino


А скетч тоді буде таким:

Функції обертання приймають два параметра - номер моторчика (1-2) і швидкість обертання (0-255). Якщо номер відрізняється від 1-2, то обертання задається відразу обом моторчикам.

У мене під рукою виявилася мікросхема L293E - тому необхідно використовувати захисні діоди (1N4007), яких для двох моторчиков потрібно аж 8 штук :)

Практичне програмування arduino

Так само у L293E не 16, а цілих 20 ніжок:

Практичне програмування arduino

Втім, для тестування можна зібрати схему тільки для одного моторчика;)

Практичне програмування arduino

Відповідно потрібно внести зміни в скетч:


- крутимо наш моторчик 3 секунди вперед, а потім одну секунду назад.

Практичне програмування arduino

крутиться :)

Знову натрапив на дане питання.
За Вашою схемою вище: чи можна замість резистора використовувати ШІМ відповідної скважности?

Тобто мотор на 1В, крона дає 9В. Запитай мотор відразу від крони (а не від 5В як на малюнку вище). Значить управляємо транзистором так:
analogWrite (motor, 28);

Поясню: 28 = 255/9 (тобто якби на транзистор подали шим зі значенням 255, на виході було б 9В, але нам треба 1В).

Як до подібних маніпуляцій поставиться обмотка двигуна?

Поясніть щодо обв'язки цієї микрухи? Для чого діоди? І ось вищезгадана TB6612FNG вимагає обв'язки?

Обв'язка для L293?
Якщо використовувати мікросхему L293E, то допустимий струм навантаження на кожен канал уже буде 1А (а піковий струм - 2А), але доведеться використовувати зовнішні захисні діоди, які у L293D вбудовані в саму мікросхему. Тобто для D - тільки кондери (не строго обов'язково). Діоди (як вбудовані так і зовнішні) потрібні для усунення викидів самоіндукції від мотора.
І по TB6612FNG начебто тільки кондери потрібні.

Спасибі, Zoltberg. Я вже розібрався.

скажіть, ось є мікросхема L293C, D типу не було в магазині, у С немає діодів внутрішніх, їх потрібно припаяти до висновків микрухи як на схемі у D? які діоди потрібні?

Ось так:

Практичне програмування arduino

Діоди, наприклад 1n4007 - оч. популярні =)

щиро дякую за відповідь!

Питання - а як можна контролювати моторчик по створюваної ним навантаженні? Тобто коли серво доїде «до упору» і навантаження підскочить, щоб харчування на нього автоматично відключалася. Девайс планується до використання у вуличних умовах, можливі лід, бруд і все таке, що може перешкодити серв рухатися, ось і хотілося б убезпечитися від цього ...

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

Практичне програмування arduino